使用INT 16h的刷新键盘缓冲区x86组件 [英] Flush Keyboard Buffer x86 assembly using int 16h

查看:9
本文介绍了使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆