如何禁用循环时发生的PC扬声器蜂鸣声中断?

时间:2017-09-06 18:40:17

标签: assembly interrupt x86-16 pc

在我的8086汇编程序中执行循环时,有一个键盘按键阈值,如果按键太多次,PC扬声器将开始发出哔哔声。这是令人讨厌的,它会使我的程序变慢,因为cpu必须跳离我的程序并花半秒钟来驱动扬声器。

在我几个月前开始在实际硬件上测试我的程序之前,我甚至都不知道这个问题。这个问题在DosBox中不是问题,甚至在DosBox中安装的Dos 6.22中也不是问题。所以它必须是PC BIOS内置的一些低级硬件中断,我不太了解这些东西。

它出现在我的286机器和我的Pentium mmx笔记本电脑上,无论操作系统如何。

即使它只是一个死循环,我甚至没有轮询键盘输入,如果按太多键也会发出蜂鸣声

我尝试将我的输入代码包装在cli& sti希望掩盖我从系统输入的键盘输入,但这确实不起作用。我只在程序中的一个奇点处收集扫描码,所以其余的时间都启用了中断。所以绝大部分时间仍然会发出哔哔声。

必须有一些我可以禁用的硬件寄存器或其他东西。我仔细研究了Boch的端口列表(http://bochs.sourceforge.net/techspec/PORTS.LST),寻找类似的东西,但没有看到任何东西。

也许我可以关闭中断?我想很多汇编程序员一定遇到过这个问题,但Google在这里根本没有帮助我。

1 个答案:

答案 0 :(得分:9)

BIOS正在发出警告,警告您键盘输入缓冲区已满。在DOS中,这通常发生在(永久或暂时)不读取键盘输入的程序中。

在您的情况下,您正在阅读键盘输入,但不是以正确的方式。您正在直接从硬件(I / O端口60h)读取,但显然您没有捕获键盘中断(INT 09h)。这意味着在后台,BIOS也在处理键盘输入。这有两个令人讨厌的副作用。

  • BIOS键盘预先缓冲区正在填满。这不仅会导致机器发出蜂鸣声,未处理的键击也会像垃圾一样堆积起来,等待程序退出并退回到命令提示符后溢出。
  • 你可能会错过按键,因为BIOS会让你失望。

基本上,有三种方法可以解决这个问题。

  1. 使用BIOS调用或DOS调用来读取键盘输入。
  2. 制作一个合适的键盘中断处理程序,使用端口60h,61h和20h来获取键盘事件('make'和'break')。
  3. (不再确定这个了:)直接从BIOS键盘输入缓冲区中拔出键盘。
  4. 强烈建议使用第一个选项。如果您的应用程序必须能够检测到同时持有的多个密钥(通常是视频游戏),则第二个是首选。这不是一项微不足道的任务,所以你需要一些帮助。