項目環境
- 編譯環境:搭建一個nasm2.8的編譯環境。
- 鏡像文件:採用winhex_18.2刷入編碼。
- 虛擬機:採用Bochs-2.4.5。
項目軟件
音頻對照表
![在這裏插入圖片描述]()
程序源碼(.asm)
org 0x8400
jmp start
;*****************************************數據準備區*****************************************
sound_f:;初始頻率
dw 1000
sound_hz:;赫茲中轉
dw 0
different_f:;不同音階
dw 523
dw 587
dw 659
dw 698
dw 784
dw 880
dw 988
;*****************************************開始*****************************************
start:
mov ax,0xb800 ;指向文本模式的顯示緩衝區
mov es,ax
mov ax,0
mov ds,ax
cli
mov word [ds:0x24],int_key ;寫入鍵盤中斷9號服務程序地址
mov word [ds:0x26],0
sti
;設置頻率
; mov dx,12H
; mov ax,34DEH
; mov di,1000
; div di
;給定時器頻率
; mov al,10110110B
; out 43h,al
; mov ax,1983
; out 42h,al
; mov al,ah
; out 42h,al
;揚聲器端口打開
; in al,61h
; or al,00000011B
; out 61h,al
x:
jmp $
;*****************************************鍵盤中斷*****************************************
int_key:;鍵盤
mov dx,0x60 ;讀取鍵盤緩衝區數據
in al,dx
;叫1 duo
cmp al,0x02
je call_1
;叫2 rai
cmp al,0x03
je call_2
;叫3 mi
cmp al,0x04
je call_3
;叫4 fa
cmp al,0x05
je call_4
;叫5 sao
cmp al,0x06
je call_5
;叫6 la
cmp al,0x07
je call_6
;叫7 xi
cmp al,0x08
je call_7
jmp read_sound
call_1:
mov bx,[ds:different_f] ;duo
mov [ds:sound_f],bx
call make_sound
jmp read_sound
call_2:
mov bx,[ds:different_f+2] ;rai
mov [ds:sound_f],bx
call make_sound
jmp read_sound
call_3:
mov bx,[ds:different_f+4] ;mi
mov [ds:sound_f],bx
call make_sound
jmp read_sound
call_4:
mov bx,[ds:different_f+6] ;fa
mov [ds:sound_f],bx
call make_sound
jmp read_sound
call_5:
mov bx,[ds:different_f+8] ;sao
mov [ds:sound_f],bx
call make_sound
jmp read_sound
call_6:
mov bx,[ds:different_f+10] ;la
mov [ds:sound_f],bx
call make_sound
jmp read_sound
call_7:
mov bx,[ds:different_f+12] ;xi
mov [ds:sound_f],bx
call make_sound
jmp read_sound
read_sound:
mov dx,0x20
mov al,0x61
out dx,al
iret
;*****************************************發聲主程序*****************************************
make_sound:;發聲
call give_f
call delay
call open_sound
call delay
call close_sound
ret
;**********************************************************************************聲音模塊**********************************************************************************
;*****************************************設置頻率*****************************************
set_f:;設置頻率
push dx
push ax
mov dx,12H
mov ax,34DEH
mov di,[ds:sound_f]
div di
mov [ds:sound_hz],ax
pop ax
pop dx
ret
;*****************************************給定時器頻率*****************************************
give_f:;給定時器頻率
mov al,10110110B
out 43H,al
call set_f
mov ax,[ds:sound_hz]
out 42H,al
mov al,ah
out 42H,al
ret
;*****************************************揚聲器端口打開*****************************************
open_sound:;揚聲器端口打開
push ax
in al,61H
or al,00000011B;或操作與11111100B
out 61H,al
pop ax
ret
;*****************************************揚聲器端口關閉*****************************************
close_sound:;揚聲器端口關閉
push ax
in al,61H
and al,11111100B;與操作與00000011B
out 61H,al
pop ax
ret
;*****************************************時延*****************************************
delay:;時延
push cx
push dx
push ax
mov cx,0FH
;mov dx,4240H ;延遲
mov dx,1000H ;延遲
mov ah,86H
int 15H
pop ax
pop dx
pop cx
ret