【问题标题】:How to get user input in assembly如何在汇编中获取用户输入
【发布时间】:2013-12-27 16:30:03
【问题描述】:

我想将用户输入的号码输入寄存器。这是我自己的操作系统。所以,我不能用这个:

mov al,0x01
int 0x21
mov dl,al ;move the integer entered by the user, into dl

因为 int 0x21 调用 ms-dos。那么我可以使用什么中断?

【问题讨论】:

  • 这不会输入一个整数 - 它输入一个字符串。检查字符串是否代表有效整数并将其实际转换为该整数是您需要执行的附加步骤。汇编是这样的低级。您可以小心地安排调用 C 库函数来完成此任务,包括格式化输入,但完全在汇编中完成意味着您必须处理所有细节......
  • 这已经有 6 年以上的历史了,但是如果 OP 还在,您是否希望在保护模式或实模式下执行此操作?可以在此处找到保护模式示例:stackoverflow.com/a/37635449/3857942

标签: assembly x86 osdev


【解决方案1】:

取决于您的操作系统提供什么。如果是你的操作系统,你可以使用任何写的东西。

可能性包括检查键盘控制器或串行端口,具体取决于您想要的输入。如果您的操作系统运行在 8086 实模式下,您可以向 BIOS 询问这些,否则您需要进行直接端口 I/O。

如果您想对 BIOS 进行编程,请查看RBIL。事实上,不管你做什么,都要检查一下。

如果您想直接与 KBC(键盘控制器)或 UART(串行端口控制器)对话,我建议您查看其他操作系统的操作方式并阅读文档,例如osdev.org 和 OSdev Wiki。

如果您处于实模式,则可以调用 BIOS 等待按键并从键盘缓冲区中读取:

MOV AH,00h
INT 16h

ASCII 码在AL,扫描码在AH。但是,如果您不在实模式下,则一开始就没有键盘缓冲区。键盘驱动程序将通过直接端口 I/O 从 KBC 中断处理程序将数据获取到键盘控制器,然后(并自行缓冲)。

【讨论】:

  • 我只想简单地获取键盘缓冲区中的任何内容。我想知道是否有可以调用的中断,它会等到某个键被按下,然后从键盘缓冲区中读取它。
  • 那么键盘驱动程序如何在没有键盘缓冲区的情况下获取输入?
【解决方案2】:

如果您在“常规”PC 上以实模式运行,您可以将 int 0x10 用于屏幕输出,将 int 0x16 用于键盘输入,将 int 0x13(函数 AH=2、3、8、0x41、0x42、0x43)用于磁盘访问。

普通 PC 上的大多数中断都很好地记录在“Ralph Brown's interrupt list”中(在 Google 中搜索该列表)。

【讨论】:

  • int 0x16 会等到按键被按下吗?
  • @IsaacD。 BIOS INT 16h 具有检查某个键是否被按下以及等待直到某个键被按下的功能。它还有一个 15 或 16 字节的输入缓冲区。但是,正如我所说,它只适用于 8086 实模式。
  • @mirabilos :BIOS 键盘缓冲区实际上是 15 个字节。第 16 个字节是用于代替计数变量的机制的一部分。问题是选择的缓冲区大小必须是 2 的幂。我在这个 SO 答案中使用了这样的实现:stackoverflow.com/a/51565739/3857942
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多