RISCV Runtime exeption at... address out of range?
.data
n: .word 13
.text
.globl solution
solution:
# Call function with argument n
lw a0, n
addi sp,sp,-4
sw ra, 0(sp)
jal ra, fib3
lw ra, 0(sp)
addi sp,sp,4
# Output restult
li a7, 36
ecall
# Exit program
li a7, 10
ecall
ret
fib3:
blez a0, end #Base-case a0 kleiner gleich 0 gehe ende
addi sp, sp, -8 # Speicher auf dem Stack für a0 und ra sichern (Stackpointer verschieben)
sw ra, 4(sp) # Sicher ra im Stack
sw a0, 0(sp) # Sicher a0 im Stack
addi t0, a0, -3 # Wert für Rekursive Rechnung (zwischenspeicherung in t0)
addi t1, a0, -1 # Wert für Rekursive Rechnung (zwischenspeicherung in t0)
jal ra, fib3 # Rekursion (gehe zum Rekursionsanfang)
lw a0, 0(sp) # lade a0 vom Stack
add a0, t0, t1 # addiere die rekursiven werte
lw ra, 4(sp) # lade Rücksprungadresse
addi sp, sp, 8 # Stackpointer verschieben (zurrücksetzen)
ret # return fertig
end:
ret
Warum? Irgendwo verschiebe ich den sp wohl falsch aber ich weiß nicht wo
1 Antwort
Von gutefrage auf Grund seines Wissens auf einem Fachgebiet ausgezeichneter Nutzer
programmieren, Programmieren & Softwareentwicklung
Wenn die Wortbreite 32 Bit ist und Adressen auch 32 Bit haben, dann sieht das soweit eigentlich nachvollziehbar aus.
Es wäre gut, wenn Du anhand der Adresse der Exception die zugehörige Instruktion identifizieren könntest.
addi sp, sp, 8 # Stackpointer verschieben (zurrücksetzen)
ret # return fertig
end:
ret
Hat es einen spezifischen Grund, daß die end:-Marke nicht direkt nach dem addi steht?
KarlRanseierIII
22.12.2024, 15:43
@BloedeFragenxD
Das eine Rücksprungadresse auf dem Stack zu einer Exception führt ist soweit natürlich klar.
Die Frage ist also wie der Wert in ra kommt.
sw ra, 4(sp)
Würde ich lesen als, store word (return adress) at mem[sp+4]. Ich sehe nicht, warum die OP hier ra verändern sollte. Eigentlich sollten nur jal, ret und lw ra,... in Deinem Code überhaupt den Wert von ra ändern.
Runtime exception at 0x00400038: address out of range 0x7fbffffc
Go: execution terminated with errors.
Das ist die Exception. Der sp hat den wert 0x7fbffffc.
Ich bin auch Schritt für Schritt durchgegangen und vor der Exception hat sp den Wert: 0x7fbffff8
nach der Instruction: sw ra, 4(sp) hat ra dann eben 0x7fbffffc und das ist die Exception.
Ich kenne mich leider auch noch nicht so gut aus, vielleicht ist es ganz offensichtlich