如何在小人电脑中检查数字是奇数还是偶数
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>
您可以 运行 此代码段中的模拟器,然后使用按钮逐步执行代码。
我需要帮助使我的程序产生正确的输出。
我目前正在使用这段代码:
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>
您可以 运行 此代码段中的模拟器,然后使用按钮逐步执行代码。