为什么VS监视的函数地址和输出的函数地址不同?
#include<iostream>
using namespace std;
void gf(){ cout<<"::gf()"; }
typedef void(*F)();
int main()
{
gf();
F f=gf;
printf("%p \n",f);//输出的是00434F55
system("pause");
}
VS2005下断点,添加监视:
为什么输出的函数地址和VS监视到的不同?
答:输出的是跳转指令的地址,监视到的是函数地址.
两条指令紧挨着执行,一般输出的都是跳转表的地址,而不是函数的绝对地址
以下是VS下断点后,调试/窗口/反汇编 显示的汇编代码:
……
;跳转表: (本行是本人加的)
std::locale::id::operator unsigned int:
00434F50 jmp std::locale::id::operator unsigned int (43D8F0h)
gf:
00434F55 jmp gf (4377C0h)
DName::isValid:
00434F5A jmp DName::isValid (4845D0h)
……
void gf(){ cout<<"::gf()"; }
004377C0 push ebp
004377C1 mov ebp,esp
……
gf();
0043783E call gf (434F55h)
F f=gf;
00437843 mov dword ptr [f],offset gf (434F55h)
……
system("pause");
0043785B push offset string "pause" (4A2098h)
00437860 call @ILT+2850(_system) (434B27h)
00437865 add esp,4
……