无法将此C代码转换为MIPS Assembly

时间:2013-02-05 05:44:10

标签: c assembly mips

基本上我需要将这个C代码(http://pastebin.com/7EupfQ5n)翻译成MIPS程序集。我对此采取了一个裂缝,但我遇到了麻烦。

到目前为止,我(http://pastebin.com/LpS6Mqr1)。但是当我在模拟器中运行代码时,它会在无限循环中运行,尽管我将其放入数组中,但我找不到它在做什么。我会假设它在while和if语句中以不正确的方式引用数组,但我不确定如何或为什么。

如果有人可以提供帮助,那将非常感激。

另外,有没有办法为Mac OSX安装C到MIPS编译器(翻译器?)?我安装了GCC,但-mips标志为我生成了错误。谢谢!

2 个答案:

答案 0 :(得分:0)

下次请使用调试器或模拟器来逐步执行代码。 您可能已经注意到了一些明显的错误。

  1. 您的所有move(伪)指令都已颠倒过来。应该是move destination, source
  2. 您应该在开始时将$s0初始化为零,以确保安全。
  3. bge $s3, $t4, sumBetween1If3(第87行)使用了错误的寄存器(复制粘贴错误?)。它应该是bge $s4, $s6, sumBetween1If3
  4. 你应该删除第97行,因为它的当前形式没用, 如果你交换操作数,它会彻底有害(它会破坏你的总和 在$s5)。
  5. 不知道你想用98-100行做什么,因为你不使用 $ra或其他地方的堆栈。所以这些线条都搞乱了,导致你无休止的循环。只需删除这3行。
  6. 有趣的是,您的阵列访问是可以的。但是,有许多改进的可能性,最值得注意的是,不需要两次加载数组项。我假设您打算删除所有多余的跳转,无论如何都要去下一条指令。

答案 1 :(得分:0)

最简单的检查方法是将汇编代码与编译器生成的输出进行比较。

如果您的计算机上已经安装了clang,则不需要gcc来执行此操作(并完成创建跨平台编译器所需的所有繁琐步骤)。然而不幸的是,安装在Mac上的clang版本不支持mips,因此你必须直接从llvm的网站获取clang,或者在linux机器上进行。一旦你得到了铿锵声,只需运行

clang -S -target mips -o mips.asm ./your_file.c

并将汇编代码与mips.asm文件进行比较。

我已经包含了命令here的输出。