繁体   English   中英

无法将此C代码转换为MIPS汇编

[英]Cannot translate this C code to MIPS Assembly

基本上,我需要将此C代码( http://pastebin.com/7EupfQ5n )转换为MIPS程序集。 我对此表示怀疑,但遇到了麻烦。

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

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

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

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

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

有趣的是,您的数组访问还可以。 尽管有很多改进的可能性,但是最显着的是,不需要两次加载数组项。 我假设您打算删除所有只会执行下一条指令的多余跳转。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM