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

汇编(一)汇编代码的产生方式_第1张图片
汇编

希望大家喜欢,点赞哦
在编译过程中,编译器会完成大部分工作。其中汇编代码非常接近于机器代码,是理解计算机如何人执行程序的关键一步。
那么怎么产生汇编代码呢???书中讲了以下两种方法:
首先,假设我们写了一个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 :
   0:   8d 04 37                lea    (%rdi,%rsi,1),%eax
   3:   01 05 00 00 00 00       add    %eax,0x0(%rip)        # 9 
   9:   c3                      retq   

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

希望大家喜欢,点赞哦

你可能感兴趣的:(汇编(一)汇编代码的产生方式)