自己动手构造编译系统:编译、汇编与链接导读
Preface前 言 本书适合谁读 本书是一本描述编译系统实现的书籍。这里使用“编译系统”一词,主要是为了与市面上描述编译器实现的书籍进行区分。本书描述的编译系统不仅包含编译器的实现,还包括汇编器、链接器的实现,以及机器指令与可执行文件格式的知识。因此,本书使用“编译系统”一词作为编译器、汇编器和链接器的统称。 本书的目的是希望读者能通过阅读本书清晰地认识编译系统的工作流程,并能自己尝试构造一....
自己动手构造编译系统:编译、汇编与链接2.5.3 重定位
2.5.3 重定位 重定位从本质上来说就是地址修正。由于目标文件在链接之前不能获取自己所使用符号的虚拟地址信息,因此导致依赖于这些符号的数据定义或者指令信息缺失。汇编器在生成目标文件的时候就记录下所有需要重定位的信息。链接器获取这些重定位信息,并按照重定位信息的含义修改已经生成的代码,使得最...
自己动手构造编译系统:编译、汇编与链接2.6 本章小结
2.6 本章小结 本章介绍了编译系统的设计,并按照编译、汇编和链接的顺序阐述了它们的内部实现。同时,也介绍了x86指令和ELF文件结构等与操作系统及硬件相关的知识。 通过以上的描述,可以了解高级语言如何被一步步转化为汇编语言,以及词法分析、语法分析、语义分析、符号表和代码生成作为编译器的主要模块,其内部是如何实现的。汇编器在把汇编语言程...
自己动手构造编译系统:编译、汇编与链接2.5.2 符号解析
2.5.2 符号解析 如果说地址空间分配是为段指定地址的话,那么符号解析就是为段内的符号指定地址。对于一个汇编文件来说,它内部使用的符号分为两类:一类来自自身定义的符号,称为内部符号。内部符号在其段内的偏移是确定的,当段的起始地址指定完毕后,内部符号的地址按照如下方式计算: 符号地址 = 符号所在段基址 + 符号所在段内偏移 另一类来自其他文件定...
自己动手构造编译系统:编译、汇编与链接2.5.1 地址空间分配
2.5.1 地址空间分配 在汇编器生成的目标文件内,是无法确定数据段和代码段的虚拟地址的,因此将它们的段地址都设置为0。链接器是这些代码和数据加载到内存执行之前的最后一道处理,因此要为它们分配段的基址。 链接器按照目标文件的输入顺序扫描文件信息,从每个文件的段表中提取出各个文件的代码段和数据段的信息。假设可执行文件段加载后的起始地址是0x080408000,链接...
自己动手构造编译系统:编译、汇编与链接2.5 链接程序的设计
2.5 链接程序的设计 本书欲设计一个简洁的静态链接器,以满足上述汇编器产生的目标文件的链接需求。它的工作内容是把多个可重定位目标文件正确地合并为可执行文件,但链接器不是对文件进行简单的物理合并。除了合并同类的段外,链接器需要为段分配合适的地址空间,还需要分析目标文件符号定义的完整性,同时对符号的地址信息进行解析,最后还有链接...
自己动手构造编译系统:编译、汇编与链接2.4.3 指令生成
2.4.3 指令生成 2.2节介绍了x86指令的基本结构。同样,在汇编器语法分析时,需要根据指令的语法模块收集这些指令的结构信息。比如操作码、ModR/M字段、SIB字段、偏移量、立即数,然后按照指令的结构将上述信息写入文件即可。 首先,指令名和操作码一般是一对多的关系,因此需要根据具...
自己动手构造编译系统:编译、汇编与链接2.4.2 表信息生成
2.4.2 表信息生成 汇编器的符号表除了记录符号的信息之外,还需要记录段相关的信息以及重定位符号的信息,这些信息都是生成可重定位目标文件所必需的。 对于段表的信息,可以在汇编器识别section语法模块时进行处理。比如声明代码段的汇编代码及段表信息生成(见图2-14)。 section .text 图2-14 段表信息生成 ...
自己动手构造编译系统:编译、汇编与链接2.4.1 汇编词法、语法分析
2.4.1 汇编词法、语法分析 汇编语言有独立的词法记号,对于汇编词法的分析,只需要构造相应的词法有限自动机就可以了。举一个简单的例子: mov eax,[ebp-8] 该指令有8个词法记号,它们分别是:'mov''eax'逗号'[''ebp''–''8'和']'。汇编器的词法分析器将词法记号送到语法分析器用于识别汇编语言的语法模块。同...
自己动手构造编译系统:编译、汇编与链接2.4 汇编程序的设计
2.4 汇编程序的设计 通过对汇编器已有的了解,可以发现汇编器和编译器的实现非常相似。编译器是将高级语言翻译为汇编 语言的转换程序,汇编器则是将汇编语言翻译为目标机器二进制代码的转换程序。汇编器实际就是汇编语 的“编译器”,虽然汇编语言并非高级语言。 汇编器也包含词法分析、语法分析、语义处理、代码生成四个基本流程。但前面讨论过,本书设计的 汇编器面向...
本页面内关键词为智能算法引擎基于机器学习所生成,如有任何问题,可在页面下方点击"联系我们"与我们沟通。