汇编语言之实现发出各种声音

软件:emu8086
语言:汇编语言(Assembly)
注意:本文列出了响铃,机枪声音,音乐播放的代码,第一个代码为博主独自一人编写,所有代码都会有瑕疵,谨慎使用。
9.响铃设计
9.1设计要求:
要求掌握响铃的使用方法。设计程序,从键盘接收输入字符,如是数字N,则响铃N次,如输入为非数字,则不响铃。
9.2设计思路:
判断输入为0~9之间,将N值给BP,设置响铃延时次数CX输出N次响铃。
【汇编语言之实现发出各种声音】汇编语言之实现发出各种声音
文章图片

9.3程序清单:

DATASEGMENTpkeyDB0AH,0DH,'please input the N:','$'ERRDB0AH,0DH,'eero!',0AH,0DH,'please input the N again:','$'DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTATE:MOV AX,DATAMOV DS,AXMOV ES,AX LEA DX,pkeyMOV AH,09HINT 21H; DOS功能调用,输出字符串INPUT:MOV AH,01HINT 21HCMP AL,'9'JAeeroCMP AL,'0'JBeeroSUB AL,30H; 输入为0~9,则AL为响铃次数SUB AH,AHMOV BP,AX; BP为响铃次数Nxiang:MOV CX,4; CX为响铃延时时间MOV AH,02HMOV DL,07HINT 21H; DOS功能调用,响铃 LP:LOOP LP; 响铃延时DEC BPJNZ xiang; 响铃N次JMP STATEeero:LEA DX,ERRMOV AH,9INT 21H; 输出错误字符串JMP INPUTCODEENDSENDSTATE

9.4程序运行结果及分析:
设置CX次数为延时次数,BP次数为响铃次数,调用响铃功能通过延时实现响铃,起初会把延时次数和响铃次数混淆导致错误。
汇编语言之实现发出各种声音
文章图片

图9 响铃设计结果
10.需要外接扬声器的发声程序
10.1机枪声音
PROGRAM SEGMENTMAIN PROC FARASSUME CS:PROGRAMORG 100HSTRAT:MOV CX,20DNEW_SHOT:PUSH CXCALL SHOOTMOV CX,4000H SILENT:LOOP SILENTPOP CXLOOP NEW_SHOTINT 20H MAIN ENDPSHOOT PROC NEARMOV DX,140HMOV BX,20HINAL,61HAND AL,11111100B SOUND:XOR AL,2OUT 61H,ALADD DX,9248HMOV CL,3ROR DX,CLMOV CX,DXAND CX,1FFHOR CX,10WAIT: LOOP WAIT DEC BXJNZ SOUNDAND AL,11111100BOUT 61H,ALRETSHOOT ENDPPROGRAM ENDS END STRAT

10.2音乐播放
; 定义数据段data segmentinfor1 db 0Dh, 0AH, "welocom you to come here listeng! $"mus_fregdw 330,294,262,294,3 dup (330); 频率表dw 3 dup (294),330,392,392dw 330,294,262,294,4 dup (330)dw 294,294,330,294,262,-1mus_timedw 6 dup (25),50; 节拍表dw 2 dup (25,25,50)dw 12 dup (25),100data ends; 栈段定义stack segment stackdb 200 dup(?)stack ends; --------字符串输出宏----------SHOWBM MACRO bLEA DX,bMOV AH,9INT 21H ENDM; ----------音乐地址宏-----------ADDRESS MACRO A,BLEA SI,ALEA BP,DS:BENDM; 代码段定义code segmentassume ds:data, ss:stack, cs:codestart:mov ax, datamov ds, axmov ax, stackmov ss, axmov sp, 200address mus_freg, mus_timecall musicexit:mov ah, 4cHint 21h; ------------发声-------------gensound proc nearpush axpush bxpush cxpush dxpush dimov al, 0b6Hout 43h, almov dx, 12mov ax, 348chdiv diout 42h, almov al, ahout 42h, al in al, 61hmov ah, alor al, 3out 61h, alwait1:mov cx, 3314call waitfdelay1:dec bxjnz wait1mov al, ahout 61h, alpop dipop dxpop cxpop bxpop axret gensound endp; --------------------------waitf proc nearpush axwaitf1:in al,61hand al,10hcmp al,ahje waitf1mov ah,alloop waitf1pop axretwaitf endp; --------------发声调用函数----------------music proc nearxor ax, axfreg:mov di, [si]cmp di, 0FFFFHje end_musmov bx, ds:[bp]call gensoundadd si, 2add bp, 2jmp fregend_mus:retmusic endpcode endsend start

到此这篇关于汇编语言之实现发出各种声音的文章就介绍到这了,更多相关汇编发出各种声音内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    推荐阅读