我似乎无法找到我的算法错误,我的具体问题是我似乎为控制台中输入的所有整数打印相同的值:这是我的代码
main:
li $v0, 5
syscall
jal factorial
li $v0, 10
syscall
factorial:
###preamble###
subu $sp, $sp, 32
sw $ra, 28($sp)
sw $fp, 24($sp)
addu $fp, $sp, 32
sw $a0, 20($fp)
###preamble###
lw $v0, 20($fp)
bgtz $v0, multiply
li $v0, 1
j end
multiply:
lw $v1, 20($fp)
subu $v0, $v1, 1
move $a0, $v0
jal factorial
lw $v1, 20($fp)
li $t3, 0
li $t2, 1
b multi
multi:
beq $t2, $v0, endLOOP
add $t3, $t3, $v1
add $t2, $t2, 1
b multi
endLOOP:
move $v0, $t3
end:
lw $ra, 28($sp)
lw $fp, 24($sp)
addu $sp, $sp, 32
move $a0, $v0
li $v0, 1
syscall
jr $ra
在这段代码中我似乎总是打印一个值10,而在我的第二个代码中,我总是得到一个11
main:
li $v0, 5
syscall
jal factorial
li $v0, 10
syscall
factorial:
###preamble###
subu $sp, $sp, 32
sw $ra, 28($sp)
sw $a0, 24($sp)
li $v0, 1
ble $a0, $zero, end
b multiply
###preamble###
multiply:
addi $a0, $a0, -1
jal factorial
lw $a0, 24($sp)
b multi
multi:
beq $t2, $v0, endLOOP
add $t3, $t3, $a0
add $t2, $t2, 1
b multi
endLOOP:
move $v0, $t3
end:
lw $ra, 28($sp)
addu $sp, $sp, 32
move $a0, $v0
li $v0, 1
syscall
jr $ra
另外,请注意我们不允许使用mult功能,所以请不要问我为什么不使用它。谢谢你的帮助:D
答案 0 :(得分:1)
我发现您的代码存在一些问题:
li $v0, 5
syscall
jal factorial
syscall
5(read_int
)将返回$v0
中的值,因此当您第一次输入factorial
时,您将在{{1}中输入参数}}。您可以通过在$v0
之前将值移至$a0
来解决此问题。
jal
li $v0, 1
syscall
这种印刷品在阶乘函数之外不会更有意义吗?由于jr $ra
应该包含函数的返回值,因此请考虑从$v0
返回到factorial(2)
时会发生什么,并且您已使用值1覆盖factorial(3)
。 / p>