在 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.
;
【讨论】:
in
和 out
是特权指令;在大多数操作系统下,您不能在用户空间中使用它们。 (在 Linux 下,有 ioperm
和 iopl
系统调用让进程请求 IO 特权,但这可能会干扰使用 PC 扬声器的内核驱动程序)。不过,此代码可能在带有古老 16 位 C++ 编译器的 DOS 程序中工作。【参考方案2】:
我想,在任何现代 Windows 操作系统中实现此功能的唯一方法是编写内核模式驱动程序。原因是in
或out
指令在用户模式下不可用,并且没有可用的蜂鸣器API。
但是,如果您只是愿意深入研究低级编程,请考虑编写自己的引导加载程序甚至自己的 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.
;
【讨论】:
in
和 out
是特权指令。它们不能在用户模式应用程序中工作。
您的哔声可能来自PC扬声器或耳机;不是来自 PC BIOS 扬声器。那么您确定您的设备不会发出任何声音吗?
不要发布同一答案的多个版本;将来编辑一个答案。由于您已经有了完整代码的答案,因此您应该删除这个答案。以上是关于在 BIOS 中发出哔声的主要内容,如果未能解决你的问题,请参考以下文章