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"
关键修改说明
- 统一数字字符转换:每次读取到数字字符后,都执行
addi $t1, $t1, -48将ASCII码转为对应的十进制数值。 - 修正循环结束逻辑:进入循环后先读取符号位,检查符号位是否为换行符或字符串结束符,是的话直接结束循环,避免读取无效内存内容。
- 调整指针移动顺序:先确认符号不是结束符,再移动指针读取数字,处理完成后移动到下一个符号位置,确保每次循环正确处理一个"+数字"单元。
- 移除冗余代码:删除了无意义的
add $t3, $t3, 4代码。
测试输入2+3+6时,程序会正确计算2+3+6=11并输出。
内容的提问来源于stack exchange,提问作者Marie
相关产品推荐
相关产品推荐

