当计算机开始启动时,它会从BIOS扬声器发出哔声 。
我如何在Assembly或C ++中执行此操作?
显然我想通过BIOS Speaker制作Beep Sound。
请记住我的意思是BIOS发言人
它有中断吗?我搜索了但没有发现.. 我使用了一些中断但是没有这样做。以下代码:
int main(){
cout<<"\a";
}
从Speaker,Not Bios产生声音
我该怎么做?有任何中断吗?
答案 0 :(得分: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.
};
}
答案 1 :(得分:1)
在任何现代Windows操作系统中实现此功能的唯一方法是编写内核模式驱动程序。原因是in
或out
指令在用户模式下不可用,并且没有可用蜂鸣器的API。
但是,如果你只是愿意深入研究低级编程,可以考虑编写自己的bootloader甚至自己的BIOS(使用虚拟机)。
答案 2 :(得分:-1)
尝试在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.
};
}