| 
 | 
板凳
 
 
 楼主 |
发表于 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] |   
 
 
 
 |