【C语言】——函数栈帧的创建和销毁(重要)

用以下代码来观察函数栈帧的创建和销毁

int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}

int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	c = Add(a, b);
	printf("%d", c);
	return 0;
}

分析情况如下图:

 对应的汇编代码如下:

main函数对应的汇编代码

int main()
{
001C18B0  push        ebp  
001C18B1  mov         ebp,esp  
001C18B3  sub         esp,0E4h  
001C18B9  push        ebx  
001C18BA  push        esi  
001C18BB  push        edi  
001C18BC  lea         edi,[ebp-24h]  
001C18BF  mov         ecx,9  
001C18C4  mov         eax,0CCCCCCCCh  
001C18C9  rep stos    dword ptr es:[edi]  
001C18CB  mov         ecx,1CC003h  
001C18D0  call        001C131B  
	int a = 10;
001C18D5  mov         dword ptr [ebp-8],0Ah  
	int b = 20;
001C18DC  mov         dword ptr [ebp-14h],14h  
	int c = 0;
001C18E3  mov         dword ptr [ebp-20h],0  
	c = Add(a, b);
001C18EA  mov         eax,dword ptr [ebp-14h]  
001C18ED  push        eax  
001C18EE  mov         ecx,dword ptr [ebp-8]  
001C18F1  push        ecx  
001C18F2  call        001C10B4  
001C18F7  add         esp,8  
001C18FA  mov         dword ptr [ebp-20h],eax  
	printf("%d", c);
001C18FD  mov         eax,dword ptr [ebp-20h]  
001C1900  push        eax  
001C1901  push        1C7B30h  
001C1906  call        001C10D2  
001C190B  add         esp,8  
	return 0;
001C190E  xor         eax,eax  
}
001C1910  pop         edi  
001C1911  pop         esi  
001C1912  pop         ebx  
001C1913  add         esp,0E4h  
001C1919  cmp         ebp,esp  
001C191B  call        001C1244  
001C1920  mov         esp,ebp  
001C1922  pop         ebp  
001C1923  ret  

Add函数对应的汇编代码

int Add(int x, int y)
{
001C1770  push        ebp  
001C1771  mov         ebp,esp  
001C1773  sub         esp,0CCh  
001C1779  push        ebx  
001C177A  push        esi  
001C177B  push        edi  
001C177C  lea         edi,[ebp-0Ch]  
001C177F  mov         ecx,3  
001C1784  mov         eax,0CCCCCCCCh  
001C1789  rep stos    dword ptr es:[edi]  
001C178B  mov         ecx,1CC003h  
001C1790  call        001C131B  
	int z = 0;
001C1795  mov         dword ptr [ebp-8],0  
	z = x + y;
001C179C  mov         eax,dword ptr [ebp+8]  
001C179F  add         eax,dword ptr [ebp+0Ch]  
001C17A2  mov         dword ptr [ebp-8],eax  
	return z;
001C17A5  mov         eax,dword ptr [ebp-8]  
}
001C17A8  pop         edi  
001C17A9  pop         esi  
001C17AA  pop         ebx  
001C17AB  add         esp,0CCh  
001C17B1  cmp         ebp,esp  
001C17B3  call        001C1244  
001C17B8  mov         esp,ebp  
001C17BA  pop         ebp  
001C17BB  ret

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

待己以诚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值