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

MIPS汇编求和程序计算结果异常,请求错误排查

MIPS求和程序错误分析与修复

问题原因

你的程序输出错误主要源于以下几个问题:

  • 未转换后续数字的ASCII码:初始化时将第一个字符减48转为十进制,但后续读取的数字直接使用ASCII值(如'3'的ASCII是51),导致求和时加入错误数值。
  • 循环结束条件逻辑错误:当前判断beq $t1, 10, end_loop是检查下一个字符是否为换行符,这会导致处理完最后一个数字后,还会读取内存中未知的后续内容并加入求和,最终结果混乱。
  • 存在冗余代码:add $t3, $t3, 4这段代码未对逻辑产生任何作用,属于无用代码。

修正后的代码

.text
main:
    # 提示用户输入
    la  $a0, prompt
    li  $v0, 4
    syscall

    # 读取输入字符串
    li  $v0, 8
    la  $a0, string_input
    li  $a1, 1024
    move    $t0, $a0
    syscall

    # 初始化总和
    lb  $t2, ($t0)          # 读取第一个数字字符
    addi    $t2, $t2, -48   # 转为十进制数值
    addu    $t0, $t0, 1
    b   loop

loop:
    lb  $t3, ($t0)          # 读取符号(此处为'+')
    
    # 检查是否到达字符串末尾或换行符,是则结束循环
    beq $t3, 10, end_loop   # 换行符ASCII为10
    beq $t3, 0, end_loop    # 字符串结束符ASCII为0
    
    addu    $t0, $t0, 1     # 移动到下一个数字字符位置
    lb  $t1, ($t0)          # 读取数字字符
    addi    $t1, $t1, -48   # 转为十进制数值
    
    add $t2, $t2, $t1       # 累加到总和
    addu    $t0, $t0, 1     # 移动到下一个符号位置

    b   loop                # 继续循环

end_loop:
    # 输出总和
    move    $a0, $t2
    li  $v0, 1
    syscall
    
    # 退出程序
    li  $v0, 10
    syscall

.data
string_input:   .space  1024
prompt:     .asciiz "Enter a sum:\n"

关键修改说明

  1. 统一数字字符转换:每次读取到数字字符后,都执行addi $t1, $t1, -48将ASCII码转为对应的十进制数值。
  2. 修正循环结束逻辑:进入循环后先读取符号位,检查符号位是否为换行符或字符串结束符,是的话直接结束循环,避免读取无效内存内容。
  3. 调整指针移动顺序:先确认符号不是结束符,再移动指针读取数字,处理完成后移动到下一个符号位置,确保每次循环正确处理一个"+数字"单元。
  4. 移除冗余代码:删除了无意义的add $t3, $t3, 4代码。

测试输入2+3+6时,程序会正确计算2+3+6=11并输出。

内容的提问来源于stack exchange,提问作者Marie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:31:02