需要用 C 或 C++ 编写 MIPS 汇编程序,寻找一些设计建议
Need to write a MIPS assembler in C or C++, looking for some design suggestions
我需要用 C/C++ 编写 MIPS 汇编器。在我开始编写一些代码之前,我认为我实际上应该花一些时间并先做一些计划。我需要考虑大约 15 条 MIPS 指令,包括 J,但不包括 JR。该程序需要接收一个包含 .text、.data 和 .word 部分以及标签的文件,然后输出一个文件,该文件的第一行以十进制形式显示指令数和数据字数。剩下的就是十六进制编码的机器码。最后一组行由十六进制值组成,表示数据段中单词的初始值。我知道我需要做 2 遍才能首先解析标签和 JUMP 指令。基本上我只是在寻找有关如何设置数据结构的建议。我应该做一个字符串数组来保存操作码、RS、RT、RD 等……然后以某种方式将其转换为十六进制吗?或者有 advice/experience 的人有更好的方法来做到这一点吗?感谢您的 help/suggestions!
实际上我很久以前就为与 class 项目相关的事情做过这件事!关于必须进行 2 次传球,您是对的。但是,不要为寄存器使用字符串数组。事实上,您根本不需要使用字符串。您可以将操作码放在枚举中,并将寄存器放在枚举中。对于 15 条指令,您可以通过手动编码 switch-case 和 if-else 语句轻松完成大部分工作,而不是设计一个完全通用的解决方案。使用正则表达式可能很诱人,但对于您的问题来说,这是不值得的(尽管如果有时间,您绝对应该利用任何机会学习正则表达式!)。然后使用类似哈希图的结构在寄存器和操作码及其十六进制值之间进行映射,并使用它们。您可以直接在代码中进行任何地址计算。这只是一个建议,您一定要尝试一下。我的主要观点是如果你正在读取一个字符串,当你可以先处理它并存储一些更有意义的东西(读:对象)时,你不应该以相同的形式存储它。
基本上,您只需要第一遍处理标签等。您可以在第二遍中完成其他所有操作。如果您查看任何 O/S 教科书中的基本典型 compiler/assembler 流程图,您可以轻松地模仿每个步骤 - 这就是我所做的。
希望对您有所帮助!
我需要用 C/C++ 编写 MIPS 汇编器。在我开始编写一些代码之前,我认为我实际上应该花一些时间并先做一些计划。我需要考虑大约 15 条 MIPS 指令,包括 J,但不包括 JR。该程序需要接收一个包含 .text、.data 和 .word 部分以及标签的文件,然后输出一个文件,该文件的第一行以十进制形式显示指令数和数据字数。剩下的就是十六进制编码的机器码。最后一组行由十六进制值组成,表示数据段中单词的初始值。我知道我需要做 2 遍才能首先解析标签和 JUMP 指令。基本上我只是在寻找有关如何设置数据结构的建议。我应该做一个字符串数组来保存操作码、RS、RT、RD 等……然后以某种方式将其转换为十六进制吗?或者有 advice/experience 的人有更好的方法来做到这一点吗?感谢您的 help/suggestions!
实际上我很久以前就为与 class 项目相关的事情做过这件事!关于必须进行 2 次传球,您是对的。但是,不要为寄存器使用字符串数组。事实上,您根本不需要使用字符串。您可以将操作码放在枚举中,并将寄存器放在枚举中。对于 15 条指令,您可以通过手动编码 switch-case 和 if-else 语句轻松完成大部分工作,而不是设计一个完全通用的解决方案。使用正则表达式可能很诱人,但对于您的问题来说,这是不值得的(尽管如果有时间,您绝对应该利用任何机会学习正则表达式!)。然后使用类似哈希图的结构在寄存器和操作码及其十六进制值之间进行映射,并使用它们。您可以直接在代码中进行任何地址计算。这只是一个建议,您一定要尝试一下。我的主要观点是如果你正在读取一个字符串,当你可以先处理它并存储一些更有意义的东西(读:对象)时,你不应该以相同的形式存储它。
基本上,您只需要第一遍处理标签等。您可以在第二遍中完成其他所有操作。如果您查看任何 O/S 教科书中的基本典型 compiler/assembler 流程图,您可以轻松地模仿每个步骤 - 这就是我所做的。
希望对您有所帮助!