Сборка Фибоначчи возвращает правильный результат, но вылетает на последней итерации

Я написал следующий код сборки для функции Фибоначчи. Это работает в том, что правильный результат помещается в $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(), Это будет больно.

Другие вопросы по тегам