0

基本上我需要将此 C 代码 ( http://pastebin.com/7EupfQ5n ) 翻译成 MIPS 程序集。我对此有所了解,但我遇到了麻烦。

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

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

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

4

2 回答 2

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 行。

有趣的是,您的数组访问是正常的。但是,有许多改进的可能性,最值得注意的是不需要两次加载数组项。我假设您打算删除所有多余的跳转,这些跳转只是进入下一条指令。

于 2013-02-05T18:26:16.320 回答
0

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

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

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

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

我在这里包含了命令的输出。

于 2013-02-05T19:11:22.507 回答