【问题标题】:Keyboard Input in Assembly 8086汇编 8086 中的键盘输入
【发布时间】:2013-01-27 13:59:29
【问题描述】:

我正在尝试在程序集 8086 中创建一个动画,由键盘控制,使用 ctrl 和 shift 作为左右。

我试图查看如何在 8086 中接收来自键盘的输入,而不是如何找出按下的键是 ctrl 或 shift(通常是按下哪个键)。

非常感谢!

【问题讨论】:

  • 这是在什么操作系统上运行的?

标签: assembly input keyboard x86 x86-16


【解决方案1】:

您确定不想使用左右方向键吗? control 和 shift 的问题在于它们不会“返回”一个键,而是修改另一个被按下的键。这是在键盘中断处理程序(9,IIRC)中处理的,您可以“挂钩”它。我认为查看“Bios 数据区”并观察中断处理程序在何处跟踪控制和换档键的状态会更容易。在我看来,BDA 在第 40h 段。键盘状态标志在... 17h 和 18h?不要相信我的话,查一下。拉尔夫布朗的中断清单。这一切都假设“8086”的意思是,比如……古物。 :)

【讨论】:

  • 您好,谢谢!按键无关紧要,我如何使用左右箭头键来做到这一点?
【解决方案2】:

假设您仅在 BIOS 下执行此操作,您可能会发现使用更高级别的 BIOS 键盘中断更容易 - int 0x16 AH=0x01 用于一般击键,int 0x16 AH=0x02 用于 ctrl/shift 等可能,尽管还有许多其他可能性(包括其他 int 0x16 命令和 - 之前建议的 - 低级键盘 int 0x09 和 BIOS 数据区域。我强烈支持 Ralf Brown's Interrupt List 的推荐 - 一个很好的资源!

【讨论】:

  • 谢谢! int 0x16 Ah=0x02 只会给我标志,我如何从用户那里获取输入本身?
  • 您应该能够查看来自 int 0x16 AH=0x01 的扫描和/或 ASCII 码来告诉您这一点
【解决方案3】:

Bios 将密钥存储在 16 个字母的缓冲区中。这意味着如果一个操作系统太慢,每当它读取下一个按键时,它就会从缓冲区中读取。

您可以使用 int 16h 并将 ah 设置为 02h 以将 al 设置为缓冲区中的下一个字符。但是,如果您正在检查缓冲区的状态(是否有密钥),请查看this. 它基本上进入了更多的深度啊 02h

既然你问的是方向键,这里是它们的十六进制代码:

  1. U 0x18
  2. D 0x19
  3. L 0x1B
  4. R 0x1A

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2017-04-04
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多