函数调用返回与栈帧空间开辟回收

本文通过一个简单的C语言程序实例,详细解析了函数调用过程中的堆栈空间变化情况,包括变量分配、参数传递及返回值处理等关键步骤,并展示了对应的反汇编代码。

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


写一段简单的代码

include<stdio.h>

int Sum(int a, int b)
{
    int ret = a + b;
    return ret;
}

int main()
{
    int a = 3;
    int b = 5;
    int sum = 0;
    sum = Sum(a, b);
    return 0;
}

在vs2013下编译,反汇编与寄存器地址与内容变化,从中可以看出函数调用过程中堆栈空间变化。


反汇编 ebp esp 其他  
地址 内容 地址 内容 地址 内容
0x00AFF780 88 f7 af 00 0x00AFF734 99 19 bd 00 <-按F10后ebp和esp的起始位置
push        ebp     0x00AFF730 80 f7 af 00    
mov         ebp,esp 0x00AFF730 80 f7 af 00        
sub         esp,0E4h     0x00AFF64C 3d 5a f2 0f    
push        ebx     0x00AFF648 00 e0 9d 00 ebx  0x009DE000 00 00 01 04
push        esi     0x00AFF644 09 11 bd 00 esi  0x00BD1109 e9 72 0a 00
push        edi     0x00AFF640 09 11 bd 00 edi  0x00BD1109 e9 72 0a 00
lea         edi,[ebp-0E4h]         edi  0x00AFF64C 3d 5a f2 0f
mov         ecx,39h         ecx  0x00000039 ?? ?? ?? ??
mov         eax,0CCCCCCCCh         eax  0xCCCCCCCC ?? ?? ?? ??
rep stos    dword ptr es:[edi]  0x00AFF64C  开始到  0x00AFF72C  初始化为  cc cc cc cc
int a = 3;    
mov         dword ptr [a],3         0x00AFF728 03 00 00 00
int b = 5;    
 mov         dword ptr [b],5         0x00AFF71C 05 00 00 00
int sum = 0;    
mov         dword ptr [sum],0         0x00AFF710 00 00 00 00
mov         eax,dword ptr [b]         eax  0x00000005 ?? ?? ?? ??
push        eax     0x00AFF63C 05 00 00 00    
mov         ecx,dword ptr [a]         ecx  0x00000003 ?? ?? ?? ??
push        ecx     0x00AFF638 03 00 00 00    
call        _Sum (011B11EFh) jmp         Sum (0BD3C30h)
push        ebp     0x00AFF630 30 f7 af 00    
mov         ebp,esp 0x00AFF630 30 f7 af 00        
sub         esp,0CCh     0x00AFF564 62 00 00 40    
push        ebx     0x00AFF560 00 e0 9d 00 ebx  0x009DE000 00 00 01 04
push        esi     0x00AFF55C 09 11 bd 00 esi  0x00BD1109 e9 72 0a 00
push        edi     0x00AFF558 30 f7 af 00 edi  0x00AFF730 80 f7 af 00
lea         edi,[ebp-0CCh]         edi  0x00AFF564 62 00 00 40
mov         ecx,33h         ecx  0x00000039 ?? ?? ?? ??
mov         eax,0CCCCCCCCh         eax  0xCCCCCCCC ?? ?? ?? ??
rep stos    dword ptr es:[edi]  0x00AFF564  开始到  0x00AFF62C  初始化为  cc cc cc cc
int ret = a + b;
mov         eax,dword ptr [a]         eax  0x00000003 ?? ?? ?? ??
add         eax,dword ptr [b]         eax  0x00000008 ?? ?? ?? ??
mov         dword ptr [ret],eax         0x00AFF628 08 00 00 00
return ret;
mov         eax,dword ptr [ret]         eax  0x00000008 ?? ?? ?? ??
pop         edi     0x00AFF55C 09 11 bd 00 edi  0x00AFF730 80 f7 af 00
pop         esi     0x00AFF560 00 e0 9d 00 esi 0x00BD1109 e9 72 0a 00
pop         ebx     0x00AFF564 cc cc cc cc ebx  0x009DE000 00 00 01 04
mov         esp,ebp     0x00AFF630 30 f7 af 00    
pop         ebp 0x00AFF730 80 f7 af 00 0x00AFF634 80 1a bd 00    
ret     0x00AFF628 03 00 00 00    
add         esp,8     0x00AFF640 09 11 bd 00    
mov         dword ptr [sum],eax         0x00AFF628 08 00 00 00
return 0;  
xor         eax,eax         eax  0x00000000 ?? ?? ?? ?? 
pop         edi     0x00AFF644      
pop         esi     0x00AFF648      
pop         ebx     0x00AFF64C      
add         esp,0E4h     0x00AFF730      
cmp         ebp,esp            
call        __RTC_CheckEsp (0BD113Bh)            
mov         esp,ebp            
pop         ebp            
ret            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值