|
|
1鱼币
本帖最后由 付笑 于 2012-11-24 21:44 编辑
#include<stdio.h>
int fun();
int main()
{
void *p;
p=fun;
fun();
printf("%d\n",p);
return 0;
}
int fun()
{
return 0;
}
问个问题,输出函数fun的指针p的值是4198405
但调试时fun的地址却是在00401090
请问这是怎么回事
下面是反汇编的代码
15:
16: int fun()
17: {
00401090 push ebp 这里是函数开始的地址 和上面输出的P值为什么不一样呢
00401091 mov ebp,esp
00401093 sub esp,40h
00401096 push ebx
00401097 push esi
00401098 push edi
00401099 lea edi,[ebp-40h]
0040109C mov ecx,10h
004010A1 mov eax,0CCCCCCCCh
004010A6 rep stos dword ptr [edi]
18: return 0;
004010A8 xor eax,eax
19: }
|
最佳答案
查看完整内容
你编译的时候用的debug版本编译的吧? debug版本编译的程序函数调用都是通过跳转表调用的。
你的call 的地址是 jmp的地址, jmp才跳到函数真正入口处。所以你打印的p的值是jmp的地址 不是函数的真正入口。
要知道原理,就从调用函数的地方,单步跟踪下,看反汇编代码 就很清楚
|