2017-11-09 5 views
0

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 
+0

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

+0

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

+0

Sie sollten immer den Code testen, den Sie gerade für die Debug-Hilfe posten, besonders wenn Sie Anfänger sind. –

Antwort

1

Der Großteil des Codes sieht hier gut aus, aber das ist nicht die vollständige Datei?

Es scheint, dass Ihre SumMin Funktion die Array-Größe als t1 will, aber es gibt eine freshLargestSum Adresse?

Haben Sie versucht, den Code Zeile für Zeile durchzugehen? Insbesondere bei MIPS überschreiben die meisten Fehler normalerweise die Register, die wir später im Code benötigen. vor allem, wenn wir zurückspringen.

Eine gute Debugging-Technik ist auch zu testen, dass die Funktionen alle unabhängig voneinander funktionieren; Wenn ja, wissen Sie, dass der Fehler im Hauptcode liegt. und wird wahrscheinlich mit dem tun:

  • Overwritten Register
  • jal an der falschen Stelle
  • Überschreiben der Rückgabe registrieren
  • falsche Logik

Hoffentlich hilft Ihnen, Ihr Problem zu lösen!