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

MIPS程序出现无限循环,循环值增量逻辑异常问题排查

无限循环根因定位
  • 第一个死循环点在IsAmicable的循环逻辑:
    每次进入loop分支第一行就执行la $a1, ($t4),而$t4存储的是初始传入的最小值,相当于每轮循环都会把迭代变量$a1重置回初始值,哪怕后续执行了addi $a1, $a1, 1,下一轮循环直接被覆盖,永远不可能等于$a2,直接触发死循环。
  • 第二个逻辑错误在IsFactor的循环逻辑:
    1. 进入loop2第一行执行move $a0, $v0,而$v0在IsAmicable入口被设为1,直接覆盖了之前赋值的要计算因数的目标值,导致循环判断条件bgt $a3, $a0, continue的阈值固定为1,$a3累加至2就触发跳转,无法正常计算所有因数。
    2. 没有遵循MIPS函数调用规范:IsFactor里执行jal loop2后,loop2结束直接跳转至IsAmicable里的continue标签,不会通过$ra返回IsAmicable的调用位置,函数调用逻辑完全混乱。
    3. 在IsFactor里修改了$a2、$a3等寄存器的值,会覆盖IsAmicable里存储的最大值等关键数据,进一步破坏循环判断条件。
循环增量逻辑异常问题

当前增量逻辑完全无法正常工作:

  • 迭代变量$a1每轮被重置,增量操作相当于无效,永远无法达到循环退出阈值。
  • IsFactor内部错误修改IsAmicable用到的寄存器,导致最大值、当前迭代值等数据被意外篡改,进一步导致循环判断失效。
简易修复建议
  1. 把IsAmicable中la $a1, ($t4)这行移到loop标签之前,不要放在循环体内,避免每次重置迭代变量。
  2. 规范MIPS函数调用:使用栈保存$ra、需要保留的寄存器值,函数执行结束后用jr $ra返回调用方,不要跨函数直接跳转标签。
  3. 不要在IsFactor里修改$a2(存储最大值的寄存器),换用其他临时寄存器存储因数和。
  4. 计算真因数时,循环上限设置为目标数的一半即可,同时排除目标数本身,避免求和结果错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:45:03