C++函数堆栈调用

1.函数实参怎么传给形参?形参有没有开辟内存?如果形参开辟内存,在哪里开辟的?
2.函数的返回值怎么返回到调用方函数?
3.函数返回后怎么知道从哪条语句开始继续执行?

首先看一段简单的代码:
在这里插入图片描述
首先来看下在调用点的汇编指令

rt = sum(a1,b1);
0040108D mov eax,dword ptr [ebp-8]
00401090 push eax
00401091 mov ecx,dword ptr [ebp-4]
00401094 push ecx
00401095 call @ILT+0(sum) (00401005)
0040109A add esp,8
0040109D mov dword ptr [ebp-0Ch],eax

call指令在调用时有两步:
1.压入下一行指令地址 0040109A
2.jmp跳转到sum函数栈帧中

下面是进入sum函数栈帧前的main函数的栈帧布局
在这里插入图片描述
可以看到形参变量a,b开辟了内存空间,是在调用方开辟的。
再看下进入sum函数后栈帧布局
在这里插入图片描述
函数退栈
在这里插入图片描述
return后返回值赋给了eax寄存器,由eax寄存器带回main函数赋给rt。
紧接着出栈了sum函数栈顶的三个寄存器。
然后看 mov esp,ebp这条指令,这条指令将esp指向的地址指向了ebp指向的地址。这条指令就是将开始进入sum函数开辟的一些内存“清理”掉了。
接下来pop ebp这条指令,是将当前栈顶的数据出栈并赋给ebp。现在当前栈顶的数据是main函数的栈底地址。也就是sum函数调用完成后能返回到main函数栈帧上来。
最后执行ret指令,这个过程中执行了一个pop指令,将当前栈顶的数据出栈并赋给下一行指令寄存器。当前的栈底数据是main函数调用sum函数的call指令的下一条指令地址。也就是add esp,8这条指令的地址0040109A。回到main函数后就可以接着下一条指令继续执行。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值