为何我的MIPS程序无法正确输出目标寄存器$t0的值?
问题分析与修复
你的程序直接结束无输出的核心原因是循环条件判断逻辑错误,导致循环体完全没执行就进入了结束流程。
错误点拆解
在loop标签下的判断指令:
bge $t4, $t5, end
$t4存储的是数组元素总数10,$t5是初始为0的循环计数器。10 >= 0的判断结果为真,程序会直接跳转到end标签,根本不会遍历数组。此时$t0保持初始的0值,后续执行sgt $t0, $t0, $zero后仍为0,虽然会触发打印,但结果不符合预期,且你可能误以为无输出。
修复后的完整代码
将循环条件改为当计数器大于等于数组长度时退出循环:
.data list: .word 1, 2, -3, 4, 5, 6, 81, 7, 8, 9 .text main: la $a1, list li $a3, 81 move $t0, $zero li $t4, 10 # 数组元素个数 li $t5, 0 # 循环计数器 j loop loop: bge $t5, $t4, end # 修正条件:计数器>=元素总数时退出循环 lw $a2, 0($a1) seq $t1, $a2, $a3 add $t0, $t0, $t1 addi $a1, $a1, 4 addi $t5, $t5, 1 j loop end: sgt $t0, $t0, $zero # 将累计结果转为0/1:找到过81则为1,否则为0 li $v0, 1 move $a0, $t0 syscall
可选优化
如果想提升效率,可在找到目标值后直接跳出循环,无需遍历剩余元素:在add $t0, $t0, $t1之后添加一句bne $t1, $zero, end,一旦匹配到81就直接进入结束逻辑。
内容的提问来源于stack exchange,提问作者m. lekk
相关产品推荐
相关产品推荐

