MIPS32使用栈实现递归乘法无输出问题排查
MIPS递归乘法代码问题排查与修复
核心问题列表
- 未正确调用递归函数:输入获取完成后没有使用
jal mult触发递归调用,直接顺次进入mult标签执行,递归结束后jr $ra无法正确回到main函数的输出逻辑,导致程序跑飞无输出 - 递归终止条件逻辑错误:当前判断
$a0(被乘数) == 1作为终止条件,不符合重复加法累加逻辑,应该判断$a1(乘数) == 1作为终止边界,乘数代表被乘数的累加次数 - 终止态返回值未初始化:终止分支中
add $v0, $v0, 0使用了未初始化的$v0原值(此时$v0是之前读取输入的系统调用号5,值错误),终止时乘积直接等于被乘数,应该赋值move $v0, $a0 - 栈保存逻辑缺失:递归过程中修改了
$a1寄存器,但未将$a1入栈保存,递归返回后上层的$a1值会被破坏 - 输出逻辑完全错误:计算完成的结果存储在
$v0寄存器中,现有输出逻辑错误读取未赋值的multiplicand内存空间,且指令顺序错误覆盖了读取值,最终输出内容不符合预期
修复后可运行代码
.text main: # 保存main的返回地址,防止调用递归后丢失 addiu $sp, $sp, -4 sw $ra, 0($sp) # 打印第一个提示,输入被乘数 li $v0, 4 la $a0, prompt1 syscall # 读取被乘数存入$a0 li $v0, 5 syscall move $a0, $v0 # 打印第二个提示,输入乘数 li $v0, 4 la $a0, prompt2 syscall # 读取乘数存入$a1 li $v0, 5 syscall move $a1, $v0 # 正确调用递归乘法函数 jal mult # 输出计算结果 move $a0, $v0 li $v0, 1 syscall # 恢复栈,结束程序 lw $ra, 0($sp) addiu $sp, $sp, 4 li $v0, 10 syscall # 递归乘法函数:$a0=被乘数,$a1=乘数,$v0=乘积 mult: addiu $sp,$sp, -12 # 栈空间存$ra、$a0、$a1三个寄存器 sw $ra, 0($sp) sw $a0, 4($sp) sw $a1, 8($sp) # 终止条件:乘数为1时,返回被乘数本身 bne $a1, 1, else move $v0, $a0 j mult_exit else: # 乘数减1,递归调用 sub $a1, $a1, 1 jal mult # 递归返回后,累加本次的被乘数到结果 lw $a0, 4($sp) add $v0, $v0, $a0 mult_exit: # 恢复栈寄存器,返回 lw $ra, 0($sp) lw $a0, 4($sp) lw $a1, 8($sp) addiu $sp, $sp, 12 jr $ra .data prompt1: .asciiz "Enter the multiplicand: " prompt2: .asciiz "Enter the multiplier: "
测试验证
输入被乘数7、乘数9,程序会输出正确结果63。
内容的提问来源于stack exchange,提问作者Zfreeman4
相关产品推荐
相关产品推荐

