【问题标题】:How to clear data from keyboard buffer after DOS int 16h / AH=1 detects a keypress?DOS int 16h / AH=1 检测到按键后如何从键盘缓冲区中清除数据?
【发布时间】:2023-03-31 14:50:01
【问题描述】:

我正在用 x86 汇编程序编写一个程序,以便在 DOS 下以 16 位实模式运行。

.model small
.stack 100h
.code

start: 
       mov dl, 4bh
loop1:
       mov ah, 2h
int 21h

mov ah, 1h
int 16h

cmp al, 6bh
jne loop1

mov ah, 4ch
int 21h

end start
end

程序需要一直写“K”,当在键盘上按下“k”时程序应该停止。

一切正常,程序一直写“K”,当我在键盘上按“k”时,我的程序停止了,但是,当我按键盘上的另一个按钮(什么都不应该发生)时,当我按“k”按钮时之后,程序不会停止,而是一直打印“K”。

我认为这是因为这个其他按钮已填满缓冲区,我不知道如何重置它或从缓冲区中仅获取缓冲区的最后一部分,其中有最后按下按钮的代码。

【问题讨论】:

    标签: assembly keyboard buffer dos x86-16


    【解决方案1】:

    你是对的,键盘缓冲区不为空,DOS 函数Int 16/AH=01h KEYBOARD - CHECK FOR KEYSTROKE 不断返回第一个(非'k')键。如果检查检测到一些按键,您应该使用Int 16/AH=00h KEYBOARD - GET KEYSTROKE 将其吞下。 而不是

    mov ah, 1h
    int 16h
    cmp al, 6bh
    jne loop1 
    

    试试

    mov ah, 1h   ; CHECK FOR KEYSTROKE
    int 16h
    jz loop1     ; Jump if none pressed.
    mov ah, 0h   ; GET KEYSTROKE
    int 16h
    cmp al, 6bh  ; Check if it is 'k'.
    jne loop1    ; If not, continue. Keybuffer is now empty.
    

    当你在 SO 上发布一些源代码时,它应该附有如何编译和链接的信息,还要选择适当的tags

    【讨论】:

    • 嘿伙计,非常感谢。这个解决方案是最好的,因为它有效! :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    相关资源
    最近更新 更多