我正在尝试编写一个小人计算机程序,它输出我有多少正数和我有多少负数,但它也将负数视为正数。
这是我到目前为止所拥有的:
LOOP IN
STO NUM
BRZ END
BRP POS
POS LDA ZERO
ADD UN
STO ZERO
END LDA ZERO
OUT
BR LOOP
HLT
NUM DAT 000
UN DAT 001
ZERO DAT 000
我正在尝试编写一个小人计算机程序,它输出我有多少正数和我有多少负数,但它也将负数视为正数。
这是我到目前为止所拥有的:
LOOP IN
STO NUM
BRZ END
BRP POS
POS LDA ZERO
ADD UN
STO ZERO
END LDA ZERO
OUT
BR LOOP
HLT
NUM DAT 000
UN DAT 001
ZERO DAT 000
规范不支持为 LMC 提供负输入。LMC 存储单元只能保存 0 到 999 之间的值(来源:维基百科)。“负面”的唯一概念由 LMC 的负面标志表示。并且该标志仅ADD
由or的执行设置,SUB
因此不是由INP
/或/设置(拼写不同)。另见伊恩的这些笔记!D. Allen 讨论了这个令人困惑的概念。IN
LDA
STA
STO
这实际上意味着您的BRP
指令将始终分支到提供的标签。
您可能会发现实际上允许负输入的模拟器,但这将是对原始规范的扩展。
现在,你的代码也有这个BRP POS
指令的问题,因为它只是跳转到下一行(标记为POS
),所以它是否分支实际上没有任何区别BRP
:它是一个无操作。
由于 LMC 中实际上并不存在负值,因此让我们做一些不同的练习:考虑以 10 的补码表示的输入,因此 500..999 将被视为负值(即 -500...-1) . 或者,当您执行INP
. 然后计算小于 500(正数)和非 500 的输入数(因为这些在解释为 10 的补码时为负数)。
LOOP INP
BRZ FINISH
SUB COMPARE
BRP ELSE
LDA LESS
ADD ONE
STA LESS
BRA LOOP
ELSE LDA NOTLESS
ADD ONE
STA NOTLESS
BRA LOOP
FINISH LDA LESS
OUT
LDA NOTLESS
OUT
HLT
LESS DAT
NOTLESS DAT
COMPARE DAT 500
ONE DAT 1
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.6/lmc.js"></script>
确保为程序提供最终的 0 值以输出结果。