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

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