通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

原创作品转载请注明出处 + 《Linux内核分析》MOOC课程Linux内核分析 - 网易云课堂

实验源码:

通过gcc -S -o main.s main.c -m32将C语言反汇编,然后再将反汇编代码中以点开头的行给删除,方便浏览,结果如下

其中 -S :表示生成汇编代码,-m32 :表示生成32位格式

分析汇编代码:

1,程序执行的入口是main函数,先将栈基指针压栈,再将栈基指针指向栈顶,为了保存当前堆栈基址,并开始一个新的栈,每个函

数就有独立的栈空间。当函数返回时,能恢复到之前的栈空间。

2,然后将参数压栈。由于堆栈是由高地址向低地址扩充,向下增长的,所以在32位机中入栈是堆栈顶指针减4。

3,调用 call 命令,跳转到函数 f 。call指令等同于pushl %eip,movl f, %eip,将下一条指令入栈后,再将寄存器 eip 的值赋

为目标函数 f 的第一条指令地址。这么做是为了当被调用的函数执行结束后,需要返回当前函数继续执行。

4,接着执行函数f,先将栈基指针入栈,再开辟新的一段函数堆栈,subl $4,%esp将栈顶指针向下减4,再调用上一个函数的参

数,放入eax中,再入栈。

5,g函数进入过程和f函数类似,leave过程等于movl %ebp,%esp,popl %ebp,等于释放掉这一段函数的调用堆栈。

6,ret等于popl %eip,返回需要执行的下一条指令的位置。

总结:

1,计算机通过eip来定位需要执行的下一条指令的位置。

2,堆栈是向下增长,入栈操作esp会先减4,再传值;出栈时先传值,esp再加4。

3,进入或离开一个函数时,会建立或撤销函数调用堆栈。

4,被调用函数执行时,要将当前栈基地址压栈,以便调用结束后能恢复到调用函数栈空间。

5,函数的返回值默认使用eax来返回给上级函数。

6,函数退出时,将 esp 赋值为 ebp,释放当前函数所使用的栈空间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值