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

MARIE汇编子程序实现两数相乘陷入死循环问题排查求助

MARIE汇编乘法子程序无限循环问题排查

核心问题:循环终止条件错误

你的代码陷入无限循环的根源在于SKIPCOND指令的使用逻辑错误:

  • SKIPCOND 400的作用是当AC寄存器的值大于0时,跳过下一条指令。但你的循环逻辑需要在B减到0时终止,当前判断逻辑完全不符合预期:
    1. 当B初始为3时,第一次循环后B变为2(AC=2>0),SKIPCOND 400会跳过JUMP loop1,直接执行JUMPI subr提前退出,只完成1次累加(结果为2,而非预期的6)。
    2. 若循环意外进入B=0的情况,后续LOAD B→0,SUBT One→-1,AC=-1<0,SKIPCOND 400不会跳过JUMP loop1,此后B会持续变为负数,AC始终小于0,永远无法触发跳过循环的逻辑,彻底陷入无限循环。

修复方案

将SKIPCOND 400替换为SKIPCOND 800,该指令的作用是当AC寄存器的值等于0时,跳过下一条指令。这样当B减到0(AC=0)时,会跳过JUMP loop1,执行JUMPI subr退出子程序,循环正常终止。

修正后的代码

ORG 100
    INPUT 
    STORE A
    INPUT 
    STORE B
    JNS subr
    JUMP result

subr,   HEX 0
loop1,  LOAD A
        ADD sum1
        STORE sum1
        LOAD B
        SUBT One
        STORE B
        SKIPCOND 800  ; 修改为判断AC=0时跳过循环跳转
        JUMP loop1
        JUMPI subr
        
result, LOAD sum1   
        OUTPUT  
        HALT
    
A,  DEC 0
B,  DEC 0
One,    DEC 1
sum1,   DEC 0

额外优化建议

子程序中直接修改了全局变量B的值,若主程序后续需要使用原始的B值会受到影响。可以在子程序开头将B存入临时变量,循环结束后恢复,提升代码健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:53:16