请求修复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, 4blez→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
相关产品推荐
相关产品推荐

