Я практикую рекурсию в сборке с набором команд MIPS, но я всегда получаю «ошибку неверного адреса»
fibonacci:
# PROLOGUE
subu $sp, $sp, 8
sw $ra, 8($sp)
sw $fp, 4($sp)
addu $fp, $sp, 8
# BODY
bgt $a0, 1, rec
move $v0, $a0
j ret
rec:
subu $a0, $a0, 1 #sets a0 = j-1
subu $s0, $a0, 1 #saves s0 = j-2 for later
jal fibonacci # call fibonacci
# $v0 == f(j-1)
move $t0, $v0 # t0 = f(j-1)
move $a0, $s0 #sets a0 = j-2
jal fibonacci
add $v0, $v0, $t0 # $v0 = f(j-2) + f(j-1)
ret:
# EPILOGUE
move $sp, $fp
lw $ra, ($fp)
lw $fp, -4($sp)
jr $ra
Этот код прекрасно работает на входах 1, 2, но когда я пытаюсь вычислив f (3), я получаю следующее:
Exception occurred at PC=0x0040004c
Bad address in data/stack read: 0x00000004
Exception 7 [Bad data address] occurred and ignored
Я подозреваю, что проблема связана со вторым вызовом Фибоначчи. Но что может быть проблемой со вторым вызовом Фибоначчи? Ничто не выглядит подозрительно.