如何禁用循环时出现的 PC 扬声器蜂鸣声中断?
How do you disable the PC speaker beep interrupt that occurs while looping?
在我的 8086 汇编程序中执行循环时,有一个键盘按键阈值,如果您按键次数过多,PC 扬声器将开始发出哔哔声。这很令人讨厌,它使我的程序变得缓慢,因为 cpu 必须跳出我的程序并花半秒钟来驱动扬声器。
几个月前我开始在实际硬件上测试我的程序之前,我什至不知道这个问题的存在。这个问题在 DosBox 中不是问题,甚至在 DosBox 中安装的 Dos 6.22 中也不是问题。所以这一定是PC BIOS中内置的一些低级硬件中断,我对这东西了解不多。
它出现在我的 286 机器和我的 Pentium mmx 笔记本电脑上,与操作系统无关。
即使它只是一个死循环,我什至没有轮询键盘输入,如果我按下太多键,蜂鸣声仍然会发生
我已经尝试将我的输入代码包装在 cli 和 sti 中,以希望从系统中屏蔽我的键盘输入,但这并不奏效。我只在程序中的一个单一点收集扫描码,所以其余时间都启用中断。所以绝大部分时间还是会发出嘟嘟声。
一定有一些我可以禁用的硬件寄存器之类的。我仔细查看了 Boch 的端口列表 (http://bochs.sourceforge.net/techspec/PORTS.LST) 寻找类似的东西,但没有看到任何东西。
也许我可以把中断关掉?我想很多汇编程序员一定遇到过这个问题,但是 Google 在这里真的帮不上我什么忙。
BIOS 发出蜂鸣声警告您键盘预输入缓冲区已满。在 DOS 中,这通常发生在(永久或暂时)不读取键盘输入的程序中。
在您的情况下,您正在读取键盘输入,但方式不正确。您正在直接从硬件(I/O 端口 60h)读取,但显然您没有捕捉到键盘中断(INT 09h
)。这意味着在后台,BIOS 也在处理键盘输入。这有两个严重的副作用。
- BIOS 键盘输入缓冲区已满。这不仅会导致机器发出哔哔声,未处理的击键也会像垃圾一样堆积起来,一旦您的程序退出并返回到命令提示符,就会溢出。
- 您可能会错过击键,因为 BIOS 已经让您做到了。
基本上,有三种方法可以解决这个问题。
- 使用 BIOS 调用或 DOS 调用读取键盘输入。
- 创建一个正确的键盘中断处理程序,使用端口 60h、61h 和 20h 获取键盘事件('make' 和 'break')。
- (不再确定这个了:)直接从 BIOS 键盘预输入缓冲区中提取击键。
强烈推荐第一个选项。如果您的应用程序必须能够检测到同时按住多个键(通常是视频游戏),则首选第二个。这不是一项简单的任务,因此您需要一些帮助。
在我的 8086 汇编程序中执行循环时,有一个键盘按键阈值,如果您按键次数过多,PC 扬声器将开始发出哔哔声。这很令人讨厌,它使我的程序变得缓慢,因为 cpu 必须跳出我的程序并花半秒钟来驱动扬声器。
几个月前我开始在实际硬件上测试我的程序之前,我什至不知道这个问题的存在。这个问题在 DosBox 中不是问题,甚至在 DosBox 中安装的 Dos 6.22 中也不是问题。所以这一定是PC BIOS中内置的一些低级硬件中断,我对这东西了解不多。
它出现在我的 286 机器和我的 Pentium mmx 笔记本电脑上,与操作系统无关。
即使它只是一个死循环,我什至没有轮询键盘输入,如果我按下太多键,蜂鸣声仍然会发生
我已经尝试将我的输入代码包装在 cli 和 sti 中,以希望从系统中屏蔽我的键盘输入,但这并不奏效。我只在程序中的一个单一点收集扫描码,所以其余时间都启用中断。所以绝大部分时间还是会发出嘟嘟声。
一定有一些我可以禁用的硬件寄存器之类的。我仔细查看了 Boch 的端口列表 (http://bochs.sourceforge.net/techspec/PORTS.LST) 寻找类似的东西,但没有看到任何东西。
也许我可以把中断关掉?我想很多汇编程序员一定遇到过这个问题,但是 Google 在这里真的帮不上我什么忙。
BIOS 发出蜂鸣声警告您键盘预输入缓冲区已满。在 DOS 中,这通常发生在(永久或暂时)不读取键盘输入的程序中。
在您的情况下,您正在读取键盘输入,但方式不正确。您正在直接从硬件(I/O 端口 60h)读取,但显然您没有捕捉到键盘中断(INT 09h
)。这意味着在后台,BIOS 也在处理键盘输入。这有两个严重的副作用。
- BIOS 键盘输入缓冲区已满。这不仅会导致机器发出哔哔声,未处理的击键也会像垃圾一样堆积起来,一旦您的程序退出并返回到命令提示符,就会溢出。
- 您可能会错过击键,因为 BIOS 已经让您做到了。
基本上,有三种方法可以解决这个问题。
- 使用 BIOS 调用或 DOS 调用读取键盘输入。
- 创建一个正确的键盘中断处理程序,使用端口 60h、61h 和 20h 获取键盘事件('make' 和 'break')。
- (不再确定这个了:)直接从 BIOS 键盘预输入缓冲区中提取击键。
强烈推荐第一个选项。如果您的应用程序必须能够检测到同时按住多个键(通常是视频游戏),则首选第二个。这不是一项简单的任务,因此您需要一些帮助。