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

Ass*_*246 3 assembly real-mode bios x86-16

我的目标是使用 Int 16 指令能够使用箭头键在程序中上下移动,直到我的用户决定按退出键。我是否在循环中使用以下代码读取多个按键并在末尾添加终止条件,或者是否缺少某些内容?

Mov ah,00
int 16
Run Code Online (Sandbox Code Playgroud)

Fif*_*nik 5

Mov ah,00
int 16
Run Code Online (Sandbox Code Playgroud)

汇编语言编程需要你的精确性。
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
Run Code Online (Sandbox Code Playgroud)

这是一个解决使用键盘导航问题的骨架程序。在MainLoop的每次迭代中,它首先使用 BIOS 键盘功能 01h 测试是否有待处理的按键。

  • 如果没有,它就会执行所有需要完成的操作,而不管用户输入如何。刷新时钟或状态栏上的任何信息都属于此类。
  • 如果某个键正在等待,则使用 BIOS 键盘功能 00h 检索该键。无需等待,因为我们知道密钥可用。
    • 如果这个键是,那么程序会在ProcessEscapeKeyESC中失败,您可以在其中清理并退出到 DOS 或在这种情况下您需要的任何内容。
    • 对于任何其他键,它会跳转到ProcessOtherKey,您通常必须在其中区分要处理的所有不同键。UPDOWNLEFTRIGHT...