Ich habe Stunden damit verbracht, dies zu betrachten, Adressen auszudrucken und kann es nicht herausfinden. Dies ist ein einfaches Assembly-Programm, das über QTSpim ausgeführt wird. Programm, das Werte für ein Array der Größe 20 aufnehmen, zwei kleinste Ganzzahlen in einem Array finden soll, hinzufügt und an das Hauptverzeichnis zurückgibt, wo sie dann im Speicher direkt hinter dem Array gespeichert werden.MIPS Schlechte Adresse in Daten/Stack gelesen
Das Programm übernimmt die 20 Werte für das Array, versucht dann aber, Bad address in Daten/Stack lesen: 0x10040000 zu berechnen und auszuspucken. Alle meine anderen Daten sind in 0x100100XX Speicherplätzen, keine Ahnung, warum 40000 kommt.
.data
Fresh: .space 80
freshSmallestSum: space 4
.text
sumMin:
lw $t2, 0($a0) # $t2 = smallest array[i]
addi $t4, $t0, 1 # $t4 = i + 1
sll $t4, $t4, 2 # $t4 = i * (2^2)
add $t4, $t4, $a0 # $t4 = absolute address array[i+1]
lw $t3, 0($t4) # $t3 = array[i+1]
li $t4, 2 # i = 2
ble $t2, $t3, loopSmall # if $t2 <= t3 jump
move $t9, $t2
move $t2, $t3
move $t3, $t9
loopSmall:
bge $t4, $t1, ret1
sll $t5, $t4, 2 # $t5 = i * (2^2)
add $t5, $t5, $a0 # absolute address array[i]
lw $t5, 0($t5) # $t5 = array[i]
ble $t3, $t5, next2 # if $t3 <= array[i], jump
move $t3, $t5 # else $t3 = array[i]
ble $t2, $t3, next2 # if $t2 <= $t3, jump
move $t9, $t2 # else swap two smallest
move $t2, $t3
move $t3, $t9
next2:
addi $t4, $t4, 1 # i++
j loopSmall
ret1:
add $v0, $t2, $t3 # $v0 = smallest + secondSmallest
jr $ra
.text
.globl main
main:
li $t3, 0
li $t0, 0 # i = 0
li $t1, 20 # $t1 = 20
la $s2, Fresh
inLoop:
bge $t3, $t1, next # If $t3 > array length, jump
sll $t2, $t3, 2
add $t4, $t2, $s2 # Absolute address of fresh
li $v0, 5
syscall
sw $v0, 0($t4)
addi $t3, $t3, 1 # Increment counter
j inLoop
move $a0, $s2 # $a0 = address Fresh
jal sumMax # Get max sum of Fresh
la $t1, freshLargestSum
sw $v0, 0($t1) # Store sum in freshLargestSum
move $a0, $s2
jal sumMin # Get min sum of Fresh
la $t1, freshSmallestSum
sw $v0, 0($t1) # Store sum in freshSmallestSum
exit: li $v0, 10
syscall
Verwenden Sie Ihren Simulator, um den Code einzustufen und festzustellen, welcher Befehl fehlerhaft ist. Überprüfen Sie dann die Registerwerte und stellen Sie fest, was schlecht ist, und arbeiten Sie dann rückwärts, um zu sehen, wie der schlechte Wert erhalten wurde. PS: Ich kann nicht mal das Label 'next' finden, copy-paste error oder hast du es wirklich nicht? Außerdem scheint 'sumMin' die Array-Größe in' $ t1' zu erwarten, enthält aber zu diesem Zeitpunkt die Adresse von 'freshLargestSum'. – Jester
Sorry - definitiv war Copy Paste-Fehler - das Programm ist viel länger als dieses Codesegment. Versuche nur die relevanten Teile zu schneiden. Und der $ t1 war der Fehler! Vielen Dank - dieser kleine Registerwechsel war im Code zum sumMin-Stück nicht nah, also habe ich ihn nicht verstanden. Stundenlanges Starren durch deinen Kommentar fixiert, danke! – Tenze
Sie sollten immer den Code testen, den Sie gerade für die Debug-Hilfe posten, besonders wenn Sie Anfänger sind. –