匯編語(yǔ)言之實(shí)現(xiàn)發(fā)出各種聲音
軟件:emu8086
語(yǔ)言:匯編語(yǔ)言(Assembly)
注意:本文列出了響鈴,機(jī)槍聲音,音樂(lè)播放的代碼,第一個(gè)代碼為博主獨(dú)自一人編寫,所有代碼都會(huì)有瑕疵,謹(jǐn)慎使用。
9.響鈴設(shè)計(jì)
9.1設(shè)計(jì)要求:
要求掌握響鈴的使用方法。設(shè)計(jì)程序,從鍵盤接收輸入字符,如是數(shù)字N,則響鈴N次,如輸入為非數(shù)字,則不響鈴。
9.2設(shè)計(jì)思路:
判斷輸入為0~9之間,將N值給BP,設(shè)置響鈴延時(shí)次數(shù)CX輸出N次響鈴。

9.3程序清單:
DATA SEGMENT
pkey DB 0AH,0DH,'please input the N:','$'
ERR DB 0AH,0DH,'eero!',0AH,0DH,'please input the N again:','$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
STATE: MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA DX,pkey
MOV AH,09H
INT 21H ;DOS功能調(diào)用,輸出字符串
INPUT: MOV AH,01H
INT 21H
CMP AL,'9'
JA eero
CMP AL,'0'
JB eero
SUB AL,30H ;輸入為0~9,則AL為響鈴次數(shù)
SUB AH,AH
MOV BP,AX ;BP為響鈴次數(shù)N
xiang: MOV CX,4 ;CX為響鈴延時(shí)時(shí)間
MOV AH,02H
MOV DL,07H
INT 21H ;DOS功能調(diào)用,響鈴
LP: LOOP LP ;響鈴延時(shí)
DEC BP
JNZ xiang ;響鈴N次
JMP STATE
eero: LEA DX,ERR
MOV AH,9
INT 21H ;輸出錯(cuò)誤字符串
JMP INPUT
CODE ENDS
END STATE
9.4程序運(yùn)行結(jié)果及分析:
設(shè)置CX次數(shù)為延時(shí)次數(shù),BP次數(shù)為響鈴次數(shù),調(diào)用響鈴功能通過(guò)延時(shí)實(shí)現(xiàn)響鈴,起初會(huì)把延時(shí)次數(shù)和響鈴次數(shù)混淆導(dǎo)致錯(cuò)誤。

圖9 響鈴設(shè)計(jì)結(jié)果
10.需要外接揚(yáng)聲器的發(fā)聲程序
10.1機(jī)槍聲音
PROGRAM SEGMENT
MAIN PROC FAR
ASSUME CS:PROGRAM
ORG 100H
STRAT:MOV CX,20D
NEW_SHOT:PUSH CX
CALL SHOOT
MOV CX,4000H
SILENT:LOOP SILENT
POP CX
LOOP NEW_SHOT
INT 20H
MAIN ENDP
SHOOT PROC NEAR
MOV DX,140H
MOV BX,20H
IN AL,61H
AND AL,11111100B
SOUND:XOR AL,2
OUT 61H,AL
ADD DX,9248H
MOV CL,3
ROR DX,CL
MOV CX,DX
AND CX,1FFH
OR CX,10
WAIT: LOOP WAIT
DEC BX
JNZ SOUND
AND AL,11111100B
OUT 61H,AL
RET
SHOOT ENDP
PROGRAM ENDS
END STRAT
10.2音樂(lè)播放
;定義數(shù)據(jù)段
data segment
infor1 db 0Dh, 0AH, "welocom you to come here listeng! $"
mus_freg dw 330,294,262,294,3 dup (330) ;頻率表
dw 3 dup (294),330,392,392
dw 330,294,262,294,4 dup (330)
dw 294,294,330,294,262,-1
mus_time dw 6 dup (25),50 ;節(jié)拍表
dw 2 dup (25,25,50)
dw 12 dup (25),100
data ends
;棧段定義
stack segment stack
db 200 dup(?)
stack ends
;--------字符串輸出宏----------
SHOWBM MACRO b
LEA DX,b
MOV AH,9
INT 21H
ENDM
;----------音樂(lè)地址宏-----------
ADDRESS MACRO A,B
LEA SI,A
LEA BP,DS:B
ENDM
;代碼段定義
code segment
assume ds:data, ss:stack, cs:code
start:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 200
address mus_freg, mus_time
call music
exit:
mov ah, 4cH
int 21h
;------------發(fā)聲-------------
gensound proc near
push ax
push bx
push cx
push dx
push di
mov al, 0b6H
out 43h, al
mov dx, 12
mov ax, 348ch
div di
out 42h, al
mov al, ah
out 42h, al
in al, 61h
mov ah, al
or al, 3
out 61h, al
wait1:
mov cx, 3314
call waitf
delay1:
dec bx
jnz wait1
mov al, ah
out 61h, al
pop di
pop dx
pop cx
pop bx
pop ax
ret
gensound endp
;--------------------------
waitf proc near
push ax
waitf1:
in al,61h
and al,10h
cmp al,ah
je waitf1
mov ah,al
loop waitf1
pop ax
ret
waitf endp
;--------------發(fā)聲調(diào)用函數(shù)----------------
music proc near
xor ax, ax
freg:
mov di, [si]
cmp di, 0FFFFH
je end_mus
mov bx, ds:[bp]
call gensound
add si, 2
add bp, 2
jmp freg
end_mus:
ret
music endp
code ends
end start
到此這篇關(guān)于匯編語(yǔ)言之實(shí)現(xiàn)發(fā)出各種聲音的文章就介紹到這了,更多相關(guān)匯編發(fā)出各種聲音內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
匯編語(yǔ)言基礎(chǔ)理解計(jì)算機(jī)底層技術(shù)原理
這篇文章主要為大家介紹了匯編語(yǔ)言基礎(chǔ),理解計(jì)算機(jī)底層原理,想要成為高級(jí)程序員,我們必須要學(xué)會(huì)匯編語(yǔ)言,匯編語(yǔ)言是非常重要的計(jì)算機(jī)底層技術(shù),一般用于底層的編寫2021-11-11
匯編語(yǔ)言程序設(shè)計(jì)之根據(jù)輸入改變屏幕顏色的代碼
這篇文章主要介紹了匯編語(yǔ)言中的根據(jù)輸入改變屏幕顏色的代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
匯編語(yǔ)言XOR指令:對(duì)兩個(gè)操作數(shù)進(jìn)行邏輯(按位)異或操作(推薦)
匯編語(yǔ)言(assembly language)是一種用于電子計(jì)算機(jī)、微處理器、微控制器或其他可編程器件的低級(jí)語(yǔ)言,亦稱為符號(hào)語(yǔ)言。這篇文章主要介紹了匯編語(yǔ)言XOR指令:對(duì)兩個(gè)操作數(shù)進(jìn)行邏輯(按位)異或操作,需要的朋友可以參考下2020-01-01
匯編語(yǔ)言指令集學(xué)習(xí)條件轉(zhuǎn)移指令詳解
這篇文章主要為大家介紹了匯編語(yǔ)言指令集學(xué)習(xí)條件轉(zhuǎn)移的指令全面總結(jié)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11

