自己动手构造编译系统:编译、汇编与链接2.4.3 指令生成

简介:

2.4.3  指令生成

       


      2.2节介绍了x86指令的基本结构。同样,在汇编器语法分析时,需要根据指令的语法模块收集这些指令的结构信息。比如操作码、ModR/M字段、SIB字段、偏移量、立即数,然后按照指令的结构将上述信息写入文件即可。

  首先,指令名和操作码一般是一对多的关系,因此需要根据具体的操作数类型或长度来决定操作码的值。按照操作数不同建立一张指令的操作码表来执行操作码的查询是一种有效的解决方案。

  其次,有些指令的ModR/M字段的reg部分与操作码有关,但不需要输出ModR/M字段,汇编器需要单独处理这些特殊的指令操作码。另外,ModR/M字段中包含是否扩展了SIB字段的信息。

  除了正确输出指令的二进制信息外,汇编器在遇到对符号引用的指令时还要记录相关重定位信息,比如重定位地址、重定位符号、重定位类型等。

  最后,参考之前介绍的ELF文件结构,汇编器将收集到的段信息和二进制数据组装到目标文件内。

  至此,根据已描述的汇编器主要工作流程,可以生成标准的ELF可重定位目标文件。那么,如何把这些分散的目标文件合并成我们最终想要的可执行文件,便是接下来要介绍的链接器的工作内容。

相关文章
|
2月前
|
存储 自然语言处理 编译器
编译和链接(翻译环境:预编译+编译+汇编+链接​、运行环境)
编译和链接(翻译环境:预编译+编译+汇编+链接​、运行环境)
|
7天前
|
存储 C++
C/C++中的整数除法运算与汇编指令DIV和IDIV
C/C++中的整数除法运算与汇编指令DIV和IDIV
15 1
|
7天前
|
存储 安全 程序员
C/C++中的整数乘法运算与汇编指令MUL和IMUL
C/C++中的整数乘法运算与汇编指令MUL和IMUL
11 0
|
7天前
|
编译器 C++
C/C++中的逻辑运算与汇编指令的交互
C/C++中的逻辑运算与汇编指令的交互
8 0
|
7天前
|
编译器 程序员 C++
C/C++逻辑与运算与汇编指令的关系
C/C++逻辑与运算与汇编指令的关系
13 0
|
7天前
|
程序员
汇编语言中的带符号比较跳转指令
汇编语言中的带符号比较跳转指令
12 0
|
7天前
|
程序员
深入理解汇编:平栈、CALL和RET指令详解
深入理解汇编:平栈、CALL和RET指令详解
13 1
|
7天前
理解汇编中的CALL指令和参数传递
理解汇编中的CALL指令和参数传递
12 1
|
7天前
|
存储 程序员 开发者
深入理解汇编:push、pop、add、sub、lea 指令详解
深入理解汇编:push、pop、add、sub、lea 指令详解
12 1
|
4月前
汇编指令学习(寻址方式)
汇编指令学习(寻址方式)
23 0