飞蛤 发表于 2014-2-10 15:46:08

函数名代表的内存地址转换成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所代表的函数首地址,但是强制转换后就不对了 求教啊~

飞蛤 发表于 2014-2-10 16:39:05

没有人知道吗 郁闷唉:mad:

pzhccy 发表于 2014-2-10 18:31:33

你是对的,但你在调试时看到地址是十六进制的,而在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;
}

飞蛤 发表于 2014-2-10 20:58:16

pzhccy 发表于 2014-2-10 18:31 static/image/common/back.gif
你是对的,但你在调试时看到地址是十六进制的,而在COUT时看到的是十进制的,不信可转换一下,如想显示一样 ...

不相同的 你把Fuc的值转换到十六进制 和鼠标移到fuc上提示的十六进制值是不一样的
我就郁闷了 编译了以后就会是@ILT+520(fuc)可是我要的是fuc的值……

pzhccy 发表于 2014-2-10 22:41:44

本帖最后由 pzhccy 于 2014-2-10 22:42 编辑

运行过程中调试,看那个地址,call 0x401334

下面是运行后,地址是一样的,不知道你要什么地址???





pzhccy 发表于 2014-2-10 23:53:59

在VC查了一下,的确是有这个问题,这是编译器的问题么?真不知道,就差一步,JMP一下就到了



网络学习 发表于 2014-2-11 00:32:28

带参数的构造函数

飞蛤 发表于 2014-2-11 20:54:10

我找到答案了,原来在调试模式下 会经过JMP跳转到函数入口,而在Release下这个值就是函数的入口地址了

无名侠 发表于 2014-2-11 21:03:18

_asm{
push ebx
Lea ebx,fuc
movFuc,ebx
pop ebx
}你试试把,不知到Lea可不可以取函数地址。

飞蛤 发表于 2014-2-12 11:28:15

无名侠 发表于 2014-2-11 21:03 static/image/common/back.gif
你试试把,不知到Lea可不可以取函数地址。

调试模式下取到的还是JMP fuc的地址 不过没关系了 在发布模式下编译的能取到正确地址 谢谢你的热心帮助!
页: [1]
查看完整版本: 函数名代表的内存地址转换成DWORD