为什么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
……

Posted on 2009-12-03 12:51 小鼬 阅读(1658) 评论(2)  编辑 收藏 引用 所属分类: 3.C/C++

Feedback

# re: 为什么VS监视的函数地址和输出的函数地址不同?  回复  更多评论   

2009-12-03 20:27 by zhaoyg
学习了

# re: 为什么VS监视的函数地址和输出的函数地址不同?  回复  更多评论   

2009-12-08 22:37 by 路过
正好在想这个问题~~

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理