Was ist Los mit dieser MIPS/QtSPIM While-Schleife Code

Das Programm läuft auch mit dem erwarteten Ausgang, aber mit dem Fehler unten

Code

.data

.text
.globl main
main: 
  addi $t0, $t0, 0    # i = 0
  addi $t2, $0, 10    # n = 10
  j WhileCond         # goto WhileCond

  WhileLoop:
    li $v0, 1         # print_int
    move $a0, $t0     # $a0 = i (print i)
    addi $t0, $t0, 1
    syscall

  WhileCond:
    blt $t0, $t2, WhileLoop # if i < 10 goto WhileLoop

  j $ra

User Text Segment

[00400000] 21080000  addi $8, $8, 0           ; 10: addi $t0, $t0, 0 # i = 0 
[00400004] 200a000a  addi $10, $0, 10         ; 11: addi $t2, $0, 10 # n = 10 
[00400008] 08100007  j 0x0040001c [WhileCond] ; 12: j WhileCond # goto WhileCond 
[0040000c] 34020001  ori $2, $0, 1            ; 15: li $v0, 1 # print_int 
[00400010] 00082021  addu $4, $0, $8          ; 16: move $a0, $t0 # $a0 = i (print i) 
[00400014] 21080001  addi $8, $8, 1           ; 17: addi $t0, $t0, 1 
[00400018] 0000000c  syscall                  ; 18: syscall 
[0040001c] 010a082a  slt $1, $8, $10          ; 21: blt $t0, $t2, WhileLoop # if i 
[00400020] 1420fffb  bne $1, $0, -20 [WhileLoop-0x00400020] 
[00400024] 03e00008  jr $31                   ; 23: j $ra 

Fehler

Exception occurred at PC=0x00000000
  Bad address in text read: 0x00000000
Instruction references undefined symbol at 0x800001dc
  [0x800001dc] 0x143a0000  bne $1, $26, 0 [ok_pc-0x800001d8]
Dass nicht einmal montieren. j $ra ist kein Gültiger MIPS-Instruktion. Sie bedeuten, dass jr $ra.
du hast Recht ...
Mit jr $ra es läuft wunderbar auf dem MARS-simulator (ausser die $ra hat keinen zugewiesenen Wert und Abstürze beim springen zu $ra). Das ist der Grund, warum ich denke, Sie bekommen diese Fehlermeldung: Exception occurred at PC=0x00000000 Schlechte Adresse im text zu Lesen: 0x00000000
Ist diese Linie tatsächlich erforderlich? Die Rückkehr aus der main-Methode?
Sie haben keine Funktion aufrufen, so, die Grenze ist nicht notwendig in Ihrem Fall. In Fall, dass Sie wollen, verwenden Sie diesen code als eine Funktion, dann Linie erforderlich wäre, zusammen mit ein paar anderen wie Funktion Eingang/Ausgang-Protokoll (mehr info auf der MIPS-ABI). Auch ich würde nicht mit j WhileCond, sondern b WhileCond. Sprünge sind in der Regel für weit Adressen, Filialen sind in der Nähe Adressen. AFAIK Zweige schneller ausführen.

InformationsquelleAutor Jiew Meng | 2011-10-19

Schreibe einen Kommentar