1

我正在尝试编写一个小人计算机程序,它输出我有多少正数和我有多少负数,但它也将负数视为正数。

这是我到目前为止所拥有的:

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
4

1 回答 1

1

规范不支持为 LMC 提供负输入。LMC 存储单元只能保存 0 到 999 之间的值(来源:维基百科)。“负面”的唯一概念由 LMC 的负面标志表示。并且该标志ADD由or的执行设置,SUB因此不是由INP/或/设置(拼写不同)。另见伊恩的这些笔记!D. Allen 讨论了这个令人困惑的概念。INLDASTASTO

这实际上意味着您的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 值以输出结果。

于 2019-11-20T20:11:04.117 回答