Когда компьютер начинает загружаться, он издает звуковой сигнал из BIOS спикера.
Как я могу сделать это в ассемблере или C ++?
Понятно, что я хочу сделать Beep Sound с помощью BIOS Speaker.
Помните, я имею в виду BIOS Speakers
Есть ли для этого какое-то прерывание? Я искал об этом, но ничего не нашел ..
Я использовал какое-то прерывание, но я этого не делал. следующий код:
int main(){
cout<<"\a";
}
Производил звук из динамика, а не биос
Как я могу это сделать ? с любым прерыванием?
Попробуйте добавить этот код тоже.
.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.
};
}
Единственный способ, которым вы можете реализовать это в любой современной ОС Windows, это, на мой взгляд, написание драйвера режима ядра. Причина в том, что in
или же out
инструкции недоступны в пользовательском режиме, и API для бипера отсутствует.
Однако, если вы просто хотите углубиться в низкоуровневое программирование, подумайте над написанием собственного загрузчика или даже собственного BIOS (с использованием виртуальной машины).
Попробуйте включить эту процедуру в вашу 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.
};
}