1. ホーム
  2. c

[解決済み] MIPSのネストされたForループと配列の使用

2022-03-15 13:50:14

質問

これは宿題です。私は自分ですべてのプログラムを書き、デバッガで実行し、すべてが私の意図したとおりに実行されましたが、この行を除いて。

sw $t1, counter($a3)

課題は、このCコードの断片をMIPSに変換することです。

    for(i = 0; i < a; i++) {
       for(j = 0; j < b; j++) {
          C[2 * i] = i – j; } }

私のプログラムでは、$a3以外のすべてのレジスタは、値を変更する必要があります - それは決して変更されません。

変更点 配列の宣言とレジスタによるポインティングが必要で、ラベルをオフセットに使用することはできません。

EDIT: これが完成した、動作するコードです。

解決方法は?

コメントから回答を再確認

で定義された配列のアドレスがロードされるはずです。 .data セクションで定義されています。

あなたのコードの大きな問題のひとつは、ループの組み立て方です。一番良い方法は、ループを段階的に、一度に1つのループに翻訳することです。また、次のことを忘れないでください。

for( i = 0; i < a; i++ )
{
    loop_content;
}

と同等です。

i = 0;
while( i < a )
{
    loop_content;
    i++;
}

これはアセンブリで翻訳するのが簡単です。条件は否定されるだけで、quot;exit" が必要で、quot;continue" のような条件は必要ないのです。 while ループを使用します。あなたのコードは、より明確で理解しやすくなるでしょう(そして、エラーの可能性も低くなるでしょう)。

あなたの "out of range" エラーはここから来ています。 sw $t1, counter($a3) . ここで counter はラベルであり、したがってアドレスである。したがって counter($a3) は "$a3 (=0x10010008) + カウンタのアドレス (=0x100100f8)" となり、0x20020100 となりますが、これは明らかにあなたの望むものではありません(そして無意味です)。

あ、あと sw $r, offset($a) MIPSの命令です。 offset は16ビットのCONSTANTでなければなりません。ここでは32ビットのアドレスを使用していますが、これはアセンブラが親切に変換してくれるからです。 sw $t1, counter($a3)$x = $a3 + counter; sw $t1, 0($x) が表示されることがあるのはそのためです。 sw をオフセットとして0とする。