我正在尝试编写一个编译器来获取一个汇编文件,该文件将输出原始机器代码指令。
我找到了很多关于如何编写编译器的教程,但我想知道是否所有阶段都与汇编程序助记符有关。例如,考虑到汇编程序的简化的逐阶段格式,词法分析是否完全有必要,还是仍然需要,但格式更简单?
我正在尝试编写一个编译器来获取一个汇编文件,该文件将输出原始机器代码指令。
我找到了很多关于如何编写编译器的教程,但我想知道是否所有阶段都与汇编程序助记符有关。例如,考虑到汇编程序的简化的逐阶段格式,词法分析是否完全有必要,还是仍然需要,但格式更简单?
仍然需要词法分析器:您必须有一些东西可以将文本分解成单独的标记(单词、数字、标点符号等)。你仍然需要一个解析器,虽然是一个非常简化的解析器。毕竟有语法。
正如我所看到的,词法分析就是所需要的,由于组装的扁平结构,对解析器的需求减少了。
首先我会检查是否没有无效的指令/操作数,然后是否声明了所有使用的变量。一旦您确定该文件是有效程序,请删除注释并用地址替换变量和过程(您必须在翻译过程中“即时”为标签分配地址,因为您现在不知道地址。)。最后以二进制代码进行实际转换。
如果您假设每条指令都有自己的行,那会容易得多:如果当前行是标签,则用当前地址替换所有对它的进一步引用,否则删除所有空格,在两个“单词”(指令和操作数)。现在处理指令是个笑话。;)
我想说您几乎可以将编译器的每个阶段都应用于汇编器,当然适用于您的取决于您要做什么。如果您进行 1 对 1 映射,则需要语法分析来检查错误,并需要词法分析器和/或解析器来处理程序集的说明符的文本,例如分段、内存保护.data
(甚至是宏!)。还有一个大小“优化”,可以通过将立即常量汇集到可能的最小大小来应用。当然,您可以全力以赴并进行深入分析以进行指令重新排序和融合。您可能还需要一个静态分析阶段来检查无效(非法)序列(LOCK CMPXCHG EDX,EDX
将是语法正确但无效的程序集 iirc 的示例)