MIPS汇编实现数组最大值查询程序触发无限循环问题求助
问题原因及修复方案
核心错误(导致无限循环)
你在参数传递阶段使用了错误的加载指令:
main函数中获取数组长度的代码为la $a0 N,la是加载地址指令,执行后$a0中存储的是标签N对应的内存地址,而非N中存储的数组长度值8。max函数中你把$a0的值赋值给了$t0作为循环终止的判断阈值,循环计数变量$t2是从1开始自增的小整数,永远不可能等于远大于8的内存地址值,因此循环永远不会触发退出条件,进入无限循环。- 修复方式:将
main中的la $a0 N修改为lw $a0 N,lw是加载字数据指令,会读取N地址中存储的数值8到$a0,循环判断逻辑就可以正常工作。
可选适配优化
- 部分MIPS汇编器要求指令的多个操作数之间用逗号分隔,你当前代码中所有指令都省略了逗号,如果你使用的汇编器编译时报错,可以给操作数之间补全逗号,例如改为
move $t0, $a0、addi $t2, $t2, 1即可。 - 按照MIPS寄存器使用规范,
$s系列寄存器属于被调用者保存寄存器,如果你后续扩展代码逻辑,建议在main函数开头先把用到的$s0寄存器值压栈保存,函数返回前再出栈恢复,避免寄存器值污染。
修改后的核心代码片段如下:
main: # 修复加载数组长度的指令 lw $a0 N la $a1 A jal max move $s0 $v0 # 后续原有逻辑保持不变即可
修复完成后运行程序会正常输出结果:The max value is: 100。
内容的提问来源于stack exchange,提问作者El_Gfm
相关产品推荐
相关产品推荐

