在 BIOS 中发出哔声

Posted

技术标签:

【中文标题】在 BIOS 中发出哔声【英文标题】:Make beep sound in BIOS 【发布时间】:2015-04-18 07:58:24 【问题描述】:

当计算机开始启动时,它会发出哔声从 BIOS 扬声器

我如何在汇编或 C++ 中做到这一点? 显然我想通过 Bios 扬声器发出哔声。 记住我的意思是 BIOS 扬声器

它有任何中断吗?我搜索了一下,但没有找到.. 我使用了一些中断但没有这样做。以下代码:

int main()
   cout<<"\a";

从扬声器产生声音,而不是 Bios

我该怎么做?有任何中断吗?

【问题讨论】:

见***.com/q/10216931/3191896 还有其他方法吗?组装中? AFAIK,Windows 删除了对 Windows 7 中内置扬声器的支持。 @immibis:我可以为此编写驱动程序吗? :) @Alireza378nA 如果你想写一个驱动程序......你可能不会。 【参考方案1】:

也尝试添加此代码。

.pause1:
    mov     cx, 65535
.pause2:
    dec     cx
    jne     .pause2
    dec     bx
    jne     .pause1
    in      al, 61h         ; Turn off note (get value from
                            ;  port 61h).
    and     al, 11111100b   ; Reset bits 1 and 0.
    out     61h, al         ; Send new value.

所以,结果是:

void beep()

    __asm

      MOV al, 182         ; Prepare the speaker for the
      out     43h, al     ;  note.
      mov     ax, 2280    ; Frequency number (in decimal)
                          ;  for C.
      out     42h, al     ; Output low byte.
      mov     al, ah      ; Output high byte.
      out     42h, al 
      in      al, 61h     ; Turn on note (get value from
                          ;  port 61h).
      or      al, 00000011b   ; Set bits 1 and 0.
      out     61h, al         ; Send new value.
      mov     bx, 4       ; Pause for duration of note.


    .pause1:
       mov     cx, 65535
    .pause2:
       dec     cx
       jne     .pause2
       dec     bx
       jne     .pause1
       in      al, 61h         ; Turn off note (get value from
                               ;  port 61h).
       and     al, 11111100b   ; Reset bits 1 and 0.
       out     61h, al         ; Send new value.

   ;

【讨论】:

inout 是特权指令;在大多数操作系统下,您不能在用户空间中使用它们。 (在 Linux 下,有 iopermiopl 系统调用让进程请求 IO 特权,但这可能会干扰使用 PC 扬声器的内核驱动程序)。不过,此代码可能在带有古老 16 位 C++ 编译器的 DOS 程序中工作。【参考方案2】:

我想,在任何现代 Windows 操作系统中实现此功能的唯一方法是编写内核模式驱动程序。原因是inout 指令在用户模式下不可用,并且没有可用的蜂鸣器API。

http://en.wikipedia.org/wiki/Protection_ring https://msdn.microsoft.com/en-us/library/windows/hardware/ff554836(v=vs.85).aspx

但是,如果您只是愿意深入研究低级编程,请考虑编写自己的引导加载程序甚至自己的 BIOS(使用虚拟机)。

【讨论】:

【参考方案3】:

尝试将此过程包含在您的 C++ 程序中。

void beep()

    __asm

      MOV al, 182         ; Prepare the speaker for the
      out     43h, al     ;  note.
      mov     ax, 2280    ; Frequency number (in decimal)
                          ;  for C.
      out     42h, al     ; Output low byte.
      mov     al, ah      ; Output high byte.
      out     42h, al 
      in      al, 61h     ; Turn on note (get value from
                          ;  port 61h).
      or      al, 00000011b   ; Set bits 1 and 0.
      out     61h, al         ; Send new value.
      mov     bx, 4       ; Pause for duration of note.
   ;

【讨论】:

inout 是特权指令。它们不能在用户模式应用程序中工作。 您的哔声可能来自PC扬声器或耳机;不是来自 PC BIOS 扬声器。那么您确定您的设备不会发出任何声音吗? 不要发布同一答案的多个版本;将来编辑一个答案。由于您已经有了完整代码的答案,因此您应该删除这个答案。

以上是关于在 BIOS 中发出哔声的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mac OS X 10.6 中发出硬件哔声

从开机加电到执行main函数之前的过程

在 C# WPF 中发出哔声

如何在 Linux-Assembler 中发出哔哔声?

在 removeAllRanges() 上 Chrome 发出哔哔声;

在窗口中运行的 VBScript 如何发出哔哔声(或播放系统声音)? [复制]