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

How to take number up to 64 and output in a 000 000 binary format

目标是接受最大为 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 将输出 101 101,因此它以正确的格式输出,但工作不一致:对于输入 62,输出两个 -1

我应该怎么做才能完成这项工作?

您可以打印最高有效位,然后乘以 2 (left-shift 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'

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

  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 了解如何实现。