1
我似乎无法找到我的错在我的算法,我的具体问题是,我似乎打印相同的值,在控制台输入的所有整数:这里是我的代码ASM语言:因子算法错误?
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
我得到你的答案的第一部分,我的问题,但对第二个,我不太明白。但为了让我和你的事情变得更加容易,我只会问我如何在控制台中打印factorial的最终值?我不太确定如何去做 –
_“第二个,我不太明白”_:我在说你用值1覆盖了返回值,这样当你按照你的方式工作时通过递归链返回“out”,无论“n”是什么,'factorial(n)'总是会从'factorial(n-1)'得到值1。我建议你在将_first_调用到'factorial'之后(即在'exit'' syscall'之前)移动print。 (我现在谈论你的第一个实现,我没有看第二个版本) – Michael
哦,我明白了。该程序现在工作正常。感谢您的帮助! :d –