关于C代码在linux中的汇编分析

2 篇文章 0 订阅
1 篇文章 0 订阅

作者 水云青  

原创作品转载请注明出处

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000


基本的汇编知识:movl,subl,pushl,topl,ret,addl,leave,enter等


下面分析一个C程序来,阐述计算机是如何运行C语言的。

int g(int x)
    {
      return x + 20;
    }
     
    int f(int x)
    {
      return g(x);
    }
     
    int main(void)
    {
      return f(8) + 1;
    }

以下为其生成的汇编代码,以Linux 64位机器为例:

在linux终端输入命令:

gcc –S –o main.s main.c -m32

其中-m32指的是生成32位机器的汇编,32位和64位略有不同。

生成如图汇编代码,其中以点开头的汇编码不执行,图中略去了。


C语言的都是从mian函数开始运行的,同理,汇编也是从main函数开始运行的,下面我们来从main函数入手。

首先执行的是18行pushl指令,

先画出内存的栈此时的情况:esp和ebp此时都指向栈底。


pushl %ebx指令相当于

subl $4, %esp

movl %ebx,(%esp)

1. 执行pushl %ebx之后变为:




2. 执行movl %esp, %ebp


3.执行subl $4, %esp


4. movl $8, (%esp)


5. call f

call f等价于

pushl %eip(*)

movl f %eip


执行完毕后

6. pushl%ebp


7.movl  %esp, %ebp


8.subl  $4,%esp


9.movl  8(%ebp), %eax


10.movl  %eax, (%esp)


11.call  g


12. pushl  %ebp


13. movl  %esp, %ebp


14. movl  8(%ebp), %eax


15.  addl$20, %eax


16.popl  %ebp


17. ret



18. leave


19. ret


20. addl$1, %eax


21. leave


22. main函数运行结束,将exa的值返回,即29




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值