函数调用堆栈

注:袁帅+ 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 

linux内核分析的第一课:函数调用堆栈的实现

使用下面的程序来进行分析,在实验楼的环境下操作:




下面是该程序的汇编代码,去掉了那些"."开头的符号,他们是连接器使用的:





,

每个程序的开头都是 pushl %ebp,movl %esp,%ebp,最后形成的堆栈帧如下图所示:



             



带“”的数字表示该行出的地址,可见,ebp一直都是指向上一个ebp的值,而esp指向栈顶,每次进行函数调用时,都会形成一个子函数的堆栈结构,具体形式见<程序员的自我>修养,里面由详细介绍。

leave指令相当于 movl %ebp,%esp,pop %ebp。从main开始,先将当前ebp值压栈,再让ebp = esp,然后把要传给f()的参数压栈,调用f(),又产生f()的栈帧,在调用g()之前讲参数压入堆栈,接着就是调用g()。当从g()中返回时,首先弹出ebp3指向的值到ebp寄存器,即esp = esp2,pc回到15行执行,执行leave指令,使esp = esp1,pc回到23行处执行,然后再次leave指令,esp = esp0,堆栈回到调用main之前的初始状态,整个调用过程结束。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南山墨客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值