gpt4 book ai didi

assembly - 如何禁用循环时发生的 PC 扬声器哔声中断?

转载 作者:行者123 更新时间:2023-12-04 11:19:21 26 4
gpt4 key购买 nike

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

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

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

即使它只是一个死循环,我什至没有轮询键盘输入,如果我按下太多键,蜂鸣声仍然会发生

我已经尝试将我的输入代码包装在 cli & sti 中,以希望从系统中屏蔽我的键盘输入,但这并没有真正起作用。我只在程序中的一个奇异点收集扫描码,所以其余时间都启用了中断。因此,在绝大多数情况下,哔哔声仍然会发生。

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

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

最佳答案

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

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

  • BIOS 键盘预输入缓冲区已满。这不仅会导致机器发出哔哔声,未经处理的击键也会像垃圾一样堆积如山,一旦您的程序退出并返回到命令提示符就会溢出。
  • 您可能会错过击键,因为 BIOS 击败了您。

  • 基本上,有三种方法可以解决这个问题。
  • 使用 BIOS 调用或 DOS 调用来读取键盘输入。
  • 制作一个适当的键盘中断处理程序,您可以在其中使用端口 60h、61h 和 20h 来获取键盘事件('make' 和 'break')。
  • (不再确定这个了:)直接从 BIOS 键盘预输入缓冲区中拉出击键。

  • 强烈推荐第一个选项。如果您的应用程序必须能够检测到同时按住的多个键(通常是视频游戏),则首选第二个。这不是一项微不足道的任务,因此您需要一些帮助。

    关于assembly - 如何禁用循环时发生的 PC 扬声器哔声中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46082229/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com