MIPS汇编递归计算3的阶乘结果错误(得4而非6)求修复
问题分析与修复
你的代码存在两个关键错误导致输出异常:
1. main函数中丢失阶乘结果
调用factorial后,阶乘结果存在$v0中,但你紧接着执行li $v0, 4(设置系统调用为打印字符串),直接覆盖了$v0里的结果。后续move $a0, $v0实际取的是4,因此输出4。
2. factorial函数递归计算逻辑错误
在递归调用前,你直接修改了$a0(addi $a0, $a0, -1)但未保存原始的n值,导致相乘时使用的是n-1而非原始n,违背了阶乘公式n! = n * (n-1)!。
修复后的完整代码
.data result_str: .asciiz "Factorial of 3 = " newline: .asciiz "\n" .text .globl main main: # Calculates the factorial of 3 li $a0, 3 jal factorial # 先保存阶乘结果到$s0,避免被后续系统调用覆盖 move $s0, $v0 # Prints the result string li $v0, 4 la $a0, result_str syscall # 打印阶乘结果 move $a0, $s0 li $v0, 1 syscall # Prints a newline li $v0, 4 la $a0, newline syscall # Exits program li $v0, 10 syscall factorial: # Save return address and original n value 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 # 保存原始n值到$s0 move $s0, $a0 # 计算n-1并递归调用 addi $a0, $a0, -1 jal factorial # 用原始n值乘以递归结果:n * (n-1)! mul $v0, $s0, $v0 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
修复说明
- main函数:在调用
factorial后立即将$v0中的结果转移到s0保存,避免后续系统调用修改$v0导致结果丢失。 - factorial函数:递归调用前将原始n值保存到
$s0,递归返回后用原始n值乘以(n-1)!的结果,符合阶乘的数学定义。
内容的提问来源于stack exchange,提问作者Aiden Haley
相关产品推荐
相关产品推荐

