用户 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