2.4.3 指令生成
2.2节介绍了x86指令的基本结构。同样,在汇编器语法分析时,需要根据指令的语法模块收集这些指令的结构信息。比如操作码、ModR/M字段、SIB字段、偏移量、立即数,然后按照指令的结构将上述信息写入文件即可。
首先,指令名和操作码一般是一对多的关系,因此需要根据具体的操作数类型或长度来决定操作码的值。按照操作数不同建立一张指令的操作码表来执行操作码的查询是一种有效的解决方案。
其次,有些指令的ModR/M字段的reg部分与操作码有关,但不需要输出ModR/M字段,汇编器需要单独处理这些特殊的指令操作码。另外,ModR/M字段中包含是否扩展了SIB字段的信息。
除了正确输出指令的二进制信息外,汇编器在遇到对符号引用的指令时还要记录相关重定位信息,比如重定位地址、重定位符号、重定位类型等。
最后,参考之前介绍的ELF文件结构,汇编器将收集到的段信息和二进制数据组装到目标文件内。
至此,根据已描述的汇编器主要工作流程,可以生成标准的ELF可重定位目标文件。那么,如何把这些分散的目标文件合并成我们最终想要的可执行文件,便是接下来要介绍的链接器的工作内容。