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```