MARIE汇编子程序实现两数相乘陷入死循环问题排查求助
MARIE汇编乘法子程序无限循环问题排查
核心问题:循环终止条件错误
你的代码陷入无限循环的根源在于SKIPCOND指令的使用逻辑错误:
SKIPCOND 400的作用是当AC寄存器的值大于0时,跳过下一条指令。但你的循环逻辑需要在B减到0时终止,当前判断逻辑完全不符合预期:- 当B初始为3时,第一次循环后B变为2(AC=2>0),
SKIPCOND 400会跳过JUMP loop1,直接执行JUMPI subr提前退出,只完成1次累加(结果为2,而非预期的6)。 - 若循环意外进入B=0的情况,后续
LOAD B→0,SUBT One→-1,AC=-1<0,SKIPCOND 400不会跳过JUMP loop1,此后B会持续变为负数,AC始终小于0,永远无法触发跳过循环的逻辑,彻底陷入无限循环。
- 当B初始为3时,第一次循环后B变为2(AC=2>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
相关产品推荐
相关产品推荐

