>学号:08课程设计】-\题目音乐演奏程序设计教学院计算机学院专业计算机科学与技术班级05级本科(2)班…姓名李锐指导教师马学军晏伯武姚莉杨斐2008年01月16日^目录一概述 (2)二总体方案设计 (4)三详细设计 (8)…四程序的调试与运行结果说明 (13)五课程设计总结 (14)参考文献 (15);一概述汇编语言是计算机能够提供给用户使用的最快而有效的语言,也是能够利用计算机所有特性并能直接控制硬件的唯一语言。
借助于汇编程序,计算机本身可以自动地把汇编源程序翻译成用机器语言表示的目的程序,从而实现了程序设计工作的部分自动化。
1课程设计的目的掌握一些程序设计的基本方法,要指导主程序,子程序以及推栈段的使用,.了解通用发声程序.了解与掌握定时.计数.音乐.频率.时间之间的关系,学会用发声程序的设计方法,学会用汇编语言编辑音乐程序.2课程设计的要求1、需要的基本知识与技能。
]具备汇编语言设计、编写、调试和运行程序的方法和技巧。
在PC机上运行汇编程序需要经过以下几个阶段:编辑源程序。
利用文本编辑工具编辑源程序,生成一个汇编语言的纯文本文件。
文件的扩展名为.ASM汇编源程序。
用汇编器汇编源程序生成目标代码文件,目标代码文件的扩展名是.OBJ,汇编器还可以生成列表文件和交叉参考文件。
汇编器相当于高级语言中的编译器。
汇编语言按照汇编语言的语法检查源程序,如果源程序语法有错误,汇编器就不生成目标代码文件,这时,必须重新编辑源程序,修改语法错误。
当发现源程序有的行含有不确定因素,汇编器会给出警告信,但按却省处理方法生成目标代码文件。
此时,可以重新编辑源程序,消去不确定因素。
连接目标程序。
利用连接器连接目标代码程序和库函数代码生成可执行程序文件。
一般单个模块的连接可以顺利地生成可执行程序文件。
当多个模块连接,或者库函数连接时,如果在目标代码中找不到所需的连接信息,连接器就会发生错误提示信息,而不是生成可执行文件。
这时,这就要重新编辑源程序,并汇编程序。
调试可执行程序。
程序的动态调试是在形成可执行文件后,针对可执行程序进行的。
DEBUG是简单的动态调试工具,利用调试工具动态的调试程序,找出程序中的问题,那么就要重新编辑,汇编源程序。
2、尚未掌握的知识点。
有时在程序中定义了较多的宏,或者可以把自己编译中常用的宏定义建立一个独立的文件,这个只包含若干定义宏文件的文件可称为宏库,通常用扩展名MAC或INC来表示。
当应用程序中需要用到宏库中的宏定义时,只需要用语句说明。
有时汇编语言程序需要连续重复地完成相同或者几乎完全相同的一组代码,这时,可使用重复汇编。
汇编程序把重复模块代码重复几次,每次重复把重复块中的哑元用自变量表中的一项取代,下一次取代一次,重复次数由自变量表中的自变量个数来确定。
条件汇编中,汇编程序能够根据条件把一段源程序或者把它排去在外,这里用到条件伪操作。
条件伪操作可以用在宏定义体内,也可以用在宏定义体外,并且可以嵌套任意次。
;模块化程序设计方法是按照各部分程序所实现的不同功能把程序划分成为多个模板。
各个模板在明确各自的功能和相互间的约定后,就可以编制和调试程序,最后把它们连接起来形成一个大程序,子程序结构是模块化程序设计的基础。
子程序相当于高级语言中的过程和函数。
在一个程序的不同部分,往往就要用到类似的程序段,这写程序段的功能个结构形式都相同,只是有的变量赋值不同,此时就可以把这些程序写成子程序形式,以便需要时调拥它。
计算机中有一个可编程时间间隔定时器8253/54,它能根据程序提供的计数值和工作模式,产生各种计数/定时脉冲,提供给系统的各个部分使用。
先要设定控制字,以选择计数器,确定工作模式和计数的值。
每个计数器由3个外引腿与外部联系,在对任一个计数妻编程时,首先将控制字节写入控制寄存器。
控制字的作用是告诉8253/54选择那一个计数器工作,要求输入什么样的脉冲波形。
另外对其初始化工作好包括,向选定计数器送一个初值。
PC机上的大多数I/O都是主板的8255的可编程外围接口芯便管理的,PPI包括三个8位寄存器,两个用于输入功能,一个用于输出功能。
利用CPU产生延迟时间是最常用的方法,但是对于不同的计算机,它们产生的延迟时间都是不一样的。
组成乐曲的每个音符的频率和持续时间是乐曲程序发声所需要的两个数据。
音符的持续时间是根据乐曲的速度及每个音符的节拍来确定的。
在4/4中,四分音符为一拍,每小节四拍,全音符持续四拍,四分音符持续一拍,八分音符持续半拍等。
3、教师对本题目所提出的要求等。
(1)重视实验方案设计(2)认真作好实验准备(3)仔细观测实验现象,如实记录实验数据(4)分析故障原因,精心排除故障~二总体方案设计主程序流程图:]—图1 主程序流程图】Music子程序流程图:】、子程序,这能根据BL1个或几个秒,频率为896HZ的声音,我们可以利用并修改BEEP,使其产生任一频率的声音。
首先要了解计算机是如何产生声音和乐曲的。
找出相关程序源代码,弄清楚各功能的环节间的联系、联接方法,搞清楚单调与频率和时间的关系,利用计算机控制发声的原理,依照基本的算法思想写程序,测试,更正,扩充功能,修饰细节。
本次设计在具体设计过程中的整体设计思路如下:该程序主要分成1.根据音阶表和简谱为演奏的乐曲定义一个频率表mus_freq和一个时间表mus_time。
2.分别将两个表的偏移地址放入SI和BP。
…lea si, mus_freqlea bp, ds:mus_time3.从表中取出音符的频率放入DI,取出音符的持续时间(实际上是10ms 的倍数)放入BX。
mov di, [si]mov bx, ds:[bp]频率表中最后一个数据-1作为乐曲的结束符,也可用其他的特殊值来代替。
4.调用通用发声子程序SOUNDF发出音调。
这个程序比较简单,如果想演奏另一个乐曲,只需把mus_freq和mus_time 两个表中的数据换成另一个乐曲的频率和节拍时间就可以了。
该算法的整体思路是在这个设计中用到了BEEP通用发声程序,我们利用对BEEP程序的修改让它产生任何一种频率的声音,也可以让声音的持续时间更容易被调整在编译的过程中,用到了子程序调用,分别根据输入调用music1,music2,music3程序还要调用子程序gensound发出音调,主要特点是程序简单明了,有良好的交互界面。
程序的主要功能是给用户提供三首已经写好的短曲,根据用户的选择演奏乐曲,演奏完一首乐曲后跳回起始状态,如此循环,直到用户输入结束的信息为止。
@本程序设计过程的整体设计思路是通过定义数据段,堆栈段和代码段实现程序的各种要求。
其中堆栈段是为乐曲的音调及频率的数据分配空间;数据段是记录程序运行过程中所需的信息,包括字符信息,单调数据,音频数据;代码段则是程序算法部分, 通过对各数据的调用,实现音乐演奏功能。
我所承担的部分设计工作是找出相关程序源代码,弄清楚各功能的环节间的联系、联接方法,搞清楚单调与频率和时间的关系,写出其中的一个音乐文件的代码,理解其在总程序中的作用。
依照基本的算法思想写程序,测试,更正,扩充功能,修饰细节。
5.系统的主要功能:给用户提供三首已经写好的短曲,根据用户的选择演奏乐曲,演奏完一首乐曲后跳回起始状态,如此循环,直到用户输入结束的信息为止。
/6.发声原理图:图3 发声原理图】三详细设计本程序通过Intel汇编语言来实现一个简单的奏乐。
程序中提供一个音乐菜单,用键盘数字键选择相应的音乐后,便开始播放原先编制好的音乐。
程序将帮助你进一步的了解Intel汇编语言编程的一些原理。
演奏音乐程序: 编写用键盘选择计算机演奏乐曲的程序,要求程序运行首先在屏幕上显示出乐曲菜单.例:A.玛丽有只小羔羊B.太湖船C.祝福歌。
键盘输入各音乐对应的字母,便可插放音乐。
输入q,则退出。
输入除A到C以外的字符,提示输入出错,提示再次输入。
播放完音乐,再次提供乐曲清单。
可再次选择乐曲。
;音乐程序.运行行程序,按大写字母“A”,唱乐曲“玛丽有只小羔羊”;;按大写字母“B”,唱乐曲“太湖船”;按大写字母“C”,唱乐曲“祝福歌”;按"X"鍵,退出程序清单如下::;数据段DATA SEGMENT PARA 'DATA'INFO1 DB 0DH,0AH,'WELCOME YOU TO COME HERE!$'INFO2 DB 0DH,0AH,'this is a music program!$'INFO3 DB 0DH,0AH,'please select!$'INFO4 DB 0DH,0AH,'INPUT ERROR!$'INFO5 DB 0DH,0AH,'PLEASE INPUT AGAIN!$'<MUSLIST DB 0DH,0AH,'A MUSIC1'DB 0DH,0AH,'B MUSIC2'DB 0DH,0AH,'C MUSIC3'DB 0DH,0AH,'Q EXIT'db 0dh,0ah,'$'MUS_FREG1 DW 330,294,262,294,3 DUP (330) ;音乐1的频率表1,2小节DW 3 DUP (294),330,392,392 ;3,4小节DW 330,294,262,294,4 DUP (330) ;5,6小节\DW 294,294,330,294,262,-1 ;7,8小节MUS_TIME1 DW 6 DUP (25*8),50*8 ;音乐1的时间节拍表1,2小节 DW 2 DUP (25*8,25*8,50*8) ;3,4小节DW 12 DUP (25*8),100*8 ;5~8小节MUS_FREG2 DW 330,392,330,294,330,392,330,294,330DW 330,392,330,294,262,294,330,392,294DW 262,262,220,196,196,220,262,294,332,262,-1MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100!DW 2 DUP(50,50,25,25),100DW 3 DUP(50,25,25),100MUS_FREG3 DW 262,262,294,262,349DW 330,262,262,294,262DW 392,349,262,262,523DW 440,349,262,262,466DW 466,440,262,392,349,-1~MUS_TIME3 DW 50,50,100,100,100DW 100,100,50,50,100,100DW 100,100,100,50,50,100DW 100,100,100,100,100,50DW 50,100,100,100,100,100DATA ENDS~;堆栈段STACK SEGMENT PARA STACK 'STACK'DB 200 DUP ('STACK') ;初始化堆栈STACK ENDS;代码段CODE SEGMENT~ASSUME DS:DATA,SS:STACK,CS:CODEMAIN PROC FARMOV AX,DATA ;数据段装入段寄存器DSMOV DS,AXMOV aH, 0 ;BIOS功能调用,设置显示方式 MOV AL,4INT 10H ;十号doc中断MOV AH,0BH ;0B号doc调用:MOV BH,0MOV BL,4INT 10HMOV AH,0BHMOV BH,01HMOV BL,00INT 10HSHOW MACRO b ;定义一个宏】LEA DX,bMOV AH,9 ;9号doc调用INT 21HENDMshow INFO1show INFO2show INFO3show MUSLIST、INPUT: MOV AH,01H ;键盘输入并回显INT 21HCMP AL,'Q'JZ retu ;退出CMP AL,'A'JNZ B0CALL MUSIC1\JMP EXIT1B0: CMP AL,'B'JNZ C0CALL MUSIC2JMP EXIT1C0: CMP AL,'C'JNZ exitCALL MUSIC3-EXIT1: show INFO5 ;宏调用JMP INPUTEXIT:call clearshow INFO4show INFO5show INFO1show INFO2?show INFO3show MUSLISTjmp inputRETU: MOV AH,4CH ;带返回码终止INT 21HMAIN ENDPMUSIC1 PROC NEARPUSH DS:SUB AX,AX ;AX清零PUSH AXLEA SI,MUS_FREG1LEA BP,DS:MUS_TIME1FREG1: MOV DI,[SI]CMP DI,-1 ;音符的频率是否结束JE END_MUS1 ;若是则返回MOV DX,DS:[BP] ;取出音符的持续时间放入BX…MOV BX,1400CALL GENSOUND ;调用GENSOUND子程序发出音调 ADD SI,2ADD BP,2JMP FREG1END_MUS1:RETMUSIC1 ENDP\GENSOUND PROC NEARPUSH AX ;保存将要用到的寄存器PUSH BXPUSH CXPUSH DXPUSH DIMOV AL,0B6H ;向8253-5/8254-2计数器写入控制字OUT 43H,AL ;方式3、双字节写和二进制计数方式写到控制口》MOV DX,12H ;设置被除数MOV AX,533H*896DIV DI ;其商(AX)为预置值OUT 42H,AL ;先送LSBMOV AL,AHOUT 42H,AL ;后送MSBIN AL,61H ;读8255端口B(61H)原值MOV AH,AL ;保存端口原值—OR AL,3OUT 61H,AL ;接通扬声器WAIT1: MOV CX,8FF0H ;在80486/DX2/66中取DELAY1: LOOP DELAY1DEC BXJNZ WAIT1MOV AL,AH ;写回61H口原值,关闭扬声OUT 61H,AL、POP DI ;恢复寄存器POP DXPOP CXPOP BXPOP AXRET ;子程序结束返回GENSOUND ENDPMUSIC2 PROC NEAR[PUSH DSSUB AX,AXPUSH AXLEA SI,MUS_FREG2LEA BP,DS:MUS_TIME2FREG2: MOV DI,[SI]CMP DI,-1JE END_MUS2$MOV DX,DS:[BP]MOV BX,1400CALL GENSOUNDADD SI,2ADD BP,2JMP FREG1END_MUS2:RET)MUSIC2 ENDPMUSIC3 PROC NEARPUSH DSSUB AX,AXPUSH AXLEA SI,MUS_FREG3LEA BP,DS:MUS_TIME3FREG3: MOV DI,[SI]、CMP DI,-1JE END_MUS3MOV DX,DS:[BP]MOV BX,1400CALL GENSOUNDADD SI,2ADD BP,2JMP FREG1~END_MUS3:RETMUSIC3 ENDPclear proc near ;清屏子程序push axpush bxpush cxpush dx>mov ah,6 ;屏幕初始化或上卷 mov al,0mov ch,0 ;左上角行号为0mov cl,0 ;左上角列号为0mov dh,24 ;右下角行号为24mov dl,79 ;右下角列号为79mov bh,7 ;卷入行属性为7int 10h ;调用显示BIOS)pop dxpop cxpop bxpop axretclear endpCODE ENDSEND MAIN|四程序的调试与运行结果说明一程序的调试:1.编辑源程序,假定源文件名为。