【发布时间】:2013-01-27 13:59:29
【问题描述】:
我正在尝试在程序集 8086 中创建一个动画,由键盘控制,使用 ctrl 和 shift 作为左右。
我试图查看如何在 8086 中接收来自键盘的输入,而不是如何找出按下的键是 ctrl 或 shift(通常是按下哪个键)。
非常感谢!
【问题讨论】:
-
这是在什么操作系统上运行的?
标签: assembly input keyboard x86 x86-16
我正在尝试在程序集 8086 中创建一个动画,由键盘控制,使用 ctrl 和 shift 作为左右。
我试图查看如何在 8086 中接收来自键盘的输入,而不是如何找出按下的键是 ctrl 或 shift(通常是按下哪个键)。
非常感谢!
【问题讨论】:
标签: assembly input keyboard x86 x86-16
您确定不想使用左右方向键吗? control 和 shift 的问题在于它们不会“返回”一个键,而是修改另一个被按下的键。这是在键盘中断处理程序(9,IIRC)中处理的,您可以“挂钩”它。我认为查看“Bios 数据区”并观察中断处理程序在何处跟踪控制和换档键的状态会更容易。在我看来,BDA 在第 40h 段。键盘状态标志在... 17h 和 18h?不要相信我的话,查一下。拉尔夫布朗的中断清单。这一切都假设“8086”的意思是,比如……古物。 :)
【讨论】:
假设您仅在 BIOS 下执行此操作,您可能会发现使用更高级别的 BIOS 键盘中断更容易 - int 0x16 AH=0x01 用于一般击键,int 0x16 AH=0x02 用于 ctrl/shift 等可能,尽管还有许多其他可能性(包括其他 int 0x16 命令和 - 之前建议的 - 低级键盘 int 0x09 和 BIOS 数据区域。我强烈支持 Ralf Brown's Interrupt List 的推荐 - 一个很好的资源!
【讨论】:
Bios 将密钥存储在 16 个字母的缓冲区中。这意味着如果一个操作系统太慢,每当它读取下一个按键时,它就会从缓冲区中读取。
您可以使用 int 16h 并将 ah 设置为 02h 以将 al 设置为缓冲区中的下一个字符。但是,如果您正在检查缓冲区的状态(是否有密钥),请查看this. 它基本上进入了更多的深度啊 02h
既然你问的是方向键,这里是它们的十六进制代码:
【讨论】: