如何将数字最多取64并以000 000二进制格式输出

问题描述

目标是接受一个最大为64的数字,并以000 000格式以二进制形式输出,因此以两个十进制值进行编码。我知道LMC不允许输出数字如010,所以也可以接受11 100这样的格式。

到目前为止,这是我的代码

        INP
        STO INPUT
        SUB SUB64
        BRP END
        LDA INPUT
        SUB SUB32
        BRP SET_32
RET_32  LDA INPUT
        SUB SUB16
        BRP SET_16
RET_16  LDA INPUT
        SUB SUB8
        BRP SET_8
RET_8   LDA INPUT
        SUB SUB4
        BRP SET_4
RET_4   LDA INPUT
        SUB SUB2
        BRP SET_2
RET_2   LDA INPUT
        SUB SUB1
        BRP SET_1
RET_1   OUT OUTPUT_2
        OUT OUTPUT_1
END     HLT
SET_1   STO INPUT
        LDA OUTPUT_1
        ADD ADD1
        STO OUTPUT_1
        BRA RET_1
SET_2   STO INPUT
        LDA OUTPUT_1
        BRA RET_2
SET_4   STO INPUT
        LDA OUTPUT_1
        ADD ADD100
        STO OUTPUT_1
        BRA RET_4
SET_8   STO INPUT
        LDA OUTPUT_2
        ADD ADD1
        STO OUTPUT_2
        BRA RET_8
SET_16  STO INPUT
        LDA OUTPUT_2
        ADD ADD10
        STO OUTPUT_2
        BRA RET_16
SET_32  STO INPUT
        LDA OUTPUT_2
        ADD ADD100
        STO OUTPUT_2
        BRA RET_32
OUTPUT_1 DAT 000
OUTPUT_2 DAT 000
INPUT   DAT 000
SUB64   DAT 64
SUB32   DAT 32
SUB16   DAT 16
SUB8    DAT 8
SUB4    DAT 4
SUB2    DAT 2
SUB1    DAT 1
ADD1    DAT 1
ADD10   DAT 10
ADD100  DAT 100

使用输入63运行此命令将输出101101,因此它以正确的格式输出,但不能始终如一地工作:对于输入62,这将输出两个-1。

我应该怎么做才能做到这一点?

解决方法

您的代码中有两个问题(问题末尾的更新版本):

  1. OUT不带参数。 OUT将输出累加器中的所有内容。因此更改:

    OUT OUTPUT_2
    OUT OUTPUT_1
    

    收件人:

    LDA OUTPUT_2
    OUT
    LDA OUTPUT_1
    OUT
    
  2. 对于SET_2,您忘记添加10。需要在此处添加以下两个说明:

    ADD ADD10
    STO OUTPUT_1
    

这是更正的代码:

#input:63
        INP
        STO INPUT
        SUB SUB64
        BRP END
        LDA INPUT
        SUB SUB32
        BRP SET_32
RET_32  LDA INPUT
        SUB SUB16
        BRP SET_16
RET_16  LDA INPUT
        SUB SUB8
        BRP SET_8
RET_8   LDA INPUT
        SUB SUB4
        BRP SET_4
RET_4   LDA INPUT
        SUB SUB2
        BRP SET_2
RET_2   LDA INPUT
        SUB SUB1
        BRP SET_1
RET_1   LDA OUTPUT_2
        OUT
        LDA OUTPUT_1
        OUT
END     HLT
SET_1   STO INPUT
        LDA OUTPUT_1
        ADD ADD1
        STO OUTPUT_1
        BRA RET_1
SET_2   STO INPUT
        LDA OUTPUT_1
        ADD ADD10
        STO OUTPUT_1
        BRA RET_2
SET_4   STO INPUT
        LDA OUTPUT_1
        ADD ADD100
        STO OUTPUT_1
        BRA RET_4
SET_8   STO INPUT
        LDA OUTPUT_2
        ADD ADD1
        STO OUTPUT_2
        BRA RET_8
SET_16  STO INPUT
        LDA OUTPUT_2
        ADD ADD10
        STO OUTPUT_2
        BRA RET_16
SET_32  STO INPUT
        LDA OUTPUT_2
        ADD ADD100
        STO OUTPUT_2
        BRA RET_32
OUTPUT_1 DAT 000
OUTPUT_2 DAT 000
INPUT   DAT 000
SUB64   DAT 64
SUB32   DAT 32
SUB16   DAT 16
SUB8    DAT 8
SUB4    DAT 4
SUB2    DAT 2
SUB1    DAT 1
ADD1    DAT 1
ADD10   DAT 10
ADD100  DAT 100


<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.7/lmc.js"></script>

根据您的规范,这将输出两个十进制数字,其中的数字应解释为二进制。如前所述,这可能会造成混淆。例如,对于输入9,输出为1 1而不是001 001。

如果要显示每个 二进制数字,请考虑输出6个值而不是2个,并让每个输出为0或1。在这种情况下,9的输出为0 0 1 0 0 1。

请参见this answer,了解如何实现这一目标。

,

您可以打印最高有效位,然后乘以2(左移1),直到达到要打印的数字的位长。例如:

n = 01100100 # 0
SHL(n,1)
n = 11001000 # 1
SHL(n,1)
n = 10010000 # 1
SHL(n,1)
n = 00100000 # 0
SHL(n,1)
n = 01000000 # 0
SHL(n,1)
n = 10000000 # 1
SHL(n,1)
n = 00000000 # 0
SHL(n,1)
n = 00000000 # 0 (number is 8-bits so we don't stop until we print 8 digits.)
----------------------
Result: '01100100'