自己动手构造编译系统:编译、汇编与链接1.3.3 汇编

简介:

1.3.3  汇编

  

            接着,GCC使用汇编器对hello.s进行汇编,命令如下:

$gcc –c hello.s –o hello.o

  生成的目标文件hello.o,Linux下称之为可重定位目标文件。目标文件无法使用文本编辑器直接查看,但是我们可以使用GCC自带的工具objdump命令分析它的内容,命令格式如下:

$objdump –sd hello.o

  输出目标文件的主要段的内容与反汇编代码如下:

  

hello.o:     file format elf32-i386

 

Contents of section .text:

 0000  5589e583  e4f083ec  10b80000  00008904  U...............

 0010  24e8fcff  ffffb800  000000c9  c3         $............  

Contents of section .rodata:

 0000  48656c6c  6f20576f  726c6421  00         Hello World!.  

Contents of section .comment:

 0000  00474343  3a202855  62756e74  752f4c69  .GCC: (Ubuntu/Li

 0010  6e61726f  20342e34  2e342d31  34756275  naro 4.4.4-14ubu

 0020  6e747535  2920342e  342e3500              ntu5) 4.4.5.   

 

Disassembly of section .text:

 

00000000 <main>:

    0:         55                            push          %ebp

    1:         89 e5                         mov           %esp,%ebp

    3:         83 e4 f0                       and      $0xfffffff0,%esp

    6:         83 ec 10                       sub      $0x10,%esp

    9:         b8 00 00 00 00                mov           $0x0,%eax

    e:         89 04 24                      mov           %eax,(%esp)

   11:        e8 fc ff ff ff               call       12 <main+0x12>

   16:        b8 00 00 00 00          mov          $0x0,%eax

   1b:        c9                            leave 

   1c:         c3                             ret   

  从数据段二进制信息的ASCII形式的显示中,我们看到了汇编语言内定义的字符串数据“Hello World !”。代码段的信息和汇编文件代码信息基本吻合,但是我们发现了很多不同之处。比如汇编文件内的指令“movl $.LC0, %eax”中的符号.LC0的地址(字符串“Hello World !”的地址)被换成了0。指令“call printf ”内符号printf的相对地址被换成了0xfffffffc,即call指令操作数部分的起始地址。

  这些区别本质来源于汇编语言符号的引用问题。由于汇编器在处理当前文件的过程中无法获悉符号的虚拟地址,因此临时将这些符号地址设置为默认值0,真正的符号地址只有在链接的时候才能确定。

相关文章
|
1月前
|
存储 自然语言处理 编译器
编译和链接(翻译环境:预编译+编译+汇编+链接​、运行环境)
编译和链接(翻译环境:预编译+编译+汇编+链接​、运行环境)
|
3月前
|
存储 缓存 Linux
C语言编译过程——预处理、编译汇编和链接详解
C语言编译过程——预处理、编译汇编和链接详解
|
11月前
|
C语言
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
|
11月前
|
编译器 C语言
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
|
11月前
|
存储 自然语言处理 程序员
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(一)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(一)
|
11月前
|
存储 Java C++
汇编语言、寄存器分类及程序计数器
汇编语言、寄存器分类及程序计数器
83 0
|
存储 API C语言
从反汇编看恶意程序的C语言结构(二)
从反汇编看恶意程序的C语言结构
93 0
|
存储 程序员
Win知识 - 程序是怎样跑起来的——汇编语言的语法是“操作码+操作数”
Win知识 - 程序是怎样跑起来的——汇编语言的语法是“操作码+操作数”
90 0
Win知识 - 程序是怎样跑起来的——汇编语言的语法是“操作码+操作数”
|
编译器 C语言 C++
Win知识 - 程序是怎样跑起来的——通过编译器输出汇编语言的源代码
Win知识 - 程序是怎样跑起来的——通过编译器输出汇编语言的源代码
200 0
|
编译器 C语言
Win知识 - 程序是怎样跑起来的——汇编语言和本地代码是一一对应的
Win知识 - 程序是怎样跑起来的——汇编语言和本地代码是一一对应的
111 0
Win知识 - 程序是怎样跑起来的——汇编语言和本地代码是一一对应的