如何在小人电脑中检查数字是奇数还是偶数

How to check if a number is odd or even in little man computer

我需要帮助使我的程序产生正确的输出。

我目前正在使用这段代码:

        INP
        STA NUMBER
        SUB DIVISOR
        BRP VERIFY
        BRA CHECK
LOOP    STA NUMBER
        LDA RESULT
        ADD ONE
        STA RESULT
VERIFY  LDA NUMBER
        SUB DIVISOR
        BRP LOOP
        LDA RESULT
ODD     LDA ONE
        STA RESULT
EVEN    LDA 60
        STA RESULT 
CHECK   LDA RESULT
        BRP ODD
        BRZ EVEN
        OUT
        HLT
NUMBER  DAT
DIVISOR DAT 2
ONE     DAT 1
RESULT  DAT 0

当我在 little man 计算机模拟器上 运行 上面的代码时,它只是循环和循环并且不打印任何输出。我想做的是将输入的数字分成两部分并检查它是否有余数。如果有余数,则为奇数,否则为偶数。我知道代码有错误,但我无法确定问题出在哪里,也许你可以帮我解决。提前致谢!

无限循环发生在BRP ODD。请注意,当累加器为零时,BRP 也会分支。所以它是一个“非负分支”指令。当在 ODD 处继续执行时,它会下降到 EVEN,这使得 ODD 处的代码变得无关紧要。在 EVEN 处,累加器加载了零,因此 BRP 将再次分支......无限。

还缺少对 0 的检查:当输入为零时,根本不应该执行减法。

没问题,但是引用 60 号邮箱可以更好地替换为引用标签,例如 ZERO

该代码包含确实没有必要的逻辑:

您包含了计算 的代码,因为每次您减去 DIVISOR 时代码都会将 ONE 添加到 RESULT来自 NUMBER。然而,RESULT 最终被 ONE 或零(地址 60)覆盖,因此商没有计算出来。由于您只想输出输入是奇数还是偶数,因此您应该从代码中删除商计算。

同时避免代码重复。您目前在两个不同的地方执行 SUB。这应该不是必需的,因为两种情况下的逻辑应该相同。

这是简化为基础的代码:

#input: 11
        INP
        STA NUMBER
LOOP    BRZ OUTPUT  # remainder is zero! so output a zero
        SUB DIVISOR
        BRP LOOP
        LDA ONE   # when result is negative, input was odd
OUTPUT  OUT
        HLT
NUMBER  DAT
DIVISOR DAT 2
ONE     DAT 1
ZERO    DAT 0


<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.816/lmc.js"></script>

您可以 运行 此代码段中的模拟器,然后使用按钮逐步执行代码。