匯編語言之實(shí)現(xiàn)發(fā)出各種聲音
軟件:emu8086
語言:匯編語言(Assembly)
注意:本文列出了響鈴,機(jī)槍聲音,音樂播放的代碼,第一個(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)用響鈴功能通過延時(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音樂播放
;定義數(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 ;----------音樂地址宏----------- 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)于匯編語言之實(shí)現(xiàn)發(fā)出各種聲音的文章就介紹到這了,更多相關(guān)匯編發(fā)出各種聲音內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
匯編語言進(jìn)制轉(zhuǎn)換之16進(jìn)制轉(zhuǎn)10進(jìn)制
這篇文章主要介紹了匯編語言進(jìn)制轉(zhuǎn)換之16進(jìn)制轉(zhuǎn)10進(jìn)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07UEFI開發(fā)實(shí)戰(zhàn)用戶交互界面使用說明VFR文件
這篇文章主要為大家介紹了UEFI開發(fā)實(shí)戰(zhàn)用戶交互界面使用說明VFR文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06使用匯編實(shí)現(xiàn)字符串的大小寫轉(zhuǎn)換
這篇文章主要介紹了使用匯編實(shí)現(xiàn)字符串的大小寫轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01淺析shellcode 反匯編模擬運(yùn)行及調(diào)試方法
這篇文章主要介紹了shellcode 反匯編,模擬運(yùn)行以及調(diào)試方法,本文給大介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02ARM匯編判斷之如何用匯編判斷數(shù)組中正負(fù)數(shù)個(gè)數(shù)
這篇文章主要介紹了ARM匯編判斷之如何用匯編判斷數(shù)組中正負(fù)數(shù)個(gè)數(shù),在匯編語言中程序的基本框架是不變的,這里我們可以直接把正向遍歷的程序給貼過來,然后我們思考怎么運(yùn)用判斷后綴把數(shù)組中正數(shù)和負(fù)數(shù)分開,進(jìn)行判斷個(gè)數(shù)和分別求和,需要的朋友可以參考下2022-04-04