Язык сборки MIPS: рекурсивный вызов функции - PullRequest
0 голосов
/ 20 сентября 2018

Я написал простой код для рекурсивной функции, который выполняет что-то вроде следующего в C:

Int function1(int n)
{
    if (n <= 3)
     {
        int ans1 = (3*n)-5;
        return ans1;
    }
    else
     {
        int ans1 = (n-1)*function1(n-1) + function1(n-2) - n;
        return ans1;
     }
}

И функция main вызывает функцию.

Очевидно, он не возвращает ожидаемого ответа.когда вход «8», ожидаемый выход «7842».Что не так с моим кодом?

Предположим, у меня есть все строковые переменные для вывода, объявленные

 main:  
        la      $a0, msg1
        li      $v0, 4
        syscall

        li      $v0, 5
        syscall
        move    $a1, $v0

        la      $a0, msg2
        li      $v0, 4
        syscall

        addi    $sp, $sp, -4
        sw      $ra, 0($sp)
        jal     Function1
        lw      $ra, 0($sp)
        addi    $sp, $sp, 4


        move    $a0, $v0
        li      $v0, 1
        syscall

        la      $a0, space
        li      $v0, 4
        syscall

        jr      $ra


 Function1:
        addi    $sp, $sp, -4
        sw      $ra, 0($sp)
        addi    $sp, $sp, -4
        sw      $s0, 0($sp)

        move    $s0, $a1
        li      $t0, 3
        ble     $s0, $t0, Done

        addi    $a1, $s0, -1

        jal     Function1

        mult    $a1, $v0
        mflo    $t1

        addi    $a1, $s0, -2

        jal     Function1


        add     $t2, $t1, $v0
        sub     $v0, $t2, $s0

 Done:
        li      $t0, 3
        mult    $t0, $a1
        mflo    $t1
        addi    $v0, $t1, -5

        lw      $s0, 0($sp)
        addi    $sp, $sp, 4
        lw      $ra, 0($sp)
        addi    $sp, $sp, 4

        jr      $ra
...