MIPS中的双重递归-错误的输出

时间:2018-09-24 08:03:08

标签: recursion assembly mips cpu-architecture

我正在尝试实现一个程序,其中给出了用户的输入(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。任何帮助将不胜感激。

0 个答案:

没有答案