问题描述
我需要帮助让我的程序产生正确的输出。
我目前正在使用此代码:
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>
您可以在此代码段中运行模拟器,然后使用按钮逐步执行代码。