用户 I/O 使用键盘和显示寄存器
User I/O using the keyboard and display registers
我正在尝试接收用户输入并在用户按下 ENTER 键后让控制台打印出输入。
如有任何想法或建议,我们将不胜感激。
输出结果如下:
output
.ORIG x3000
LEA R3, MEM ; Load memory block into R3
LD R2, LINE
LOOP LDI R0, KBSR ; Load the value of the KBSR into R0
BRzp LOOP ; If KBSR[15] = 0, no key has been pressed
LDI R0, KBDR ; Copy the waiting character from the KBDR to R0
LDI R3, KBDR ; copy the wating character into R3
LOOP2 LDI R1, DSR ; Load the value of the DSR into R1
BRzp LOOP2 ; If DSR[15] = 0, the display is not ready
ADD R2, R0, #-10 ; checks to see if Enter key was pressed
BRz DISPLAY ; if so go to display characters
BRnp LOOP
DISPLAY STI R3, DDR ; Copy the character in R0 to the Data display register
PUTS
ADD R3, R3, #1 ; update storage location.
HALT
DSR .FILL xFE04
DDR .FILL xFE06
KBSR .FILL xFE00
KBDR .FILL xFE02
MEM .BLKW 64
LINE .FILL #10
.END
LC-3 模拟器打印出乱码的原因是 PUTs
命令的使用方式。 PUTs
使用 R0 中存储的值作为指向字符串内存位置的指针。
在您按下 ENTER 的示例中,x000A(十进制 10)被存储到 R0 中,此时当您使用 PUTs
时,它查看字符串的内存位置 x000A 但最终打印垃圾。如果将 PUTs
替换为 OUT
,则代码可以正常工作。
这是修改后的代码;这将从用户那里获取一些输入,并仅使用 I/O 寄存器将其打印到控制台。
注释行是我添加的代码行。
.
.ORIG x3000
LEA R3, MEM
LD R2, LINE
LOOP
LDI R0, KBSR
BRzp LOOP
LDI R0, KBDR
STR R0, R3, #0 ; Store R0 into the mem location in R3
ADD R3, R3, #1 ; Increment our pointer to the next block of mem
LOOP2
LDI R1, DSR
BRzp LOOP2
ADD R2, R0, #-10
BRz DISPLAY
BRnp LOOP
DISPLAY
LEA R3, MEM ; reset our pointer back to the start of MEM
DISPLAY2 ; create a second label because we don't want
; to load MEM into R3 each time we loop
LDI R1, DSR ; Load the display status register
BRzp DISPLAY2 ; If the console is busy, loop again
LDR R2, R3, #0 ; load the value at mem[R3] into R2
BRz END ; Check to see if we're at the end of the string
STI R2, DDR ; store the value of R2 into DDR
ADD R3, R3, #1
BR DISPLAY2 ; Keep looping until all char have been printed
END
HALT
DSR .FILL xFE04
DDR .FILL xFE06
KBSR .FILL xFE00
KBDR .FILL xFE02
LINE .FILL #10
MEM .BLKW 64
.END
我正在尝试接收用户输入并在用户按下 ENTER 键后让控制台打印出输入。
如有任何想法或建议,我们将不胜感激。
输出结果如下: output
.ORIG x3000
LEA R3, MEM ; Load memory block into R3
LD R2, LINE
LOOP LDI R0, KBSR ; Load the value of the KBSR into R0
BRzp LOOP ; If KBSR[15] = 0, no key has been pressed
LDI R0, KBDR ; Copy the waiting character from the KBDR to R0
LDI R3, KBDR ; copy the wating character into R3
LOOP2 LDI R1, DSR ; Load the value of the DSR into R1
BRzp LOOP2 ; If DSR[15] = 0, the display is not ready
ADD R2, R0, #-10 ; checks to see if Enter key was pressed
BRz DISPLAY ; if so go to display characters
BRnp LOOP
DISPLAY STI R3, DDR ; Copy the character in R0 to the Data display register
PUTS
ADD R3, R3, #1 ; update storage location.
HALT
DSR .FILL xFE04
DDR .FILL xFE06
KBSR .FILL xFE00
KBDR .FILL xFE02
MEM .BLKW 64
LINE .FILL #10
.END
LC-3 模拟器打印出乱码的原因是 PUTs
命令的使用方式。 PUTs
使用 R0 中存储的值作为指向字符串内存位置的指针。
在您按下 ENTER 的示例中,x000A(十进制 10)被存储到 R0 中,此时当您使用 PUTs
时,它查看字符串的内存位置 x000A 但最终打印垃圾。如果将 PUTs
替换为 OUT
,则代码可以正常工作。
这是修改后的代码;这将从用户那里获取一些输入,并仅使用 I/O 寄存器将其打印到控制台。
注释行是我添加的代码行。
.
.ORIG x3000
LEA R3, MEM
LD R2, LINE
LOOP
LDI R0, KBSR
BRzp LOOP
LDI R0, KBDR
STR R0, R3, #0 ; Store R0 into the mem location in R3
ADD R3, R3, #1 ; Increment our pointer to the next block of mem
LOOP2
LDI R1, DSR
BRzp LOOP2
ADD R2, R0, #-10
BRz DISPLAY
BRnp LOOP
DISPLAY
LEA R3, MEM ; reset our pointer back to the start of MEM
DISPLAY2 ; create a second label because we don't want
; to load MEM into R3 each time we loop
LDI R1, DSR ; Load the display status register
BRzp DISPLAY2 ; If the console is busy, loop again
LDR R2, R3, #0 ; load the value at mem[R3] into R2
BRz END ; Check to see if we're at the end of the string
STI R2, DDR ; store the value of R2 into DDR
ADD R3, R3, #1
BR DISPLAY2 ; Keep looping until all char have been printed
END
HALT
DSR .FILL xFE04
DDR .FILL xFE06
KBSR .FILL xFE00
KBDR .FILL xFE02
LINE .FILL #10
MEM .BLKW 64
.END