汇编代码的简单分析

  • 内容说明

    本次的内容,是一次 MOOC 课程的作业。具体的,是在 Linux 下对一段简单的 C 代码生成的汇编代码进行分析,进而了解计算机、CPU 的工作机制。

  • 作业声明

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

    • 环境
      Linux
      需要介绍一下的是本次 MOOC 提供的实验楼的环境,可以直接访问 Linux 的环境,一系列操作也十分简单,十分赞!
    • 源码
      main.c
int func_a(int x)
{
  return x + 1000;
}

int func_b(int x)
{
  return func_a(x);
}

int main(void)
{
  return func_b(8) + 1;
}
  • 生成汇编指令
$ gcc –S –o main.s main.c -m32
  • 生成如下
    .file   "main.c"
    .text
    .globl  func_a
    .type   func_a, @function
func_a:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    movl    8(%ebp), %eax
    addl    $1000, %eax
    popl    %ebp
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size   func_a, .-func_a
    .globl  func_b
    .type   func_b, @function
func_b:
.LFB1:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $4, %esp
    movl    8(%ebp), %eax
    movl    %eax, (%esp)
    call    func_a
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE1:
    .size   func_b, .-func_b
    .globl  main
    .type   main, @function
main:
.LFB2:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $4, %esp
    movl    $8, (%esp)
    call    func_b
    addl    $1, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE2:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
    .section    .note.GNU-stack,"",@progbits

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值