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

问题描述

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

我目前正在使用此代码

        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

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

解决方法

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

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

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

代码中包含了真正不需要的逻辑:

您已经包含了计算的代码,因为每次您从 ONE 中减去 RESULT 时,代码都会将 DIVISOR 添加到 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>

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