课程设计任务书学生姓名:王琨专业班级:自动化1105班指导教师:向馗工作单位:自动化学院题目: 音乐演奏程序设计要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.使用汇编语言设计一个在计算机上运行的音乐演奏程序。
2.屏幕显示钢琴图像。
3.实现以下附加功能:按“D”键,加快播放速度,按“E”键,降低播放速度。
4. 按"X"鍵,退出。
5.撰写课程设计说明书。
内容包括:摘要、目录、正文、参考文献、附录(程序清单)。
正文部分包括:设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。
时间安排:12月30日-----12月31日查阅资料及方案设计1月2日-----1月3日编程1月6日调试程序1月7日-----1月8日撰写课程设计报告指导教师签名:年月日系主任(或责任教师)签名:年月日摘要汇编语言(Assembly Language)是面向机器的程序设计语言。
在汇编语言中,用助记符(Memoni)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址,如此就增强了程序的可读性并且降低了编写难度,象这样符号化的程序设计语言就是汇编语言,因此亦称为符号语言。
使用汇编语言编写的程序,机器不能直接识别,还要由汇编程序或者叫汇编语言编译器转换成机器指令。
因为用汇编语言设计的程序最终被转换成机器指令,故能够保持机器语言的一致性,直接、简捷,并能像机器指令一样访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。
使用汇编语言,可以访问所有能够被访问的软、硬件资源。
使用的编译软件是masm for windows ,MASM是微软公司开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32asm,是Windows下开发汇编的利器。
它与Windows平台的磨合程度非常好,但是在其他平台上就有所限制,使用MASM 的开发人员必须在Windows下进行开发。
关键词:汇编语言、MASM、DOS环境目录1设计说明 (1)2程序设计 (1)2.1设计思路分析 (1)2.2程序设计流程图 (1)2.3程序代码 (3)3程序的调试与编译 (9)3.1调试程序 (9)3.2 运行程序 (10)4心得体会 (12)参考文献 (14)音乐演奏程序设计1设计说明所设计的系统使用了汇编语言设计一个在计算机上可运行的音乐演奏程序。
屏幕会显示显示一钢琴琴键的图像。
并且按“D”键,会加快音乐播放速度,按“E”键,会降低音乐播放速度。
如果按"X"鍵,则会退出音乐播放程序。
2程序设计2.1设计思路分析钢琴键盘的绘制这部分主要实现画钢琴键盘键身的功能。
它是由一个个白色的长方块构成的,我们需要用BIOS调用编织线使程序。
显示适配器都自带显示服务的BIOS,利用它所提供的BIOS调用来编写程序,对于我们编程应用者来说是透明的,我们只需要调用显示驱动程序INT 10H。
钢琴主要是由矩形、直线等规则几何形状构成,可以采用文本方式,也将屏幕设置成图形显示方式,通过画点、画线等基本程序完成钢琴的绘制。
通过设定白键和黑键的起始坐标,来改黑、白键的长度和相对位置从而完成绘制。
加快播放速度与降低播放速度是在不同三个段A0、A1、A2定义播放速度变量RATE的不同值,按下A正常播放跳转到A,当要实现附加功能时按下D 或者E的时候会相应跳转到A1、A2使得音乐以不同的速度播放,从而实现降低音乐播放速度或者提高音乐播放速度的功能。
2.2程序设计流程图音乐模块流程图:2.3程序代码DATA SEGMENTFLAG DB 1RATE DW ? ;播放速度变量INFO1 DB 0DH,0AH,'Welcome To Music!$'INFO2 DB 0DH,0AH,'Please enter A to start music!$'INFO3 DB 0DH,0AH,'OPTIONS:$'INFO4 DB 0DH,0AH,'WRONG ORDER!$'INFO5 DB 0DH,0AH,'PLEASE INPUT AGAIN!$'MUSLIST DB 0DH,0AH,'A: START'DB 0DH,0AH,'X: ESC'DB 0DH,0AH,'D: High Speed'DB 0DH,0AH,'E: Low Speed'DB 0DH,0AH,'$' ;提示语;音乐一------------------------------------------------------------ MUS_FREG1 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,-1MUS_TIME1 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 ENDSSTACK SEGMENTDB 400 DUP ('STACK')STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: ;主程序MOV AH,0MOV AL,12H;图形方式INT 10HMOV AH,6MOV BH,9;蓝色色背景MOV AL,0;清屏MOV CH,0MOV DH,29MOV DL,79INT 10HMOV SI,200MOV DX,400REDRAW:MOV DI,26ADD DI,46MOV CX,26DEC DXCMP DX,SIJB NEXTMOV BL,0PAINT:MOV AH,0CHMOV AL,7;印出点的颜色白色->AL,画白色琴键 MOV BH,0;页号INT 10HINC CXCMP CX,DIJBE PAINTADD DI,74ADD CX,28INC BLCMP BL,7JBE PAINTJMP REDRAWNEXT:MOV SI,200MOV DX,300REDRAW1:MOV DI,63ADD DI,46MOV CX,63DEC DXCMP DX,SIJB LLMOV BL,0PAINT1: MOV AL,0;印出点的颜色黑色->AL,画黑色琴键 MOV AH,0CHMOV BH,0INT 10HJUMP:INC CXCMP CX,DIJBE PAINT1ADD DI,74ADD CX,28INC BLCMP BL,7JBE PAINT1JMP REDRAW1LL:MOV AX,DATAMOV DS,AXCALL MUSIC_PLAY ; 音乐播放子程序MUSIC_PLAY PROCSHOW MACRO b ;定义一个宏显示字符串LEA DX,bMOV AH,9INT 21HENDMADDRESS MACRO A,B ;音乐地址宏 LEA SI,ALEA BP,DS:BENDMSHOW INFO1SHOW INFO2SHOW INFO3SHOW MUSLIST ;提示语INPUT:MOV AH,01HINT 21HCMP AL,'X'JZ RETU ;按下为‘X’则退出dosCMP AL,'A' ;按下为‘A’则播放音乐JZ A0 ;是则跳到A0SHOW INFO4SHOW INFO5JMP INPUT ;否则提示输入错误,重新开始 CMP AL,'E' ;按下为‘E’则减速播放音乐JZ A1 ;是则跳到A1CMP AL,'D' ;按下为‘D’则加速播放音乐 JZ A2 ;是则跳到A2A0:ADDRESS MUS_FREG1,MUS_TIME1MOV RATE,4000 ;设置正常播放速度CALL MUSICJMP INPUTA1: ADDRESS MUS_FREG1,MUS_TIME1MOV RATE,10000 ;设置减慢播放速度CALL MUSICJMP INPUTA2:ADDRESS MUS_FREG1,MUS_TIME1MOV RATE,1000 ;设置加快播放速度CALL MUSICJMP INPUTRETU:MOV AH,4CHINT 21HAGAIN:SHOW INFO5JMP INPUTEXIT:ADDRESS MUS_FREG1,MUS_TIME1MOV RATE,4000 ;设置正常播放速度CALL MUSICJMP AGAINJMP INPUTRETMUSIC_PLAY ENDP;发声GENSOUND PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSH DIMOV AL,0B6H ;开扬声器OUT 43H,ALMOV DX,12HMOV AX,348CHDIV DIOUT 42H,ALMOV AL,AHOUT 42H,ALIN AL,61HMOV AH,ALOR AL,3OUT 61H,ALWAIT1:MOV CX,RATE ;设置播放速度CALL WAITFDELAY1:DEC BXJNZ WAIT1MOV AL,AHOUT 61H,ALPOP DIPOP DXPOP CXPOP BXPOP AXRETGENSOUND ENDPWAITF PROC NEARPUSH AXWAITF1:IN AL,61HAND AL,10HCMP AL,AHJE WAITF1MOV AH,ALLOOP WAITF1POP AXRETWAITF ENDPMUSIC PROC NEARPUSH DSSUB AX,AXPUSH AXFREG:MOV DI,[SI] ;获取频率值CMP DI,-1 ;音乐播放结束判断 JE END_MUSMOV BX,DS:[BP]CALL GENSOUND ;播放一个频率ADD SI,2ADD BP,2 ;获取下一频率值,及其播放时间 MOV AH,0BH ;判断键盘是否有键按下INT 21HCMP AL,0FFHJE INT9 ;有键按下则转去执行该指令JMP FREG ;无键按下则继续读取下一个频率值END_MUS:RETINT9:PUSHFPUSH AXPUSH DSPUSH ESPUSH CSPOP DSPUSH CSPOP ESIN AL,60H ;从键盘获取该键值ASCII码MOV AH,01HINT 21H ;读取并保存到AL中CMP AL,'X' ;若为‘X’则退出dos操作界面JZ X0CMP AL,'D'JZ A2CMP AL,'E'JZ A1;否则提示输入错误,重新开始INT9_QUIT:POP ESPOP DSPOP AXPOPFJMP FREGA1:POP ESPOP DSPOP AXPOPFADDRESS MUS_FREG1,MUS_TIME1MOV RATE,10000 ;设置减慢播放速度CALL MUSICJMP INPUTA2:POP ESPOP DSPOP AXPOPFADDRESS MUS_FREG1,MUS_TIME1MOV RATE,1000 ;设置加快播放速度CALL MUSICJMP INPUTINPUT:MOV AH,01HINT 21HCMP AL,'X'JZ RETU ;按下为‘X’则退出dosSHOW INFO4SHOW INFO5JMP INPUT ;否则提示输入错误,重新开始X0:POP ESPOP DSPOP AXPOPFJMP RETURETU:MOV AH,4CHINT 21HMUSIC ENDPCODE ENDSEND START3程序的调试与运行3.1调试程序调试过程与编写程序的过程紧密相关,具体过程也就是把源程序放在MASM for Windows中进行编译,如果源程序中有错误,编译时系统就会给出提示,根据系统提示可以找到是哪一行出现了问题,对其进行分析并修改,重新编译,直到编译时系统对那一行没有给出提示为止。