在此代码中,我使用 MIPS Assembly,并尝试使用递归求 3 的阶乘。但我的输出应该是 6,但输出却是 4。下面是我的代码。
.data
result_str: .asciiz "Factorial of 3 = "
newline: .asciiz "\n"
.text
.globl main
main:
# Calculates the factorial of 3
li $a0, 3
jal factorial
# Prints the result
li $v0, 4
la $a0, result_str
syscall
move $a0, $v0
li $v0, 1
syscall
# Prints a newline
li $v0, 4
la $a0, newline
syscall
# Exits program
li $v0, 10
syscall
factorial:
# Save return address
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $s0, 0($sp)
# if n <= 1 return 1
li $t0, 1
ble $a0, $t0, base_case
addi $a0, $a0, -1 # save a0 to a new spot
jal factorial
move $s0, $v0
# Multiply
mul $v0, $a0, $s0
lw $ra, 4($sp)
lw $s0, 0($sp)
addi $sp, $sp, 8
jr $ra
base_case:
# If n <= 1 return 1
li $v0, 1
lw $ra, 4($sp)
lw $s0, 0($sp)
addi $sp, $sp, 8
jr $ra
我不确定它出了什么问题,我认为代码的阶乘部分有错误。
您不应该期望
$a0
在函数调用中幸存下来。
简单地保存递归调用返回值的副本并不是使用
$s0
的好方法。
使用
$s0
的方式可以在调用之前和之后使用,因为它在调用后仍然存在(通过遵守调用约定)。
在递归调用之前(但在函数序言之后)将
$s0
初始化为 $a0
的副本。
然后在递归调用后使用
$s0
乘以 $v0
。