MIPS代码问题:输入5元素数组无法停止,请求错误排查
MIPS代码问题分析与修正
原代码核心错误
- 输入无循环逻辑:输入操作仅执行一次,没有跳转回判断步骤重复获取输入,终止条件仅在首次输入前检查一次,无法控制输入次数。
- 打印阶段指针未重置:进入
print时,$t0仍指向数组末尾的下一个地址,无法读取数组开头元素。 - 打印指令使用错误:
sw $t3, ($t0)是将寄存器值存入数组,而我们需要从数组读取值到寄存器,应使用lw指令。 - 打印无循环结构:打印逻辑仅执行一次,无法遍历数组所有元素。
- 拼写错误:
.globl指令漏写开头的点号(原代码写为globl),会导致汇编报错。
修正后的代码
.data numbers: .space 20 msg1: .asciiz "Enter 5 numbers:\n" space: .asciiz " " # 用于元素间分隔 .text .globl main main: la $t0, numbers # 保存数组起始地址 li $t1, 0 # 计数器(累计字节数,初始为0) # 打印提示信息 li $v0, 4 la $a0, msg1 syscall input_loop: # 判断是否已输入5个元素(总字节数20) beq $t1, 20, print # 获取用户输入 li $v0, 5 syscall move $t2, $v0 sw $t2, ($t0) # 将输入存入数组 addi $t0, $t0, 4 # 移动数组指针到下一个元素 addi $t1, $t1, 4 # 计数器累加4字节(一个int的大小) j input_loop # 跳回循环开头继续输入 print: la $t0, numbers # 重置数组指针到起始地址 li $t1, 0 # 重置计数器 print_loop: beq $t1, 20, end lw $t3, ($t0) # 从数组读取元素到寄存器 # 打印当前元素 li $v0, 1 move $a0, $t3 syscall # 打印空格分隔元素 li $v0, 4 la $a0, space syscall # 更新指针和计数器 addi $t0, $t0, 4 addi $t1, $t1, 4 j print_loop # 跳回循环开头继续打印 end: li $v0, 10 syscall
修正说明
- 添加输入循环:新增
input_loop标签,输入完成后通过j input_loop跳转回判断条件,实现重复输入直到满5个元素。 - 重置打印指针:进入
print阶段后,重新加载数组起始地址到$t0,确保从第一个元素开始读取。 - 修正读取指令:将错误的
sw替换为lw,正确从数组读取元素到寄存器。 - 添加打印循环:新增
print_loop标签,实现遍历数组所有元素并打印。 - 修复拼写错误:补全
.globl指令的点号,确保汇编正常执行。 - 优化输出格式:添加空格分隔符,提升打印结果的可读性。
内容的提问来源于stack exchange,提问作者Rain Black
相关产品推荐
相关产品推荐

