【问题标题】:User I/O using the keyboard and display registers使用键盘和显示寄存器的用户 I/O
【发布时间】:2015-11-17 20:49:09
【问题描述】:

我正在尝试接受用户输入并在用户按下 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

【问题讨论】:

    标签: string output


    【解决方案1】:

    这是修改后的代码;这将从用户那里获取一些输入,并仅使用 I/O 寄存器将其打印到控制台。

    带有 cmets 的行是我添加的代码行。

    .

    .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
    

    【讨论】:

    • 这很漂亮,谢谢!
    【解决方案2】:

    LC-3 模拟器打印垃圾的原因是PUTs 命令的使用方式。 PUTs 使用存储在 R0 中的值作为指向字符串内存位置的指针。

    在您按 ENTER 的示例中,x000A(十进制 10)被存储到 R0 中,此时您使用 PUTs 时,它会查看内存位置 x000A 用于字符串,但最终打印垃圾。如果将PUTs 替换为OUT,则代码可以正常工作。

    【讨论】:

    • 如果这是您正在寻找的信息,请记住将此帖子标记为已回答。谢谢。
    • 克里斯,感谢您的帮助。它不再打印乱码,而是什么都不打印,只是跳到下一行并停止。任何其他想法将不胜感激。
    • 我明白你在说什么,你的程序到底应该做什么?如果你能给我描述一下它应该如何行动,我可以更好地帮助你。截至目前,它会打印出最后输入的字符,在本例中为 ENTER 键。
    • 克里斯,很抱歉不清楚。它应该在按下 ENTER 键后打印出用户键入的内容,在这种情况下为字符串。我希望这能澄清一点
    • 没问题,你必须使用 I/O 寄存器吗? (例如 KBSR)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2013-09-18
    相关资源
    最近更新 更多