我如何实现Int 16h以使用键盘浏览我的程序?

时间:2017-04-18 14:18:58

标签: assembly x86-16 bios real-mode

我的目标是使用Int 16指令使用箭头键在程序中上下移动,直到我的用户决定按下转义键。我是否在循环中使用以下代码读取多个按键并在结尾处添加终止条件或者是否存在我遗漏的内容?

Mov ah,00
int 16

1 个答案:

答案 0 :(得分:2)

Mov ah,00
int 16

汇编语言编程需要您精确 BIOS键盘功能位于int 16h。这是十进制的 22 ,而不是你写的 16 !可能不是什么大问题,但它是成功与失败之间的区别。

MainLoop:
    mov ah, 01h    ;BIOS.TestKey
    int 16h
    jz  StuffToDoRegardlessOfAnyKey
    mov ah, 00h    ;BIOS.GetKey
    int 16h
    cmp al, 27     ;Is it ESCAPE ?
    jne ProcessOtherKey
ProcessEscapeKey:
    ...
    ...
ProcessOtherKey:
    ...
    ...
    jmp MainLoop
StuffToDoRegardlessOfAnyKey:
    ...
    ...
    jmp MainLoop

这是一个解决使用键盘导航问题的骨架程序。在 MainLoop 的每次迭代中,如果有挂起的密钥,它首先使用BIOS键盘功能01h进行测试。

  • 如果没有,它会完成所有需要完成的工作,无论用户输入是什么。刷新时钟或状态栏上的任何信息都属于此类别。
  • 如果某个键正在等待,则使用BIOS键盘功能00h检索该键。 由于我们知道密钥可用,因此无需等待。
    • 如果此键是 ESC ,则程序将在 ProcessEscapeKey 中进行,您可以在此处清理并退出到DOS或本案例中需要的任何内容。
    • 对于任何其他密钥,它会跳转到 ProcessOtherKey ,您通常必须区分要处理的所有不同密钥。 UP DOWN LEFT ...