【问题标题】:How would I implement Int 16h to use the keyboard to navigate through my program?我将如何实现 Int 16h 以使用键盘浏览我的程序?
【发布时间】:2017-09-14 10:43:11
【问题描述】:

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

Mov ah,00
int 16

【问题讨论】:

  • "int 16,0" 被阻塞,所以它会等待按键。您应该在每个“菜单循环”中只调用一次,因此用户的每次按键都会与所有可能的选项进行比较。不太清楚你在哪里看到问题,或者你在问什么,再加上这“太宽泛”......只需在纸上画一些你在输入端的草图,在输出端,在哪里发生了什么,然后尝试写一些东西,然后在调试器中度过一个晚上,看看它去了哪里......然后把它全部扔掉,然后再试一次。很简单。

标签: assembly x86-16 bios real-mode


【解决方案1】:
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,您通常必须在其中区分要处理的所有不同键。 ...

【讨论】:

  • mov ah, 01h 后跟 int 16h 说明你在我的笔记本电脑上写了段错误。 (x86 64 位架构)。
  • @mercury0114:中断 16h 接口一般只在 16 位实数或虚拟 86 模式下可用,在 64 位长模式下不可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 2019-04-26
  • 2019-03-04
  • 1970-01-01
相关资源
最近更新 更多