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