2016-10-02 5 views
0

次のCIPSのMIPS変換はありますか?そうでない場合は、詳細に説明してください。私の教授は、バージョン1が正しいと言った。私がバージョン2のような命令を書いた場合、同じ出力を生成してもマークは得られません。彼女は理由を説明しなかった。前もって感謝します !Cからのこれらの2つのMIPS変換は同等ですか?

Cコード

if (i==j) { f = g + h ; } else f = g -h ;

MIPS版1

 bne $s3, $s4, Else 
     add $s0, $s1, $s2 
     j Exit 
    Else: sub $s0, $s1, $s2 
    Exit:... 

MIPSバージョン2:

  beq $s3, $s4, Else 
     sub $s0, $s1, $s2 
     j Exit 
    Else: add $s0, $s1, $s2 
    Exit:... 

答えて

1

あなたは他の駅に行きます私がjと等しくないときは、bne(ブランチが等しくない)を使用してください。何が第二だMIPSが説明すると、コードです:

if (i!=j) { 
    f = g - h ; 
} 
else 
    f = g + h ; 

だから、それは同じですが、それは同等のものを記述した場合、他のコード2番目のMIPSのコードは、それが最初に説明していませんが、それは右訳ではありません。

+0

ありがとうございます。私はそれを得たと思う。いくつかのケースでは同等ではないかもしれません。 f = g + hの実行につながった入力がf = g-hよりも頻繁に実行される場合。 2番目のバージョンではおそらくプロセスを遅くするでしょう。なぜなら、比較の直後にf = g + hを実行する代わりに、別のものにジャンプしなければならなかったからです。 – Snailwalker

+0

はい、そうであっても、これらは同等であり、同じものを実行するのは、同じCコードを翻訳するのではなく、同等であり、cをMIPSに変換したいということです。 – coder

1

通常、if-constructの翻訳用に特定のテンプレートに従うように割り当てられていない限り、私は通常それらの両方に完全なマークを付けます。

分岐構造のために違いがありますが、Cコードはコンパイラに最初の翻訳を強制的に(必ずしもそうでなくても)選択するよう強制しないので、どちらかを選択する必要はありません。

+0

私はあなたに同意しますが、質問は正確にどのようにcコンパイラがこのif-else文を処理するのかということではなく、上記のif-elseをcで書く方法でした。私は両方の方法が同じ結果を持っていることに同意しますが、最初のものだけがcコードの正確な翻訳です.2番目のMIPSコードは、私が書いた2番目のcプログラムを記述します(もちろん私は間違いがない限り)どんな選択をCコンパイラがやっているのですか...とにかく私は両方のMIPSが有効で、同じことをすると思います。 – coder

+0

それは本当に面白いです!どのような場合、翻訳者は2番目の翻訳を選択しますか?あなたは例を挙げることができますか?ありがとうございました 。 – Snailwalker

+0

@coderそれは* C *だったけど、そうですか?アセンブリ*から* Cの場合、私は同意するでしょう。他の順序は正確に間違っているかもしれませんが、できるだけ元に近づくためではありません。しかし、Cからアセンブリに、コンパイラが選択肢を持っている場合、私たちもやっていますよね? – harold

関連する問題