DOS int 16h AH=1检测到按键后如何清除键盘缓冲区的数据?

问题描述 投票:0回答:1

我正在用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个回答
3
投票

你是对的,键盘缓冲区不是空的,而且DOS的函数 Int 16AH=01h KEYBOARD - CHECK FOR KEYSTROKE(按键)。 一直返回第一个(非'k')键。如果检查到一些按键,你应该将其用 Int 16AH=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上发布一些源代码时,应该附上如何编译和链接的信息,也要选择适当的 标签.

© www.soinside.com 2019 - 2024. All rights reserved.