【问题标题】:How to access keyboard directly trough I/O ports (in DOS)?如何通过 I/O 端口(在 DOS 中)直接访问键盘?
【发布时间】:2012-10-12 16:04:56
【问题描述】:

我正在为 DOS 编写一个程序,我想获得键盘输入。问题是我不想使用 BIOS 或 DOS 获得该输入。在不使用 DOS 或 BIOS 的情况下获取键盘输入的正确方法是什么?我的意思是使用 I/O 端口在最低级别的编程中获得键盘输入的方法是什么。谢谢!

【问题讨论】:

  • @BasileStarynkevitch 关于这个话题的信息不多。
  • 查看this answer
  • @AlexeyFrunze 谢谢,但这对我来说有点太难了。我需要一些更简单的...
  • @Arnas 来吧,这是一个小程序。你会从中学到一些东西。这就是“正确的方式”。

标签: assembly input keyboard dos


【解决方案1】:

您需要在端口 0x60 上执行inb 指令才能从键盘读取扫描码。


static inline uint8_t inportb(uint16_t port)
{
    uint8_t ret;
    asm volatile ("inb %1, %0" : "=a" (ret) : "dN" (port));
    return ret;
}
scancode = inportb(0x60);

如果您想知道何时有新输入,您需要设置一个中断处理程序来监听 PS/2 中断或使用 USB 轮询,具体取决于您的键盘。

【讨论】:

  • 您好,我尝试读取端口 60h 端口,但每当我读取它时,它立即返回 28(ENTER 键的扫描码)。它甚至不让我提供任何意见。也许我需要清除缓冲区?如果是这样,你能告诉我我该怎么做吗?
  • @Arnas 我相信如果你从键盘上的数据端口读取它总是包含最后按下的键(可能是输入)。是 USB 键盘还是 PS/2 键盘?
  • 我用的是USB,但我还有一个是PS/2的。
  • 对于 PS/2,当有新数据可用时,您需要设置一个中断处理程序。对于 USB,您需要做一些我目前不太熟悉的额外工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多