Сборка Фибоначчи возвращает правильный результат, но вылетает на последней итерации
Я написал следующий код сборки для функции Фибоначчи. Это работает в том, что правильный результат помещается в $v0 после завершения, но программа также аварийно завершает работу за исключением Error in : invalid program counter value: 0x00000000
Это мой код:
main:
li $a0, 5
j fib
fib:
bgt $a0, 1, body # continue if $a0 is larger than 1
addi $v0, $zero, 1 # else return 1
jr $ra # return to body
body:
addi $sp, $sp, -16 # make room for 4 registers in stack
sw $a0, 0($sp) # save $a0 = n, to stack
sw $ra, 4($sp) # save return address to stack
addi $a0, $a0, -1 # $a0 = n - 1
jal fib # invoke fib(n-1) and save return address
sw $v0, 8($sp) # $v0 = fib(n-1), save to stack
lw $a0, 0($sp) # reset argument to original
addi $a0, $a0, -2 # $a0 = n - 2
jal fib # invoke fib(n-2) and save return address
sw $v0, 12($sp) # $v0 = fib(n-2), save to stack
lw $t0, 8($sp) # $t0 = fib(n-1)
lw $t1, 12($sp) # $t1 = fib(n-2)
lw $ra, 4($sp)
addi $sp, $sp, 16 # pop from stack
add $v0, $t0, $t1 # $v0 = fib(n-1) + fib(n-2)
jr $ra # jump to return address
Любой совет о том, как моя программа работает без сбоев? очень признателен
1 ответ
Давайте следить за выполнением fib(1)
через вашу программу, и посмотрите, почему она не работает:
main:
li $a0, 1 # edited for brevity...
j fib # make a note here.
fib:
bgt $a0, 1, body # won't branch...
addi $v0, $zero, 1 # else return 1
jr $ra # return to caller?
это вылетает, потому что вы использовали j fib
в main()
, Содержание $ra
те из main()
, который, к счастью, является недопустимым значением, поэтому вы терпите крах, а не выполняете где-то странный код.
Но это становится хуже. Даже если вы замените j fib
с правильным jal fib
у вас все равно будут проблемы после возвращения, так как main()
не завершается (системный вызов или возврат) или цикл, а продолжается в fib()
, Это будет больно.