【发布时间】:2012-03-25 21:24:59
【问题描述】:
所以我已经为此工作了几天,我已经成功地完成了所有这些工作,除了其中一部分让我感到难过。
int mystery(int a0)
{
if (a0 == 0)
{
return 0;
}
else
{
return mystery(a0 - 1) + a0;
}
}
我有这个递归函数,我有一些 MIPS 代码。 C 代码可以工作,但我的 MIPS 代码中的某个地方存在问题,导致它在输入 2 后无法正确输出。
.text
main:
li $a0, 2
jal mystery
move $a0, $v0
jal putDec
li $a0, '\n'
li $v0, 11
syscall
li $a0, 3
jal mystery
move $a0, $v0
jal putDec
li $a0, '\n'
li $v0, 11
syscall
li $v0, 10
syscall
putDec:
li $v0, 1
syscall
jr $ra
mystery:
bne $0, $a0, recur
li $v0, 0
jr $ra
recur:
sub $sp, $sp, 8
sw $ra, 4($sp)
sub $a0, $a0, 1
jal mystery
sw $v0, 0($sp)
jal mystery
lw $t0, 0($sp)
addu $v0, $v0, $t0
addu $v0, $v0, 1
add $a0, $a0, 1
lw $ra, 4($sp)
add $sp, $sp, 8
jr $ra
标签“神秘”的一切都很好,它只是作为一种形式来实际输入参数并在之后打印。我遇到的问题是获取高于 3 的值以打印出正确的数字。如果有人能看到我在哪里犯了错误,我们将不胜感激。谢谢
【问题讨论】:
-
当你在调试器中运行它时发生了什么?
-
在堆栈溢出上发布这个似乎是正确的。注意:阿克曼函数可能会更快。
-
当我在 MARs 中运行它时,它会打印 3 和 7。
-
如果有任何帮助,我将 putDec 中的 "li $v0, 11" 行更改为 "li $v0, 1" (是一个错误),同样当输入 3 作为参数时打印 6 我相信而不是 7。