函数名代表的内存地址转换成DWORD
#include <iostream>#include <windows.h>
void fuc(int a)
{
std::cout<<a<<"\n";
}
int main()
{
DWORD Fuc=(DWORD)fuc;//我想得到的是内存中函数的首地址
std::cout<<Fuc<<"\n";
return 0;
}汇编代码:
004015E8 mov dword ptr ,offset @ILT+520(fuc) (0040120d)
我想得到的是fuc所代表的函数首地址,但是强制转换后就不对了 求教啊~
没有人知道吗 郁闷唉:mad: 你是对的,但你在调试时看到地址是十六进制的,而在COUT时看到的是十进制的,不信可转换一下,如想显示一样的地址,试试下面这个:lol:#include <iostream>
#include <windows.h>
void fuc(int a)
{
std::cout<<a<<"\n";
}
int main()
{
fuc(6);
DWORD Fuc=(DWORD)fuc;//我想得到的是内存中函数的首地址
std::cout<<"0x"<<std::hex<<Fuc<<"\n";
return 0;
}
pzhccy 发表于 2014-2-10 18:31 static/image/common/back.gif
你是对的,但你在调试时看到地址是十六进制的,而在COUT时看到的是十进制的,不信可转换一下,如想显示一样 ...
不相同的 你把Fuc的值转换到十六进制 和鼠标移到fuc上提示的十六进制值是不一样的
我就郁闷了 编译了以后就会是@ILT+520(fuc)可是我要的是fuc的值…… 本帖最后由 pzhccy 于 2014-2-10 22:42 编辑
运行过程中调试,看那个地址,call 0x401334
下面是运行后,地址是一样的,不知道你要什么地址???
在VC查了一下,的确是有这个问题,这是编译器的问题么?真不知道,就差一步,JMP一下就到了
带参数的构造函数
我找到答案了,原来在调试模式下 会经过JMP跳转到函数入口,而在Release下这个值就是函数的入口地址了 _asm{
push ebx
Lea ebx,fuc
movFuc,ebx
pop ebx
}你试试把,不知到Lea可不可以取函数地址。
无名侠 发表于 2014-2-11 21:03 static/image/common/back.gif
你试试把,不知到Lea可不可以取函数地址。
调试模式下取到的还是JMP fuc的地址 不过没关系了 在发布模式下编译的能取到正确地址 谢谢你的热心帮助!
页:
[1]