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

本文详细解析了函数调用过程中的参数传递机制,解释了局部变量在函数调用前后的变化情况,以及如何理解参数在堆栈上的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所以如果是值传递,函数调用后,值是不变的。因为函数里的参数在在调用时刻前压栈,然后对其修改,而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:   }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值