我尝试使用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>
答案 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位数字,我们需要掩码序列b10000000
,b01000000
,...,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