2016-10-20 12 views
0

私は、ユーザーから整数を連続的に取り込み、最小値を$ s2に格納するコードを作成しようとしています。If-Else with MIPSアセンブリのIf

これは私が基本的に

if ($s2 == 0) 
    $s2 = $t0 
else { 
    if ($t0 < $s2) 
    $s2 = $t0 
} 

を行うにしようとしています何のCコード表現で、Iは入力ループのゼロ外で$ S2をロードしました。これは$ s2がゼロであるかどうかをチェックし、それが最小値であるので現在の(最初の)ユーザ入力($ t0)に設定します。 $ s2にゼロが含まれていない場合は、$ s2に既に入っているものと比較して新しいユーザー入力をチェックし、それが新しい最小値になった場合はそれをチェックします。

MIPSアセンブリでこれを実装するにはどうすればよいですか?

私はこれまでこれを持っていましたが(これは読み取りと呼ばれるループの最後の部分です)、最初のintを押すと、最後までスキップしてループしないでminを出力します。

read: 
    ... 

    beq   $s2, $zero, LOAD  

    slt  $s6, $t0, $s2 
    bne  $s6, $zero, LOAD 

    j  read 

LOAD: 

    li  $s2, 0 
    addu  $s2, $s2, $t0 

答えて

0

主な問題は、あなたが[たぶん]「世界の端から落ちる」しているので、あなたのコードの下部にジャンプを必要とするということである。

read: 
    ... 

    beq  $s2,$zero,LOAD 

    slt  $s6,$t0,$s2 
    bne  $s6,$zero,LOAD 

    j  read 

LOAD: 

    # NOTE: you could use $zero as you did above to eliminate the "li" here 
    li  $s2,0 
    addu $s2,$s2,$t0 

    # NOTE/BUG: need to jump back to read loop 
    j  read 

コードを少し短くすることができます。 slt(対sltu)から

  1. 我々は値がをを締結していることを知っています。したがって、$s0をゼロの代わりに最大正の値(つまり0x7FFFFFFF)で埋めた場合、ループから最初のbeqを削除できます。
  2. また、sltの後にブランチの意味を逆にすれば、余分なj命令を排除できます。
  3. 我々は$zeroを使用してli

li  $s2,0x7FFFFFFF   # load maximum positive value 

read: 
    ... 

    slt  $s6,$t0,$s2    # is new value < minimum? 
    beq  $s6,$zero,read   # if no, loop 

    addu $s2,$zero,$t0   # save new minimum value 
    j  read     # restart input loop 
を排除するためにadduを変更することができます