1

MIPSは、等しい場合の分岐、レジスタと等しくない場合の分岐、ゼロ以下の場合の分岐、ゼロ以上の場合の分岐などの分岐命令を提供します...すべての分岐命令は、2つのオペランドと1つの条件のみを使用します. if ステートメントで突然複数の条件に遭遇した場合はどうなりますか。

問題は、 の MIPS コードをどのように書けるかということです:

if( (a<b) & ( b>c ) || (c==d)) {

}
else 
{

 }

この種の if ステートメントの複数の条件について教えてください。

4

2 に答える 2

2

次のように書き換えることができます。

if( (a<b) && ( b>c ) || (c==d)) {

}

このような:

bool altb = a < b;
bool bgtc = b > c;
bool ceqd = c == d;
bool and1 = altb && bgtc;
bool condition = and1 || ceqd;
if (condition) {
} else {
}

これは、ほとんどのコンパイラが if ステートメントの複雑な条件を評価する方法です。このようにすると、多くの条件分岐を連鎖させるよりもはるかに高速になります。

于 2013-03-13T22:09:08.893 に答える
1

$t0 には a、$t1 には b、$t2 には c、$t3 には d があると仮定します。

     outter_if_lbl: 
     bge $t0,$t1,exit_outter   #if a>=b break
     ble $t1,$t2,exit_outter   #if b=< c break
     bne $t2,$t3,exit_outter   #if c != d break
     #add functionality here   

     exit_outter:
     jr $ra #or whatever does your job

私は疑似命令を使用しているので、必要に応じて変換できます。グーグル方法。その背後にある考え方は、コードが同様に機能するために if ステートメントの反対のケースを使用する必要があるという事実です (これは一般的な C から Mips への変換規則です)。

于 2019-03-02T16:51:55.547 に答える