函数调用过程(栈帧)的剖析和图解


栈用于维护函数调用的上下文,离开了栈,函数调用就无法实现,栈向低地址增长。在整个栈帧的调用过程中,栈顶由称为esp的寄存器定位,栈底由ebp进行定位


栈帧一般包括下面几方面的内容:

  • 函数返回地址的参数
  • 临时变量
  • 保存上下文–包括函数调用前需要保存不变的寄存器
  • 把参数压入栈中
  • 把当前指令的下一条地址压入栈中
  • 跳转到函数体执行
  • 把ebp压入栈(push ebp)
  • 让ebp指向栈顶(mov ebp,esp)
  • 恢复ebp同时回收局部变量空间(mov ebp,esp)
  • 从栈中恢复保存的ebp的值(pop ebp)
  • 从栈中取回返回地址,并跳转到该位置(ret)

我们通过一段简单的c语言程序 ,来简要的分析一下函数调用栈的详细情况:

#include<stdio.h>

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

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

在VC6.0编译器下,对代码进行反汇编,下面是整个过程的记录和解析:

建议在新标签页打开查看清晰图片
建议在新标签页打开看清晰图片

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值