2017-02-11 7 views
0

Dieses Programm druckt die ASCII-Zeichen von 0 bis Z. Der Ausgang istKann nicht verstehen kleinen Teil einer MIPS Montageanleitung

:;<=>[email protected] 

Die Frage ist, wie das Programm zu ändern, so dass es jedes drittes ASCII-Zeichen druckt . So dass die Ausgabe wie diese

0369<?BEHKNQTWZ] 

aussehen muss, wenn ich die Konstante in addi $s0,$s0,1-addi $s0,$s0,3 die Ausgabe ändern, ist eine Menge von ASCII-Zeichen und es ist wie eine Endlosschleife.

.text 


main: 
      li $s0,0x30 


loop: 
     move $a0,$s0  

     li $v0,11  
     syscall    

     addi $s0,$s0,1  # what happens if the constant is changed? 

      li $t0,0x5b 
     bne $s0,$t0,loop 
     nop 


stop: j  stop  
     nop  

Ich verstehe nicht den Grund, warum das Programm verrückt wird, wenn ich diese Konstante ändere.

Ich habe meinen eigenen Code geschrieben, wie unten gezeigt, der gut funktioniert und den Job erledigt, aber ich möchte den Code oben verstehen, weil es eine Aufgabe ist.

.data 



.text 

     main: 
       li $s0,0x30 



     for: 
      addi $a0,$s0,0 
      li $v0,11 
      syscall 
      li $t0,0x5a 
      bgt $s0,$t0, done 
      addi $s0,$s0,3 
      j for 
     done:    
+0

Was Christian als Antwort sagt, in Bezug auf die innere Berechnung: Original beginnt mit Nummer 0x30, dann erhöht es um 1, und Schleifen, bis es Wert 0x5b erreicht (das ist 0x2b = 43-mal Schleifen). Sie haben das Inkrement auf 3 geändert, so dass Sie die Werte 0x33, 0x36, ..., 0x57, 0x5a, 0x5d ... erreichen, die über die 0x5b springen, die auf Gleichheit getestet wird. Die Schleife wird also auf "s0" enden, wird einmal überlaufen, da dies die Werte um 1 versetzt und nach einiger Zeit den Wert 0x31 erreicht, und von dort auch 0x5b. (MARS/SPIM haben Debugger, wo Sie diese Schrittanweisung über die Anweisung beobachten können) – Ped7g

+0

@ Ped7g Vielen Dank für die Erklärung! –

Antwort

1

Die Anzahl der Zeichen dieser Druck (43) nicht durch 3 teilbar ist, so durch Zugabe von 3 jedes Mal, geht die Schleife über seine Ausgangsbedingung (s0 == t0). Versuchen Sie, die bne zu blt zu ändern.

Ihre eigenen Code tut genau das gleiche, außer dass es aus der Schleife springt, wenn es vorbei am Endpunkt geht, anstatt nach oben es sei denn es hat.

+0

Danke für die Antwort! Das hat mir geholfen. –

Verwandte Themen