LC-3 Десятичный в двоичный преобразователь
Мне нужно создать программу, которая преобразует заданный пользовательский ввод (десятичный) в его двоичное совпадение, когда пользователь нажимает ввод или выход, когда нажимает X. Может ли кто-нибудь дать указатель о том, как начать это назначение. Мы обязаны использовать маски и петли, но я не знаю, с чего начать.
1 ответ
Я написал это, потому что не так много примеров бинарных масок.
Бинарная маска полезна в сборке, потому что она дает нам возможность исследовать один бит в десятичном или шестнадцатеричном значении.
Пример: если мы посмотрим на десятичное число 5, мы знаем, что его двоичное значение равно 0101, когда мы AND R4, R4, R5
в нашем первом цикле мы сравниваем 1000 с 0101. Поскольку бит [3] является нулем в 0101, мы затем сообщаем симулятору LC3 распечатать ASCII-символ "0". Затем мы повторяем процесс со следующей двоичной маской 0100.
Сначала это может быть сложная концепция, поэтому сначала я бы посмотрел несколько примеров циклов и битовых масок.
Как мне написать программу, которая печатает "Hello World" 5 раз, используя цикл в LC3?
.ORIG x3000
LEA R0, PROMPT
PUTs ; TRAP x22
LD R0, ENTER
OUT ; TRAP x21
IN ; TRAP x23
AND R5, R5, #0 ; clear R5
ADD R5, R5, R0 ; Store the user input into R5
AND R1, R1, #0 ; clear R1, R1 is our loop count
LD R2, MASK_COUNT ; load our mask limit into R2
NOT R2, R2 ; Invert the bits in R2
ADD R2, R2, #1 ; because of 2's compliment we have
; to add 1 to R2 to get -4
WHILE_LOOP
ADD R3, R1, R2 ; Adding R1, and R2 to see if they'll
; will equal zero
BRz LOOP_END ; If R1+R2=0 then we've looped 4
; times and need to exit
LEA R3, BINARY ; load the first memory location
; in our binary mask array
ADD R3, R3, R1 ; use R1 as our array index and
; add that to the first array location
LDR R4, R3, #0 ; load the next binary mask into R4
AND R4, R4, R5 ; AND the user input with the
; binary mask
BRz NO_BIT
LD R0, ASCII_ONE
OUT ; TRAP x21
ADD R1, R1, #1 ; add one to our loop counter
BRnzp WHILE_LOOP ; loop again
NO_BIT
LD R0, ASCII_ZERO
OUT ; TRAP x21
ADD R1, R1, #1 ; add one to our loop counter
BRnzp WHILE_LOOP ; loop again
LOOP_END
LD R0, ENTER
OUT ; TRAP x21
HALT ; TRAP x25
; Binary Maps
BINARY .FILL b0000000000001000
.FILL b0000000000000100
.FILL b0000000000000010
.FILL b0000000000000001
.FILL b0000000000000000
; Stored Values
ENTER .FILL x000A
ASCII_ZERO .FILL x0030
ASCII_ONE .FILL x0031
MASK_COUNT .FILL x04 ; loop limit = 4
PROMPT .STRINGZ "Enter a number from 0-9"
.END