Assembly 在内置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'

我一直在写一个简单的bootsector程序,在启动时用内置PC扬声器播放音符 用户按下键,“我已经计算出我应该给电脑扬声器的数字,用1193180除以我想播放的音符的频率。问题是,这些音符听起来很离谱。我试过调整数字,PC扬声器播放的声音一点也没有改变

代码如下:

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。