美文网首页
汇编(一)汇编代码的产生方式

汇编(一)汇编代码的产生方式

作者: Gaolex | 来源:发表于2016-02-08 20:57 被阅读343次

    汇编

    希望大家喜欢,点赞哦
    在编译过程中,编译器会完成大部分工作。其中汇编代码非常接近于机器代码,是理解计算机如何人执行程序的关键一步。
    那么怎么产生汇编代码呢???书中讲了以下两种方法:
    首先,假设我们写了一个C语言代码文件 code.c ,包含的定义如下:

    int accum = 0;
    int sum(int x,int y)
    {
        int t = x + y;
        accum += t;
        return t;
    }
    

    一、在命令行上使用"-S"选项,得到汇编代码:

        gcc -O1 -S code.c
    

    此时会产生一个汇编文件code.s,但是不进一步工作。code.s文件内容如下:

          .file   "code.c"
           .text
           .globl  sum
           .type   sum, @function
       sum:
       .LFB0:
           .cfi_startproc
           leal    (%rdi,%rsi), %eax
           addl    %eax, accum(%rip)
          ret
          .cfi_endproc
      .LFE0:
          .size   sum, .-sum
          .globl  accum
          .bss
          .align 4
          .type   accum, @object
          .size   accum, 4
      accum:
          .zero   4
          .ident  "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4"
          .section    .note.GNU-stack,"",@progbits
    
    

    具体意思见后文。。。

    二、利用目标代码文件和反汇编器(disassember)

    首先我们产生目标代码文件code.o

        gcc -O1 -c code.c
    

    这个目标代码文件可用以下命令用反汇编器查看。

        objdump -d code.o
    

    执行后产生以下

    code.o:     文件格式 elf64-x86-64
    
    
    Disassembly of section .text:
    
    0000000000000000 <sum>:
       0:   8d 04 37                lea    (%rdi,%rsi,1),%eax
       3:   01 05 00 00 00 00       add    %eax,0x0(%rip)        # 9 <sum+0x9>
       9:   c3                      retq   
    

    对比发现,反汇编器省略了指令结尾的'l',这些后缀是大小指示符,在大多数情况下可以忽略。

    希望大家喜欢,点赞哦

    相关文章

      网友评论

          本文标题:汇编(一)汇编代码的产生方式

          本文链接:https://www.haomeiwen.com/subject/dvmykttx.html