在LC-3装配中打印二进制数

时间:2017-04-09 01:45:42

标签: assembly lc3

我尝试使用LC-3组件将二进制数打印到控制台。

到目前为止,我所尝试的内容包括(但并不仅限于此):

        binary .fill b10000110
        lea r0, binary
        puts ; prints garbage
        ld r0, binary
        out ; prints 0 (I know it only prints one character but I don't know why it chooses to print 0)
        lea r1, binary
        and r2, r2, #0
loop    ldr r0, r1, r2
        out
        add r2, r2, #1
        and r3, r3, #0
        not r3, r2
        add r3, r3, #1
        add r3, r3, #8 ; I know all the binary numbers will be exactly 8 bits long
        brz end
        add r3, r3, #0 ; to be safe
        brnzp loop
end
        ; more code...

这些都不是特别好。我把头发拉出来试图弄清楚这样做的正确方法,但我想到的一切依赖于binary是一个字符串,我无法做到。< / p>

1 个答案:

答案 0 :(得分:2)

在LC-3中,OUT陷阱子程序获取当前存储在寄存器R0中的值,找到相应的ASCII值并将其输出到控制台,同时PUT陷阱子程序将存储在R0中的值作为内存,并遍历存储在该地址的所有数据,将每个字节作为ASCII输出到控制台,直到找到NULL字符。

在您给出的示例中,PUTS将打印出b10000110的ASCII表示,然后是垃圾,直到碰到一个NULL字符,而OUT将只打印ASCII表示b10000110

随后,要实际打印0或1,我们必须打印这些数字的ASCII表示,而不是数字本身。因此,我们定义了两个单词,一个用于ASCII字符0,另一个用于1

ascii0  .fill x30
ascii1  .fill x31

因此,对于任何1位数字,我们可以使用简单的if-else分支和OUT子例程将其打印到控制台。

binary  .fill b1
        LD  R1, binary
        AND R0, R1, #1
        BRnz else
        LD  R0, ascii1
        BRnzp done
else    LD  R0, ascii0
done    OUT

现在,我们必须将其扩展为n位。也就是说,我们必须将我们的n位数字分解成一系列我们可以轻松打印的1位数字。为了实现这一点,我们所需要的只是一个简单的AND和一个i th 位的掩码(例如,给定8位数b10000110,以确定3 rd 最低有效位,我们将使用掩码b00000100)。因此,对于8位数字,我们需要掩码序列b10000000b01000000,...,b00000001。有几种方法可以做到这一点,例如从b10000000开始,每个位左移/乘2,但为了简单起见,我们将使用查找表。

masks   .fill b10000000
        .fill b01000000
        .fill b00100000
        .fill b00010000
        .fill b00001000
        .fill b00000100
        .fill b00000010
        .fill b00000001

要在打印每个位之前选择掩码,我们可以使用简单的for循环分支。

        AND R4, R4, #0   ;clears the register we will count with
        LD  R1, binary
        LEA R2, masks    ;finds the address in memory of the first mask
loop    LDR R3, R2, #0   ;load the mask from the address stored in R2
        ADD R2, R2, #1   ;next mask address
        AND R0, R1, R3
        ;print out 1-bit number
        ADD R4, R4, #1
        ADD R0, R4, #-8  ;sets condition bit zero when R4 = 8
        BRn loop         ;loops if R4 < 8

最后,我们完成了已完成的计划。

        .ORIG x3000

        AND R4, R4, #0   ;clears the register we will count with
        LD  R1, binary
        LEA R2, masks    ;finds the address in memory of the first mask
loop    LDR R3, R2, #0   ;load the mask from the address stored in R2
        ADD R2, R2, #1   ;next mask address
        AND R0, R1, R3
        BRnz else 
        LD  R0, ascii1
        BRnzp done
else    LD  R0, ascii0
done    OUT
        ADD R4, R4, #1
        ADD R0, R4, #-8  ;sets condition bit zero when R4 = 8
        BRn loop         ;loops if R4 < 8
        HALT

masks   .fill b10000000
        .fill b01000000
        .fill b00100000
        .fill b00010000
        .fill b00001000
        .fill b00000100
        .fill b00000010
        .fill b00000001
ascii0  .fill x30
ascii1  .fill x31
binary  .fill b10000110
        .END