Двойная рекурсия в MIPS - неправильный вывод - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь реализовать программу, в которой задан пользовательский ввод (n), и программа будет следовать этому алгоритму:

if n = 0,   f(n) = 2
else if n is odd, f(n) = 3*f(n-1) + 1 
else if n is even, f(n) = f(n-2) + 2*f(n-1)

Вот моя попытка сделать это до сих пор:

.data 0x1001000C
        .word 4
prompt2:    .asciiz     "Result: "
answer:     .word       0

.text
    lui $t0,0x1001
    lw  $a0,0xC($t0)     #n
    sw  $v1,0x4($t0)
    addi $t8, $t8, 1
    jal function
    add  $v1,$s1,$v1
    sw   $v1,answer

    # Print out the result
    li      $v0,4
    la      $a0,prompt2
    syscall

    lw      $a0,answer
    li      $v0,1
    syscall

    li      $v0,10
    syscall

function: 
    beq  $a0, $0, f_exit        #if n=0
    andi $t9, $a0, 1        
    beq  $t9, $t8, f_odd        #if odd

    addi $sp,$sp,-8     # push stack
    sw   $ra,4($sp)     # store return address
    sw   $a0,0($sp)     # save n

    addi $a0, $a0, -1   #n-1
    jal function
    mul  $v1, $v1, 2    #2f(n-1)  

    lw  $v1,0x4($t0)
    lw  $a0,0($sp)          # reload 1st operand

    addi $a0, $a0, -2       #n-2
    jal function

    lw      $ra,4($sp)      # restore return address
    lw      $a0,0($sp)      # restore n
    addi    $sp,$sp,8
    j exit

f_odd:
    addi $sp,$sp,-8     # push stack
    sw   $ra,4($sp)     # store return address
    sw   $a0,0($sp)     # save n

    addi $a0, $a0, -1   #n-1
    jal function
    mul $v1,$v1,3       #3f(n-1)  
    addi $s1, $v1, 1    #3f(n-1)+1

    lw  $v1,0x4($t0)
    lw  $a0,0($sp)          # reload 1st operand

    lw      $ra,4($sp)      # restore return address
    lw      $a0,0($sp)      # restore n
    addi    $sp,$sp,8
    j exit

f_exit:
    addi $v1,$v1,2

exit:
    jr $ra

Однако я никогда не мог получить правильный ввод.Например, ввод 4 должен дать мне вывод 98, но вместо этого эта программа дает мне 9. Любая помощь будет оценена.

...