Recursion 汇编中的双重递归将一直工作,直到次递归大于基本情况

Recursion 汇编中的双重递归将一直工作,直到次递归大于基本情况,recursion,assembly,mips,Recursion,Assembly,Mips,我正在尝试编写一个汇编程序,该程序将请求一个整数并执行一个递归函数:如果n>5f(n)=n*f(n-1)-f(n-3)+n-23否则,请在调试器中单步执行函数,以查看失败的测试用例会发生什么?这并不是很简单:你自己用调试器调试,直到你遇到一个你不想也不理解的特定情况(一个小程序块)。因此,当我完成一个步骤时,它工作得非常好,直到它在lw$a0,4($sp)mul$t3,$a0,$s0 sub$t4,$t3出现第二个递归,$v0添加$t5、$t4、$a0添加$t6、$t5、-23当a0为9时。它将

我正在尝试编写一个汇编程序,该程序将请求一个整数并执行一个递归函数:
如果n>5f(n)=n*f(n-1)-f(n-3)+n-23否则,请在调试器中单步执行函数,以查看失败的测试用例会发生什么?这并不是很简单:你自己用调试器调试,直到你遇到一个你不想也不理解的特定情况(一个小程序块)。因此,当我完成一个步骤时,它工作得非常好,直到它在
lw$a0,4($sp)mul$t3,$a0,$s0 sub$t4,$t3出现第二个递归,$v0添加$t5、$t4、$a0添加$t6、$t5、-23
当a0为9时。它将a0和s0相乘,但得到的是40,而不是它应有的正确数字,即a0的180(9*20)9和f(n-1)的结果的20。我不知道为什么我得到了错误的答案,特别是因为我的s0寄存器可能保存了错误的答案,但我知道为什么它保存了错误的答案。我发现它没有加载正确的$s0,所以我将它改为
lw$v0,4($sp)
,然后我添加了
lw$s0,4($sp)
解决了问题恭喜你自己调试它。请随意发布解决方案,作为您问题的答案,而不仅仅是评论。(尽管老实说,任何人与你有完全相同的错误的可能性非常小,因此解释你的错误的答案没有什么未来价值。如果他们确实有相同的错误,很难想象搜索词会让他们找到这个问题。特别是在他们调试到足以确切知道他们的错误是什么之前……)
f(9) = 162
f(10) = 1602
f(11) = 17590
f(9)= 27
f(10)=22 
f(11)=23
    ```#data declarations: declare variable names used in program, storage allocated in RAM
                                .data   
    prompt1:    .asciiz "\nEnter an Integer:\n" #Ending Index
    message1:   .asciiz "\nThe Solution is:\n"
    answer: .word   0


    #program code is contained below under .text
                            .text 
                            .globl    main    #define a global function main

    # the program begins execution at main()

    main:   
        la  $a0, prompt1    #load address of prompt1
        li  $v0, 4      #prepare print string
        syscall
        li  $v0, 5      #prepare receive int
        syscall
        move    $a0, $v0

        addi    $sp, $sp, -4
        sw  $ra, 0($sp) 
        jal Function
        sw  $v0, answer #move returned answer to a new memory
        lw  $ra, 0($sp)
        addi    $sp, $sp, 4

        la  $a0, message1   #load address of message1
        li  $v0, 4      #prepare print string
        syscall
        lw  $a0, answer
        li  $v0, 1
        syscall

        jr  $ra
    ############################################################################
    # Procedure/Function Function1
    # Description: recursive math function
    # parameters: $a0 = value of n, 
    # return value: $v0 = answer
    # registers to be used: $s3 and $s4 will be used.
    ############################################################################
    Function:

        addi    $sp, $sp, -12   #adjust stack pointer
        sw  $ra, 8($sp) #save return address    
        sw  $a0, 4($sp) #save n
        sw  $s0, 0($sp) #save immediate value (used for storing function(n-1))  


        li  $t2, 15

        slti    $t0, $a0, 6
        beq $t0, $zero, GreaterThanFive


    LessThanFive:
        add     $t1, $a0, $zero
        add $t1, $t1, $a0
        sub $t2, $t2, $t1
        move    $v0, $t2    
        j   Conclusion
    GreaterThanFive:

        addi    $a0, $a0, -1
        jal Function
        move    $s0, $v0

        lw  $a0, 4($sp)
        addi    $a0, $a0, -3
        jal Function


        lw  $a0, 4($sp)
        mul $t3, $a0, $s0
        sub $t4, $t3, $v0
        add $t5, $t4, $a0
        addi    $t6, $t5, -23

        move    $v0, $t6    

    Conclusion: 

        lw      $s1,0($sp)              # restore intermediate value
        lw  $a0,4($sp)
        lw  $ra,8($sp)

            addi    $sp,$sp,12              # restore stack

        jr  $ra             #return to caller```