Assembly 在内置PC扬声器上播放音符关闭键
我一直在写一个简单的bootsector程序,在启动时用内置PC扬声器播放音符 用户按下键,“我已经计算出我应该给电脑扬声器的数字,用1193180除以我想播放的音符的频率。问题是,这些音符听起来很离谱。我试过调整数字,PC扬声器播放的声音一点也没有改变 代码如下:Assembly 在内置PC扬声器上播放音符关闭键,assembly,audio,x86,x86-16,Assembly,Audio,X86,X86 16,我一直在写一个简单的bootsector程序,在启动时用内置PC扬声器播放音符 用户按下键,“我已经计算出我应该给电脑扬声器的数字,用1193180除以我想播放的音符的频率。问题是,这些音符听起来很离谱。我试过调整数字,PC扬声器播放的声音一点也没有改变 代码如下: input: ; takes user input and sets ax based on the key pressed mov ah, 00h int 16h cmp al, 'a'
input: ; takes user input and sets ax based on the key pressed
mov ah, 00h
int 16h
cmp al, 'a'
je seta
cmp al, 's'
je sets
cmp al, 'd'
je setd
cmp al, 'f'
je setf
cmp al, 'j'
je setj
cmp al, 'k'
je setk
cmp al, 'l'
je setl
cmp al, ';'
je setcolon
jmp stopnote
seta: ; C4
mov ax, 4560
jmp playnote
sets:
mov ax, 4063 ; D4
jmp playnote
setd:
mov ax, 3619 ; E4
jmp playnote
setf:
mov ax, 3416 ; F4
jmp playnote
setj:
mov ax, 3043 ; G4
jmp playnote
setk:
mov ax, 2711 ; A4
jmp playnote
setl: ; B4
mov ax, 2415
jmp playnote
setcolon: ; C5
mov ax, 2280
jmp playnote
playnote:
mov al, 182 ; plays the sound, ax determines the frequency
out 43h, al
out 42h, al
mov al, ah
out 42h, al
in al, 61h
or al, 00000011b
out 61h, al
jmp input
stopnote: ; stops the speaker
in al, 61h
and al, 11111100b
out 61h, al
jmp input
times 510 - ($-$$) db 0 ; bootsector magic number
dw 0xaa55
我在QEMU运行这个。如果您想自己运行此程序,请使用以下方法组装此程序:
nasm -fbin code.asm -o code.bin
并使用以下命令运行引导扇区:
qemu-system-x86-64 code.bin -soundhw pcspk
mov al,182
覆盖AX的低位字节。将频率传递到另一个寄存器中,以便在将outb的低/高频率一半复制到AL(用于将outb复制到端口42h)之前,可以方便地将outb的低/高频率一半传送到端口43h。mov AL,182
覆盖AX的低字节。将频率传递到另一个寄存器中,以便在将频率的低/高一半复制到AL(用于将outb复制到端口42h之前,outb
方便地传送到端口43h。