这里是MIPS的入门者。我编写了此程序,以从用户输入中获取一个整数,并使用一个函数来输出n!的值。由于某种原因,我得到的数字是不正确的(12代表4!)。我不确定为什么我的fac方法看起来有用吗?非常感谢您对我的代码进行调整的帮助!
.text
.globl main
main:
li $v0, 5
syscall
ble $v0, 0, ZeroNeg
move $a0, $v0
jal fac
move $a0, $v0
li $v0, 1
syscall
li $v0, 10
syscall
fac:
#spill registers
addi $sp, $sp, -20
sw $ra, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $s2, 12($sp)
sw $s3, 16($sp)
loop:
move $s0, $a0 # s0 = n
addi $s1, $zero, 1
ble $a0, $s1, done
addi $a0, $a0, -1
addi $s2, $s0, -1 # s2 = n-1
beq $s3, $zero, sets3
c:
mul $s3, $s3, $s2
addi $s0, $s0, -1
jal fac
done:
move $v0, $s3
#unspill registers
lw $ra, 0($sp)
lw $s0, 4($sp)
lw $s1, 8($sp)
lw $s2, 12($sp)
lw $s3, 16($sp)
addi $sp, $sp, 20
jr $ra
sets3:
add $s3, $zero, $s0
j c
ZeroNeg:
move $v0, $zero
li $v0, 1
syscall
li $v0, 10
syscall
您的函数应该是尾递归的,对吗?但是,您不必返回从递归jal fac
获得的返回值,而是使用move $v0, $s3
销毁它。
您嵌套最深的函数将返回正确的值,但随后您用保存/恢复的$s3
继续使用它。
$v0
尾递归后,您的返回值已经在jal fac
中;或至少应该如此。