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

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

修正说明

  1. 添加输入循环:新增input_loop标签,输入完成后通过j input_loop跳转回判断条件,实现重复输入直到满5个元素。
  2. 重置打印指针:进入print阶段后,重新加载数组起始地址到$t0,确保从第一个元素开始读取。
  3. 修正读取指令:将错误的sw替换为lw,正确从数组读取元素到寄存器。
  4. 添加打印循环:新增print_loop标签,实现遍历数组所有元素并打印。
  5. 修复拼写错误:补全.globl指令的点号,确保汇编正常执行。
  6. 优化输出格式:添加空格分隔符,提升打印结果的可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:25:22