1

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

我目前正在使用此代码:

        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

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

4

1 回答 1

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>

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

于 2021-06-16T20:32:54.627 回答