描述函数栈帧的调用过程

这次我们通过例子来研究调用过程:

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

CPU含有两个寄存器:eax,edx
返回值字节:
1. <=4 用eax返回
2. 4-8 用eax和edx返回
3. >8 用临时量返回
1、我们先运行主函数,那么就有主函数的栈:

函数栈的变化
main函数的栈开辟出来为黑色区域,设定栈底指针ebp指向0x100
①在栈底压栈a,压栈b。
②在调用sum时需要在栈顶压栈sum的形参,压栈从右向左压栈。
③压完形参后需要记录现在运行到哪一步指令的信息,于是在栈底压入call下一行指令的地址。
2、这时就进入了sum函数的栈红色区域:
①在进入时需要保存调用sum函数的函数地址在,于是将main函数的ebp压栈,即sum函数的栈底保存0x100。
②这时要给sum栈开辟大小,调整esp和ebp的位置,将ebp指向sum函数的栈底。
③将esp减去4ch,表示开出4ch大小的函数空间。
④将开出的空间初始化,变为0xcccccccc。
①②③④是sum函数中的: {
⑤现在可以运行sum函数的代码,将temp压栈,并将其赋值为0.
⑥要运算 temp = a + b;需要将a的形参值放到寄存器eax中,ebp+8就指向形参a。
⑦ebp+12指向形参b,将形参b带去eax中然后让a和b相加。4
⑧将加的值通过eax带出给temp。
⑨运行return temp,由于temp为四字节,所以通过eax返回,所以讲temp的值放入寄存器eax中,然后返回。
⑤⑥⑦⑧⑨为sum中的代码时的步骤
sum return之后:
⑩释放掉sum函数的内存,即移动ebp和esp,让ebp = esp。
1.这时要回到main函数中,于是pop ebp,找到主函数的地址,回到了主函数,继续pop ebp找到下一行指令地址,将下一行指令地址存到寄存器中。
2.回到了int ret = sum(a,b);中,将返回值eax复制给ret,雨水栈帧结束。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值