MIPS汇编实现多项式3x²-4x+1时出现双输出异常问题
MIPS汇编多项式计算问题修复(3x²-4x+1,0≤x≤7)
核心问题排查
- 双输出根源:程序未正确终止
Poly标签执行完结果打印后,没有调用退出系统调用,会继续执行后续的under标签代码,导致打印完计算结果后又输出错误提示,再回到主循环,形成双输出。 - 约束判断错误
当前用bge $t0, $t1, over($t1=7),会把合法输入x=7判定为超出范围,不符合0≤x≤7的要求。 - 寄存器冗余使用
计算过程中重复复用同一寄存器(如$t3先存常数3,后存3x²结果),虽然逻辑可行,但可读性差且易引发隐含错误;同时将计算结果存回$t0覆盖了原始输入值,不利于后续扩展。
修复后的完整代码
.data prompt: .asciiz "Enter number between 0 and 7: " result: .asciiz "The result after putting it through 3x^2 - 4x + 1 is: " message: .asciiz "What you put was below 0.\n" message2: .asciiz "What you put was over 7.\n" .text .globl main main: # 提示用户输入 li $v0, 4 la $a0, prompt syscall # 获取用户输入 li $v0, 5 syscall # 保存输入值到$t0 move $t0, $v0 # 设置上限常数7 li $t1, 7 # 输入合法性判断 blez $t0, under bgt $t0, $t1, over # 修改为bgt,允许x=7 j Poly # 显式跳转到计算逻辑,流程更清晰 Poly: # 打印结果提示文本 li $v0, 4 la $a0, result syscall # 计算3x²:先求x²存到$t2,再乘3存到$t3 mult $t0, $t0 mflo $t2 li $t3, 3 mult $t2, $t3 mflo $t3 # 计算4x,结果存到$t4 li $t4, 4 mult $t0, $t4 mflo $t4 # 计算最终结果:3x² -4x +1 sub $t5, $t3, $t4 addi $t5, $t5, 1 # 用addi直接加1,减少寄存器占用 # 打印计算结果 li $v0, 1 move $a0, $t5 syscall # 调用退出系统调用,终止程序 li $v0, 10 syscall under: # 输入小于0时的错误提示 li $v0, 4 la $a0, message syscall j main over: # 输入大于7时的错误提示 li $v0, 4 la $a0, message2 syscall j main
修复细节说明
- 添加终止逻辑:在Poly标签的结果打印后,加入
li $v0,10和syscall,调用MIPS退出系统调用,彻底终止程序,解决双输出问题。 - 修正约束判断:将
bge改为bgt,确保x=7被纳入合法输入范围。 - 优化寄存器使用:用
addi指令直接完成加1操作,减少不必要的寄存器定义;简化寄存器移动步骤,提升代码可读性。 - 显式跳转:在合法性判断后添加
j Poly,让程序执行路径更直观。
内容的提问来源于stack exchange,提问作者EG88
相关产品推荐
相关产品推荐

