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