MIPS程序问题咨询:10整数数组求和代码故障排查
MIPS代码错误排查与修正
下面是对你提供的MIPS代码的错误分析,以及满足需求的修正版本:
关键错误(未达需求)
- 你的需求是让用户输入10个数组元素,但现有代码里
arr直接硬编码了固定值1,2,...,10,完全没有实现输入逻辑,这是最核心的问题。
语法错误
- 全局入口声明写错了:
globl main必须写成.globl main(开头的点不能少),否则汇编器无法识别main作为程序的入口符号。
注释与变量不匹配的小问题
la $t3, arr的注释写的是“load address of array into t4”,实际是把数组地址加载到t3,注释里的变量名写错了。slt $t4, $t0, $t2的注释描述成“$t4 = i < sum ? 1 : 0”,但实际是判断i < 10($t2存的是循环次数10),注释逻辑描述错误。
满足需求的完整修正代码
.data arr: .word 0:10 # 定义10个整数的数组,初始值设为0 prompt: .asciiz "请输入第%d个整数: " msg: .asciiz "Result: " .text .globl main main: addi $t0, $zero, 0 # 初始化循环计数器i=0 addi $t1, $zero, 0 # 初始化sum=0 ori $t2, $zero, 10 # 循环次数固定为10 la $t3, arr # 把数组的基地址加载到t3 input_loop: slt $t4, $t0, $t2 # 判断i是否小于10,是则t4=1,否则0 beq $t4, $zero, calc_sum # 输入完10个数后跳转到求和逻辑 # 打印输入提示 addi $v0, $zero, 4 la $a0, prompt syscall # 打印当前输入的序号(i+1) addi $v0, $zero, 1 addi $a0, $t0, 1 syscall # 打印换行,让输入更清晰 addi $v0, $zero, 11 li $a0, '\n' syscall # 读取用户输入的整数 addi $v0, $zero, 5 syscall # 将输入的数存入数组当前位置 sw $v0, 0($t3) addi $t0, $t0, 1 # 计数器i加1 addi $t3, $t3, 4 # 数组指针往后移4字节(一个整数的大小) j input_loop calc_sum: addi $t0, $zero, 0 # 重置计数器i为0 la $t3, arr # 重新加载数组基地址 sum_loop: slt $t4, $t0, $t2 beq $t4, $zero, print_result lw $t4, 0($t3) add $t1, $t1, $t4 # 把当前数组元素加到sum里 addi $t0, $t0, 1 addi $t3, $t3, 4 j sum_loop print_result: # 打印结果提示字符串 addi $v0, $zero, 4 la $a0, msg syscall # 打印求和的结果 addi $v0, $zero, 1 add $a0, $t1, $zero syscall # 正常退出程序 addi $v0, $zero, 10 syscall .end main
修正说明
- 数组改成预留空间的写法
.word 0:10,不再硬编码初始值,而是让用户输入填充。 - 添加了输入提示和用户输入的逻辑,循环读取10个整数存入数组。
- 修复了
.globl main的语法错误。 - 把输入、求和、打印拆成三个独立的循环,代码结构更清晰。
- 增加了程序退出的
syscall 10,避免部分MIPS模拟器出现异常。
内容的提问来源于stack exchange,提问作者wang
相关产品推荐
相关产品推荐

