函数调用入栈出栈分析

       先来看一个简单的程序:

int func(int a, int b)
{
        int c = 7;
		c = a + b;
		return c;
}

int main()
{
		int x = 10;
		int y = 20;
        int z = 15;
		z = func(x, y);
 
        return 0; 
}

        在VC++6.0下,它对应的汇编代码为:

--- C:\Users\Administrator\Desktop\CPP\test.cpp  ----------------------------------------------------------------------------------------------------------
1:    int func(int a, int b)
2:    {
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,44h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-44h]
0040102C   mov         ecx,11h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
3:            int c = 7;
00401038   mov         dword ptr [ebp-4],7
4:            c = a + b;
0040103F   mov         eax,dword ptr [ebp+8]
00401042   add         eax,dword ptr [ebp+0Ch]
00401045   mov         dword ptr [ebp-4],eax
5:            return c;
00401048   mov         eax,dword ptr [ebp-4]
6:    }
0040104B   pop         edi
0040104C   pop         esi
0040104D   pop         ebx
0040104E   mov         esp,ebp
00401050   pop         ebp
00401051   ret
--- No source file  ---------------------------------------------------------------------------------------------------------------------------------------
00401052   int         3
00401053   int         3
00401054   int         3
00401055   int         3
00401056   int         3
00401057   int         3
00401058   int         3
00401059   int         3
0040105A   int         3
0040105B   int         3
0040105C   int         3
0040105D   int         3
0040105E   int         3
0040105F   int         3
--- C:\Users\Administrator\Desktop\CPP\test.cpp  ----------------------------------------------------------------------------------------------------------
7:
8:    int main()
9:    {
00401060   push        ebp
00401061   mov         ebp,esp
00401063   sub         esp,4Ch
00401066   push        ebx
00401067   push        esi
00401068   push        edi
00401069   lea         edi,[ebp-4Ch]
0040106C   mov         ecx,13h
00401071   mov         eax,0CCCCCCCCh
00401076   rep stos    dword ptr [edi]
10:           int x = 10;
00401078   mov         dword ptr [ebp-4],0Ah
11:           int y = 20;
0040107F   mov         dword ptr [ebp-8],14h
12:           int z = 15;
00401086   mov         dword ptr [ebp-0Ch],0Fh
13:           z = func(x, y);
0040108D   mov         eax,dword ptr [ebp-8]
00401090   push        eax
00401091   mov         ecx,dword ptr [ebp-4]
00401094   push        ecx
00401095   call        @ILT+0(func) (00401005)
0040109A   add         esp,8
0040109D   mov         dword ptr [ebp-0Ch],eax
14:
15:           return 0;
004010A0   xor         eax,eax
16:   }
004010A2   pop         edi
004010A3   pop         esi
004010A4   pop         ebx
004010A5   add         esp,4Ch
004010A8   cmp         ebp,esp
004010AA   call        __chkesp (004010d0)
004010AF   mov         esp,ebp
004010B1   pop         ebp
004010B2   ret

        单步调试了一下, 有不少收获和认识, 有兴趣的朋友, 也调试一下, 看看内存和寄存器的变化。


       下面顺便附上一张网上的图, 跟我单步调试的结果一样:


      不多说。



扫描二维码关注公众号,回复: 1008461 查看本文章

     

猜你喜欢

转载自blog.csdn.net/stpeace/article/details/80145613
今日推荐