显示输入了多少个正数和负数

Show how many positive and negative numbers were input

我正在尝试编写一个 Little Man Computer 程序,输出我有多少个正数和多少个负数,但它也将负数视为正数。

这是我目前拥有的:

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 之间的值(来源:Wikipedia). The only notion of "negative" is represented by the LMC's negative flag. And that flag is only set by the execution of ADD or SUB, so not by INP/IN, LDA or STA/STO (spellings differ). See also these notes of Ian! D. Allen,他在其中讨论了这个令人困惑的概念。

这实际上意味着您的 BRP 指令将始终分支到提供的标签。

您可能会发现模拟器实际上允许负输入,但这将是对原始规范的扩展。

现在,你的代码也有这个 BRP POS 指令的问题,因为它只是跳到下一行(标记为 POS),所以实际上是否 BRP 是否会分支:这是一个空操作。

类似的练习

由于 LMC 中并不真正存在负值,让我们做一些不同的练习:考虑以 10 的补码表示的输入,因此 500..999 被视为负值(即 -500。 ..-1).或者,当您执行 INP 时,带符号的输入值实际上将存储在 10 的补码中。然后计算小于 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 值以输出结果。