多函数压栈过程-参数总是在call后立即恢复

来源:互联网 发布:新店淘宝客 编辑:程序博客网 时间:2024/04/27 23:24

所以如果是值传递,函数调用后,值是不变的。因为函数里的参数在在调用时刻前压栈,然后对其修改,而call函数调用后,又恢复的。

所以没有对之前临时变量做任何改变。

改变的只是压栈的另一份拷贝变量,该份拷贝在调用后又恢复了。没有给实际的参数造成实际的改变。

3:    void foo(int a,int b)
4:    {
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,40h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-40h]
0040102C   mov         ecx,10h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
5:
6:        printf("%d %d\n",a,b);
00401038   mov         eax,dword ptr [ebp+0Ch]
0040103B   push        eax
0040103C   mov         ecx,dword ptr [ebp+8]
0040103F   push        ecx
00401040   push        offset string "%d %d\n" (0042201c)
00401045   call        printf (00401100)
0040104A   add         esp,0Ch
7:    }

9:    int main()
10:   {
00401080   push        ebp
00401081   mov         ebp,esp
00401083   sub         esp,48h
00401086   push        ebx
00401087   push        esi
00401088   push        edi
00401089   lea         edi,[ebp-48h]
0040108C   mov         ecx,12h
00401091   mov         eax,0CCCCCCCCh
00401096   rep stos    dword ptr [edi]
11:       int a = 2;
00401098   mov         dword ptr [ebp-4],2
12:       int b =2;
0040109F   mov         dword ptr [ebp-8],2
13:       foo(a,b);
004010A6   mov         eax,dword ptr [ebp-8]
004010A9   push        eax
004010AA   mov         ecx,dword ptr [ebp-4]
004010AD   push        ecx
004010AE   call        @ILT+5(foo) (0040100a)
004010B3   add         esp,8----------------------------------恢复
14:       printf("%d %d",a,b);
004010B6   mov         edx,dword ptr [ebp-8]
004010B9   push        edx
004010BA   mov         eax,dword ptr [ebp-4]
004010BD   push        eax
004010BE   push        offset string "%d %d" (00422024)
004010C3   call        printf (00401100)
004010C8   add         esp,0Ch------------------------------恢复
15:       return 0;
004010CB   xor         eax,eax
16:   }