由 mips-gcc 生成的MIPS汇编代码几乎可以在MARS_ MIPS模拟器上运行,但还不完全可以。举例来说:
- 编译器生成“j $31”而不是“jr $31”
- 编译器将 .align 指令放在文本段中,这是MARS不允许的。
此外,生成的程序集没有完全设置好,因此它将正确启动和停止(即,最后没有 syscall 10)。
这些问题似乎都可以通过一个简单的脚本轻松解决;但在我重新发明轮子之前我想知道
1.有没有什么gcc标志可以解决这些问题?
1.是否有一个现有的程序可以修复 mips-gcc 的输出,以便它可以在火星上运行?
(FWIW,我在GCC 3.3.6和4.6.1中都看到了相同的行为。)
1条答案
按热度按时间sg3maiej1#
是否有任何GCC标志将使这些问题中的一些消失?
简单的回答是否定的。MARS使用自定义系统调用,并且在调用约定上有很大的不同。
是否有一个现有的程序,将修复mips-gcc的输出,使其将在火星上运行?
我不知道有什么自动转换的方法。您只能手动执行此操作。我真的做过了。
大致上,我遵循了以下步骤:
1.使用Godbolt(编译器资源管理器)获取代码的美化的原始程序集。他们不使用特定的GCC选项来获得这个根据this的祝福视图,所以我没有提到任何GCC命令,但是你可以设置它的本地副本。
1.根据 * SYSCALL functions available in MARS * 替换所有系统调用及其调用约定
1.替换/添加所需的段标签(如 .text、.data 等)沿着所需的数据。
1.如果有main函数(标签),请在
.text
之后添加j main
。1.(或者,您可以重命名寄存器以提高可读性,因为正如Peter Cordes在评论中提到的,GCC for MIPS不支持参数
-mregnames
)这是我举的一个例子。它缺少 main,因为它本来是作为一个库使用的:
C代码:
字符串
Godbolt代码:
型
转换后的Mars代码:
型