C程序汇编运行模式简析
作者:网络转载 发布时间:[ 2015/3/9 14:33:30 ] 推荐标签:C 程序 堆栈
3.汇编代码分析
汇编出的代码,多了很多辅助信息,为了能够更好地看清主干,我们删减一下:
1 g:
2 pushl %ebp //保存现场,将父函数的栈底寄存器存入当前程序栈中
3 movl %esp, %ebp //构建当前函数堆栈
4 movl 8(%ebp), %eax //从父函数堆栈中取得参数,存入ax寄存器
5 addl $3, %eax //完成+3操作
6 popl %ebp //恢复原父函数堆栈
7 ret //pop出原EIP地址,恢复执行
8 f:
9 pushl %ebp //保存现场,将父函数的栈底寄存器存入当前程序栈中
10 movl %esp, %ebp //构建当前函数堆栈
11 subl $4, %esp //栈顶加一,用以储存变量传递给g函数
12 movl 8(%ebp), %eax //取得参数
13 movl %eax, (%esp) //将参数传入变量位置
14 call g //调用g
15 leave //清楚局部变量空间
16 ret //返回
17 main:
18 pushl %ebp
19 movl %esp, %ebp
20 subl $4, %esp //空出局部变量空间
21 movl $8, (%esp) //为变量赋值
22 call f //调用f
23 addl $1, %eax //完成+1操作
24 leave //清理局部变量
25 ret //返回
我们对f函数进行详细的分析:
1. 首先进行enter指令:
此时,ebp当前所指向的位置存入栈顶,并且将ebp重定向指向esp:
2.栈顶加一并存入变量值:
3.调用g
4.从g返回后,返回值储存在AX寄存器中,不用操作,调用leave,清理变量
5.后ret,同时EIP被读出恢复到原位置继续执行,返回值在AX中传递给调用函数
3.个人的一点感悟:
程序的调用是这样嵌套的执行下去,每个函数都有自己的堆栈用以储存当前变量以及环境值,并通过将父函数的EBP放入栈底用以恢复环境。
同时EIP存入父栈栈顶,便于恢复到原节点处继续执行。
这样,可以有规律的一直嵌套下去。
如果使用递归函数,是一个码堆栈的过程,知道顶部的堆栈返回,函数像多米诺骨牌一样收回所有的堆栈。
这也是递归函数占用空间比较多的原因之一。如果没有很好地退出机制,有可能内存溢出。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
TC测试管理工具使用常见问题汇总及解决办法(十一)TC测试管理工具使用常见问题汇总及解决办法(十)TC测试管理工具使用常见问题汇总及解决办法(九)TC测试管理工具使用常见问题汇总及解决办法(八)TC测试管理工具使用常见问题汇总及解决办法(七)TC测试管理工具使用常见问题汇总及解决办法(六)TC测试管理工具使用常见问题汇总及解决办法(五)软件测试管理工具TC如何进行场景设计?TC测试管理工具使用常见问题汇总及解决办法(四)TC测试管理工具使用常见问题汇总及解决办法(三)测试管理工具TC使用常见问题汇总及解决办法(二)测试管理工具TC使用常见问题汇总及解决办法RPA的POC阶段究竟应该做些什么?RPA的替换成本高吗?测试管理工具TC数据库报错的原因有哪些?怎么解决?使用测试管理工具TC时Tomcat启动成功了却运行失败的原因有哪些?自动化测试工具AR校验功能:校验excel表
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南