C++:从汇编角度详解函数调用栈

先来看一段代码:

int sum(int a, int b)
{
	int temp = 0;
	temp = a + b;
	return temp;
}
int main()
{
	int a = 10;
	int b = 20;

	int sum1 = sum(a, b);
	cout << sum;
	return 0;
}

有两个问题:
main函数调用sun,sum执行完之后怎么知道回到哪个函数?
sum函数执行完,回到main之后,怎么知道从哪一行指令继续运行?

我们现在从汇编角度看这段代码:
首先main还是会先开辟栈帧

mov         dword ptr [ebp - 4],0Ah  //int a = 10;
mov         dword ptr [ebp - 8],14h  //int b = 20;
mov         eax,dword ptr [ebp - 8]  
//esp存储main函数栈顶的地址 ebp存放main函数栈底地址
push        eax  
mov         ecx,dword ptr [ebp - 4]  
push        ecx  
call        sum (01181082h)  
//call指令有两个作用:调用函数;把下一条指令的地址压栈(即把add esp,8这条指令的地址压入栈中)
add         esp,8  
mov         dword ptr [sum1],eax 

在这里插入图片描述
在这里插入图片描述
下面就到sum函数了

push		ebp
mov			ebp,esp
sub			esp,4Ch
//上述这三行汇编代码其实就是函数左括号({)所对应的代码,这三行代码的作用其实就是为sum函数开辟栈帧
mov         dword ptr [temp],0 
//int temp = 0 
mov         eax,dword ptr [ebp + 8]  
//访问A
add         eax,dword ptr [ebp + OCh]  
//a+b
mov         dword ptr [temp],eax 
mov         eax,dword ptr [temp] 
//在return之后temp这个变量会被释放,所以把temp的值放在eax这个寄存器中
//**函数返回值如果小于等于四个字节,存放在EAX寄存器中,如果大于4小于8字节放在EAX和EBX,如果大于8字节,则产生一个临时量返回其地址
**
mov			esp,ebp
pop			ebp
ret
//ret的两种作用:结束调用;执行出栈操作,把主函数中调用指令的下一条指令的地址放入CPU的PC寄存器里面(PC寄存器存放CPU要执行吓一跳指令的地址)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值