You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MIPS汇编实现多项式3x²-4x+1时出现双输出异常问题

MIPS汇编多项式计算问题修复(3x²-4x+1,0≤x≤7)

核心问题排查

  1. 双输出根源:程序未正确终止
    Poly标签执行完结果打印后,没有调用退出系统调用,会继续执行后续的under标签代码,导致打印完计算结果后又输出错误提示,再回到主循环,形成双输出。
  2. 约束判断错误
    当前用bge $t0, $t1, over($t1=7),会把合法输入x=7判定为超出范围,不符合0≤x≤7的要求。
  3. 寄存器冗余使用
    计算过程中重复复用同一寄存器(如$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:55:26