我是MIPS的新手,我正在尝试编写一个递归程序。该程序将计算f(N)
,其中N
是一个大于零的整数。 f(N)= 3*(N-1)+f(N-1)+1
。基本案例是f(0)=2
。但是,当我尝试运行我的程序时,它会无限期地运行,因此我猜测递归调用永远不会结束。我似乎无法找到问题所在。我的代码如下。
.data
prompt: .asciiz "Please enter a number"
.text
.globl main
main:
li $v0, 4
la $a0, prompt
syscall
li $v0, 5
syscall
move $a0, $v0
jal factfunc
move $a0, $v0
li $v0, 1
syscall
li $v0, 10
syscall
factfunc:
addiu $sp, $sp, -8
sw $ra, 4($sp)
sw $s0, 0($sp)
move $s0, $a0
blez $s0, endCondition
addi $a0, $a0, -1
jal factfunc
li $s1, 0
li $s2, 0
addi $s1, $s0, -1
move $s2, $s1
addu $s2, $s2, $s2
addu $s1, $s2, $s1
addu $v0, $v0, $s1
addi $v0, $v0, 1
cleanUp:
lw $s0, 0($sp)
lw $ra, 4($sp)
jr $ra
endCondition:
li $v0, 2
b cleanUp
我非常感谢任何帮助。谢谢!
答案 0 :(得分:0)
您忘记在fastfunc
程序结束时缩小堆栈。
在我jr $ra
添加addi $sp $sp 8
之前,它开始按预期停止。
答案 1 :(得分:0)
您的返回地址$ra
正在加载0x00400050
(来自factfunc)而不是0x00400020
(来自main)。这是一个快速修复添加到$sp$
。