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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht festgelegt
$t0
auf 0, sondern unverändert lassen. (move $t0, $zero
) oder (addi $t0, $0, 0
) würden beide funktionieren.Außerdem sind Sie sicher, dass
$t0
und$t2
sind, erhalten in der syscall?Schließlich die Fehler, die Sie geschrieben scheint nicht auftreten, in Ihrem code. Sie haben einen stack-trace/dump von Registern oder sonst etwas, das helfen könnte, im tracking es nach unten?
j $ra
die die Probleme verursacht ... tho ich denke, @m0skit0, richtig ist, sollte es überhaupt nicht funktionieren ...). Ich erinnere mich syscall könnte nicht erhalten einigen Variablen ... aber es funktionierte so weit ... wie kann ich das beheben dieses potenzielle problem?Durch Speicherung auf dem stack, es ist alles erklärt in hier. Und es ist sehr wahrscheinlich @m0skit0 es richtig, ich erinnere mich nicht, SPIMs Ausgangsbedingungen.
InformationsquelleAutor user786653