如何在LMC中无需存再加载重置NEG标志并修复均值计算bug
LMC三数向下取整均值程序的Bug修复
原程序用于计算3个输入值之和的向下取整均值,代码如下:
LDA zro STO r STO cnt LDA t STO abc lp IN STO a div LDA a SUB t ADD r BRP x BRZ x BR y x STO a LDA cnt ADD one STO cnt LDA zro STO r BR div y ADD t STO r LDA abc SUB one STO abc BRZ out BR lp out LDA cnt OUT HLT a DAT 000 t DAT 003 cnt DAT 000 one DAT 001 abc DAT 003 r DAT 000 zro DAT 000
问题现象
程序在0-999的输入范围内大部分情况正常,但部分输入会得到比预期小1的结果:比如输入4 4 2时输出2(正确结果应为3),输入596 165 2时输出253(正确结果应为254)。
Bug原因
NEG标志位未在加载新输入值前重置,导致后续的分支判断(BRP/BRZ)错误沿用了上一次循环的标志状态,最终统计的整除次数少了1。
最少指令修复方案
在lp标签后的IN指令之后、STO a指令之前,新增一条ADD zro指令(用SUB zro效果完全一致):
lp IN ADD zro # 新增:重置标志位,不改变输入值 STO a
修复原理
LMC中,执行ADD zro时,累加器里刚输入的数值不会改变,但会强制重置所有标志位(包括NEG、ZERO、POS)。这样后续进入div循环时,分支判断会基于当前输入值的运算结果重新设置标志,不会受上一次循环的标志残留影响。这条指令既满足了「无需存储再加载」的要求,又只用1条指令就修复了Bug。
验证:输入4 4 2时程序会正确输出3;输入596 165 2时输出254,完全符合预期。
内容的提问来源于stack exchange,提问作者Harry Barry
相关产品推荐
相关产品推荐

