【问题标题】:Flush Keyboard Buffer x86 assembly using int 16h使用 int 16h 刷新键盘缓冲区 x86 程序集
【发布时间】:2016-08-27 07:24:40
【问题描述】:

我有疑问,因为我的代码不起作用。我正在实现一个运行下面代码的引导加载程序,当我尝试加载它时,它只在少数情况下有效,就像我在下面解释的那样。我的代码是下一个:

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 键时才起作用。知道发生了什么吗?

【问题讨论】:

  • 在 BOCHS 或任何其他具有内置调试器的 x86 模拟器中单步执行时会看到什么?
  • 只是程序停止了.. 没有任何反应
  • 那么什么值在哪个寄存器中?这就是 BOCHS 中内置的 调试器 的用途。
  • 我安装了 Bochs,但代码从第 1 行开始就不起作用了。
  • 我什至不知道你想说什么。这有帮助吗? bochs.sourceforge.net/doc/docbook/user/internal-debugger.html

标签: assembly x86 nasm bootloader


【解决方案1】:

问题在于int 16hah 中返回scancode,在al 中返回ASCII 字符。因此,当您的代码测试密钥的扫描码时,您应该测试 ASCII 字符。

因此,在ProcessKey 中,将cmp ah, ... 更改为cmp al, ...

【讨论】:

  • 您更改了所有 5 条语句?
  • @ArturoSalas 那么你的代码中的 else 一定是错误的。由于您没有提供minimal reproducible example,因此您应该为得到这个答案而感到幸运,它解决了您的一个错误,您应该考虑接受。
猜你喜欢
  • 2010-11-01
  • 2018-03-05
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
相关资源
最近更新 更多