MIPS汇编程序调试求助:读取用户输入三个数并计算输出其和与平均值的程序运行异常
分析并修复你的MIPS汇编程序问题
咱们一步步拆解你代码里的问题,然后逐个修正:
先看核心错误点
- 未保存第三个输入数字:你读取第三个数字的
syscall(li $v0,5)执行后,没把返回的输入值从$v0存到$t3里,直接就用$t3参与求和了——这时候$t3是未初始化的垃圾值,求和结果肯定不对。 - 除法指令用法错误:MIPS的
div指令不需要指定结果寄存器,它会把商存在$lo寄存器、余数存在$hi寄存器。你得先用div执行除法,再用mflo把商取出来用。 - 缺失平均值的提示输出:你直接输出了平均值数字,但没先打印
fnum("Average is: ")这个提示字符串,不符合你原本的输出需求。
修正后的完整代码
.data prompt: .asciiz "Enter number 1: " prompt2: .asciiz "Enter number 2: " prompt3: .asciiz "Enter number 3: " newline: .asciiz "\n" fnum: .asciiz "Average is: " snum: .asciiz "Sum is: " .text .globl main main: # 读取第一个数字 li $v0, 4 la $a0, prompt syscall li $v0, 5 syscall move $t1, $v0 # 读取第二个数字 li $v0, 4 la $a0, prompt2 syscall li $v0, 5 syscall move $t2, $v0 # 读取第三个数字(修复:保存输入值到$t3) li $v0, 4 la $a0, prompt3 syscall li $v0, 5 syscall move $t3, $v0 # 这行是你原本缺失的关键代码! # 计算三个数的和 add $t4,$t1,$t2 add $t4,$t4,$t3 # 输出和 li $v0, 4 la $a0, snum syscall move $a0, $t4 li $v0, 1 syscall li $v0, 4 la $a0, newline syscall # 计算并输出平均值(修复除法逻辑+添加提示) li $v0, 4 la $a0, fnum # 先打印平均值提示 syscall li $t5,3 div $t4, $t5 # 被除数$t4,除数$t5,商自动存在$lo寄存器 mflo $t6 # 把商从$lo转移到$t6 move $a0, $t6 li $v0, 1 syscall # 程序正常退出(避免后续执行未知代码) li $v0, 10 syscall
关键修正说明
- 保存第三个输入值:添加
move $t3, $v0确保第三个输入的数值被正确存储,能正常参与求和计算。 - 正确使用除法指令:
- 用
div $t4, $t5表示将总和$t4除以3($t5) - 用
mflo $t6把除法得到的商从$lo寄存器取出,用于后续输出
- 用
- 补全平均值提示:在输出平均值前先打印
fnum字符串,符合你想要的输出格式 - 添加退出指令:最后加上
li $v0,10和syscall,让程序正常结束,避免出现异常行为
现在这个程序就能正常读取三个数字,正确计算并输出它们的和与平均值了。
内容的提问来源于stack exchange,提问作者user15514728
相关产品推荐
相关产品推荐

