需要用C或C++编写MIPS汇编器,寻找一些设计建议

Need to write a MIPS assembler in C or C++, looking for some design suggestions

本文关键字:寻找 汇编器 C++ MIPS 编写      更新时间:2023-10-16

我需要用C/C++编写MIPS汇编器。 在我开始编写一些代码之前,我认为我实际上应该花一些时间先做一些计划。 我需要考虑大约 15 条 MIPS 指令,包括 J,但不包括 JR。 程序需要接收一个包含 .text、.data 和 .word 部分以及标签的文件,然后输出一个文件,其中第一行是十进制的,其中包含指令数和数据字数。 其余的是用十六进制编码的机器代码。最后一组行由十六进制值组成,表示数据段中单词的初始值。我知道我需要做 2 次传递才能首先解析标签和 JUMP 指令。基本上,我只是在寻找有关如何设置数据结构的建议。 我应该做一个字符串数组来保存操作码、RS、RT、RD 等......然后以某种方式将其转换为十六进制? 或者有没有更好的方法可以从有任何建议/经验的人那里做到这一点? 感谢您的帮助/建议!

实际上,我很久以前就为与类项目相关的事情做了这件事!你说得对,必须做 2 次传球。但是,不要对寄存器使用字符串数组。事实上,你根本不需要使用字符串。您可以将操作码放在枚举中,将寄存器放在枚举中。对于 15 条指令,您可以通过手动编码开关大小写、if-else 语句来轻松完成大部分工作,而不是设计一个完全通用的解决方案。使用正则表达式可能很诱人,但对于您的问题来说,这不值得付出努力(尽管如果您有时间,您绝对应该利用任何机会学习正则表达式!然后使用类似哈希图的结构在寄存器和 OPCODE 及其十六进制值之间进行映射,并使用这些值。可以直接在代码中执行任何地址计算。这只是一个建议,你绝对应该尝试一下。我的主要观点是,如果你正在读取一个字符串,你不应该以相同的形式存储它,因为你可以先处理它并存储一些更有意义的东西(read:object)。

基本上,您只需要标签等的第一遍。您可以在第二遍中执行其他所有操作。如果您查看任何 O/S 教科书中的基本典型编译器/汇编程序流程图,您可以轻松地模拟每个步骤 - 这就是我所做的。

希望这有帮助!