1. ホーム
  2. assembly

[解決済み] MIPSの大、小、大

2022-02-01 17:19:41

質問

2つのレジスタがある場合 $s0 , $s1 のみを使用して、以下の疑似コードを MIPS アセンブリ言語に変換するにはどうすればよいでしょうか? slt (未満に設定)、および beqbne (等しい場合に分岐、等しくない場合に分岐)命令です。

   if ($s0 > $s1) { goto label1 }
   if ($s0 >= $s1) { goto label2 }
   if ($s0 <= $s1) { go to label3 }

解決方法は?

疑似コードは順次実行されると仮定しているので、先の条件が真であれば、そこに行って、後の if ステートメントを使用します。 これにより、最後の分岐に全く到達していない場合は、その分岐が取られることが保証されるため、条件付きである必要すらありません。 (また、これは分岐遅延スロットのないMIPSであると仮定しています)。

slt  $t1,$s1,$s0      # checks if $s0 > $s1
bne  $t1,$zero,label1 # if $s0 >  $s1, goes to label1
beq  $s1,$s2,label2   # if $s0 == $s2, goes to label2 
# beq  $t1,$zero,label3 # if $s0 <  $s1, goes to label3
b    label3            # only possibility left

もしそうでない場合は、実装の際に $s0 >= $s1 として
!($s0 < $s1)slt $t1, $s0, $s1 / beqz $t1, target , 例えば
のように、Ahmedさんの回答にあるような