2016-10-20 2 views
0

Ich versuche, etwas zu programmieren, das ständig eine ganze Zahl von dem Benutzer einnimmt und den Mindestwert in $ s2 speichert.If-Else mit verschachtelt Wenn in MIPS-Assembly

Dies ist ein C-Code-Darstellung von dem, was ich versuche,

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

Im Grunde zu tun, lud ich $ s2 mit Null außerhalb der Eingangsschleife. Dies prüft, ob $ s2 Null hat, und setzt es auf die aktuelle (erste) Benutzereingabe ($ t0), da dies der Minimalwert ist. Wenn $ s2 keine Null mehr enthält, prüft es die neue Benutzereingabe anhand dessen, was bereits in $ s2 ist und ob es kleiner als der neue Mindestwert ist.

Wie kann ich dies in MIPS-Assembly implementieren?

Ich habe das so weit (das ist das Endstück einer Schleife namens lesen), aber alles was es tut ist, wenn ich die erste int drücken, springt es bis zum Ende und druckt die min ohne Schleife über.

read: 
    ... 

    beq   $s2, $zero, LOAD  

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

    j  read 

LOAD: 

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

Antwort

0

Das Hauptproblem ist, dass Sie einen Sprung am Ende Ihres Codes benötigen, weil Sie [wahrscheinlich] „um den Rand der Welt herunterfallen“:

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 

Die Code kann etwas verkürzt werden.

  1. Vom slt (vs. sltu) wissen wir, dass die Werte unterzeichnet. Wenn wir also $s0 mit dem maximalen positiven Wert (d. H. 0x7FFFFFFF) anstelle von 0 vorfüllen, können wir den ersten beq aus der Schleife entfernen.
  2. Auch, wenn wir den Sinn des Zweigs nach dem slt umkehren, können wir eine zusätzliche j Anweisung beseitigen.
  3. Wir können die addu ändern $zero zu verwenden und beseitigen die 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