0

基本的に、このCコード(http://pastebin.com/7EupfQ5n)をMIPSアセンブリに変換する必要があります。私はこれにひびを入れましたが、私は問題を抱えています。

私がこれまでに持っているのはこれです(http://pastebin.com/LpS6Mqr1)。しかし、シミュレーターでコードを実行すると、配列に何を入れても無限ループで実行され、それがどこで実行されているかがわかりません。whileステートメントとifステートメントで誤った方法で配列を参照していると思いますが、その方法や理由はわかりません。

誰かが助けることができれば、それは非常にありがたいです。

また、Mac OSX用のCからMIPSコンパイラ(トランスレータ?)を使用する方法はありますか?GCCをインストールしましたが、-mipsフラグによってエラーが発生します。ありがとう!

4

2 に答える 2

0

確認する最も簡単な方法は、アセンブリ コードをコンパイラによって生成された出力と比較することです。

マシンに clang が既にインストールされている場合は、gcc を使用してこれを行う必要はありません (また、クロスプラットフォーム コンパイラを作成するために必要なすべての面倒な手順を実行します)。残念ながら、Mac にインストールされているバージョンの clang は mips をサポートしていないため、llvm の Web サイトから直接 clang を入手するか、Linux マシンで実行する必要があります。クランを取得したら、実行するだけです

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

アセンブリ コードをmips.asmファイルと比較します。

ここにコマンドの出力を含めました。

于 2013-02-05T19:11:22.507 に答える
0

次回は、デバッガーまたはシミュレーターを使用してコードをステップ実行してください。自分で気づくことができる明らかなエラーがいくつかありました。

  1. すべてのmove(疑似) 命令が逆になります。する必要がありますmove destination, source
  2. $s0安全のために、最初はゼロで初期化する必要があります。
  3. bge $s3, $t4, sumBetween1If3(87行目)間違ったレジスタを使用しています(コピーペーストエラー?)。そのはずbge $s4, $s6, sumBetween1If3
  4. 現在の形式では役に立たず、オペランドを交換すると完全に有害になるため、97行目を削除する必要があります($s5.
  5. $ra他の場所でスタックを使用していないため、98 行目から 100 行目で何をしたかった のかわかりません。したがって、これらの行は両方を台無しにしており、無限ループを引き起こしています。これらの 3 行を削除するだけです。

おかしなことに、配列へのアクセスは問題ありません。改善の余地はたくさんありますが、最も顕著なのは、配列項目を 2 回ロードする必要がないことです。とにかく次の命令に行くだけの余分なジャンプをすべて削除するつもりだと思います。

于 2013-02-05T18:26:16.320 に答える