使用INT 16h的刷新键盘缓冲区x86组件 [英] Flush Keyboard Buffer x86 assembly using int 16h
本文介绍了使用INT 16h的刷新键盘缓冲区x86组件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有疑问,因为我的代码不工作。我正在实现一个运行下面代码的引导加载器,当我尝试加载它时,它只在少数情况下有效,如下所述。我的代码是下一个:
ChangeGameState:
mov cx, 00H ;Here I make a delay
mov dx, 3240H ;.
mov ah, 86H ;.
int 15h ;.
jmp DetectKeyPress
DetectKeyPress:
mov ah, 01h
int 16h
jz noKeyInBuffer
xor ah, ah
int 16h
jmp exitKeyPress
noKeyInBuffer:
xor ax, ax
exitKeyPress:
jmp ProcessKey
ProcessKey:
cmp ah, 0
je ExitKey
cmp ah, 'd'
je ChangeDir1
cmp ah, 's'
je ChangeDir2
cmp ah, 'a'
je ChangeDir3
cmp ah, 'w'
je ChangeDir4
ExitKey:
jmp ChangeGameState
ChangeDir1:
;DO SOMETHING1
jmp ChangeGameState
ChangeDir2:
;DO SOMETHING2
jmp ChangeGameState
ChangeDir3:
;DO SOMETHING3
jmp ChangeGameState
ChangeDir4:
;DO SOMETHING4
jmp ChangeGameState
现在,当我尝试按S、A和W键时,它不起作用,只有当我按D键时。知道发生了什么事吗?
推荐答案
问题是int 16h
返回ah
中的扫描码,以及al
中的ASCII码。因此,当您的代码测试密钥的扫描码时,您应该测试ASCII字符。
因此,在ProcessKey
中,将cmp ah, ...
更改为cmp al, ...
。
这篇关于使用INT 16h的刷新键盘缓冲区x86组件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文