|
板凳
楼主 |
发表于 2008-11-16 22:44:32
|
只看该作者
进入 main 后开始进行调试时,对应的代码为(调试环境为 VC6.0):
Quote:
[blockquote]int main(void)
{
00401020 push ebp ;每当进入一个函数时,对ebp保护是必须的,因为在后面的应用中,必须用到 ebp 来进行相对偏移寻址的操作
00401021 mov ebp,esp ;当前堆栈指针给 ebp
00401023 sub esp,4Ch ;堆栈指针减去 4ch,从原来的 esp 到 esp-4 ,开辟了一个空间(堆栈),供 func() 函数使用
00401026 push ebx
00401027 push esi
00401028 push edi ;进行相关寄存器的保护,因为后面需要用到这些寄存器
00401029 lea edi,[ebp-4Ch] ;取得新开辟堆栈的头地址并送往 EDI
0040102C mov ecx,13h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi] ;需要对新开辟栈中开始的 19 个字单元,即 19x4 个字节单元都填充CCH,初始化这部分堆栈
int a = 10;
00401038 mov dword ptr [ebp-4],0Ah ;a 变量属于 main 域,所以压入 main 的堆栈保存
int b = 20;
0040103F mov dword ptr [ebp-8],14h ;b 和 a 一样
int d; ;d 未初始化,故不需要压栈保存
d = func(a,b);
00401046 mov eax,dword ptr [ebp-8] ;从堆栈中取出b(从左到右取)存到 eax
00401049 push eax ;因为要传入 func 中,所以压入 func 的堆栈
0040104A mov ecx,dword ptr [ebp-4] ;取出a
0040104D push ecx ;入栈保存
0040104E call @ILT+5(_func) (0040100a) ;进入 func 函数,注意,执行call指令时,处理器会自动把 add esp,8 这条指令的地址(0x0040104D)入栈保存
00401053 add esp,8 ;平衡堆栈,这里esp调整到了b,a压栈参数的顶上,也就是说不再需要b,a两个参数
00401056 mov dword ptr [ebp-0Ch],eax
printf("%4d",d);
00401059 mov edx,dword ptr [ebp-0Ch]
0040105C push edx
0040105D push offset string "%4d" (0042201c)
00401062 call printf (004010e0)
00401067 add esp,8
return 0;
0040106A xor eax,eax
}[/blockquote] |
|