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

请求修复MIPS代码并替换禁用指令:实现整数列表最小值计算

修复MIPS代码:读取整数列表并计算最小值(替换禁用指令)

嘿,我帮你搞定了这段MIPS代码!不仅修正了原代码完全偏离需求的逻辑问题,还把所有禁用的指令(li、blez、bnez、move)都替换成了合规的基础指令,完美实现原Python代码的功能——读取指定长度的整数列表并找出最小值。

原代码的核心问题

原MIPS代码有两个致命问题:

  • 逻辑完全走偏:原Python是读取列表找最小值,但原MIPS居然把输入的列表大小做了累加操作,完全没实现需求功能
  • 用了禁用指令:li、blez、bnez、move这些指令都在禁用清单里,必须替换

修复后的完整代码

.data
prompt_size: .asciiz "Enter list size : "
prompt_element: .asciiz "Enter element "
colon: .asciiz ": "
result: .asciiz "The minimum element in this list is "
newline: .asciiz "\n"

.text
.globl main
main:
    # 打印输入列表大小的提示(替代li $v0,4)
    addi $v0, $zero, 4
    la $a0, prompt_size
    syscall

    # 读取列表大小(替代li $v0,5)
    addi $v0, $zero, 5
    syscall
    add $t0, $v0, $zero  # 存储列表大小到$t0,替代move $t0,$v0

    # 检查大小是否为负数:替代blez $v0, end
    slt $t1, $t0, $zero  # $t0 < 0时$t1=1,否则0
    beq $t1, $zero, size_valid  # 非负数则继续
    j end  # 负数直接结束

size_valid:
    # 检查大小是否为0(原Python仅在size>0时找最小值)
    slt $t1, $zero, $t0  # $t0>0时$t1=1,否则0
    beq $t1, $zero, end

    # 初始化索引$t1=0,准备读取第一个元素
    addi $t1, $zero, 0
    # 读取第一个元素作为初始最小值
    addi $v0, $zero, 4
    la $a0, prompt_element
    syscall
    addi $v0, $zero, 1
    add $a0, $t1, $zero
    syscall
    addi $v0, $zero, 4
    la $a0, colon
    syscall
    addi $v0, $zero, 5
    syscall
    add $t2, $v0, $zero  # 存储初始最小值,替代move $t2,$v0

    addi $t1, $t1, 1  # 索引跳到1,开始遍历剩余元素
loop_read_compare:
    # 检查索引是否超出列表大小:替代bnez的循环判断逻辑
    slt $t3, $t1, $t0  # $t1 < $t0时$t3=1,否则0
    beq $t3, $zero, print_result  # 索引超出则跳去打印结果

    # 打印当前元素的输入提示
    addi $v0, $zero, 4
    la $a0, prompt_element
    syscall
    addi $v0, $zero, 1
    add $a0, $t1, $zero
    syscall
    addi $v0, $zero, 4
    la $a0, colon
    syscall

    # 读取当前元素
    addi $v0, $zero, 5
    syscall
    add $t3, $v0, $zero  # 存储当前元素,替代move $t3,$v0

    # 比较当前元素和最小值:如果更小则更新最小值
    slt $t4, $t3, $t2  # 当前元素 < 最小值时$t4=1
    beq $t4, $zero, skip_update  # 不满足则跳过更新
    add $t2, $t3, $zero  # 更新最小值,替代move $t2,$t3

skip_update:
    addi $t1, $t1, 1  # 索引加1
    j loop_read_compare  # 回到循环继续处理下一个元素

print_result:
    # 打印结果提示
    addi $v0, $zero, 4
    la $a0, result
    syscall
    # 打印最小值,替代move $a0,$t2
    add $a0, $t2, $zero
    addi $v0, $zero, 1
    syscall
    # 打印换行
    addi $v0, $zero, 4
    la $a0, newline
    syscall

    j main  # 可选:回到开头重新运行程序

end:
    # 退出程序,替代li $v0,10
    addi $v0, $zero, 10
    syscall

关键修复细节

1. 禁用指令的替换方案

  • li → addi:所有立即数加载指令li $reg, imm都替换成addi $reg, $zero, imm,比如li $v0,4变成addi $v0, $zero, 4
  • blez → slt + beq + j:用slt先判断数值是否小于等于0,再通过beq和j实现跳转。比如原blez $v0, end的逻辑被拆成了判断和跳转的组合
  • bnez → slt + beq:同样用slt判断条件是否成立,再用beq跳转。比如循环终止判断就是通过slt检查索引是否小于列表大小实现的
  • move → add:所有寄存器间的赋值move $dst, $src都替换成add $dst, $src, $zero,比如move $a0, $t0变成add $a0, $t0, $zero

2. 逻辑功能的完善

  • 完全复刻了原Python的流程:读取列表大小→逐个读取元素→维护当前最小值→最后输出结果
  • 增加了对列表大小为0或负数的判断,和原Python的逻辑保持一致
  • 优化了输入提示文本,和原Python的提示语完全匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:40:49