欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    汇编课程设计乐曲演奏程序武汉理工大学(共26页).doc

    • 资源ID:14193451       资源大小:150.50KB        全文页数:26页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    汇编课程设计乐曲演奏程序武汉理工大学(共26页).doc

    精选优质文档-倾情为你奉上学 号: 12课 程 设 计课程名称汇编语言程序设计题 目乐曲演奏程序学 院计算机科学与技术学院专 业计算机科学与技术班 级1001班姓 名XXX指导教师XXX2012年06月27日专心-专注-专业课程设计任务书学生姓名: XXX 专业班级: 计科1001班 指导教师: XXX 工作单位:计算机科学与技术学院 题目: 乐曲演奏程序初始条件:理论:完成了汇编语言程序设计课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。实践:完成了汇编语言程序设计的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)理解键盘接口的工作原理,掌握BIOS键盘I/O功能,掌握复杂内存数据结构的定义和管理方法。具体的设计任务及要求:1) 采用位触发方式编写程序,使计算机发出音响并演奏乐曲;2) 要求在屏幕上用键盘选择歌曲;3) 程序采用子程序结构,结构清晰;4) 友好清晰的用户界面,能识别输入错误并控制错误的修改。在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。阅读资料:1)IBMPC汇编语言程序设计实验教程实验2.42)IBMPC汇编语言程序设计(第2版)例6.11时间安排:设计安排一周:周1、周2:完成系统分析及设计。周3、周4:完成程序调试,和验收。周5:撰写课程设计报告。指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日乐曲程序的设计与实现1实验原理1.1 音调与频率和时间的关系 利用计算机控制发声的原理,可以编写演奏乐曲的程序。乐曲是按照一定的高低、长短和强弱关系组成的音调。在一首乐曲中,每个音符的音高和音长与频率和节拍有关。组成乐曲的每个音符的频率值和持续时间是乐曲程序发声需要的两个数据。但实际上卷入计数器的输入频率与音符频率相除的值,通用发声程序的前半部分就是完成这个计算,并将计数值送入计数器2的功能。音符的持续时间是根据乐曲的速度及音箱的节拍数来确定的。1.2 乐曲的频率和节拍 乐曲是按照一定的高低、长短、强弱组成的音调。在一首乐曲中,每个音符的音高和音长和频率和节拍有关。每个音符的频率值和持续时间是乐曲程序发声需要的两个必要数据。高音阶从中C(263)到高C(523), 各个音阶对应的频率如下所示:DW 263 - C DW 294 - D DW 330 - E DW 349 - F DW 392 - G DW 440 - A DW 494 - B DW 523 - C如果知道了乐曲的曲谱,就可以将每个音符的频率和持续时间定义为两个数据表,然后通过调用子程序将表中数据取出,通过扬声器发声。例如MERRY CHRISTMAS频率表和节拍表如下所示:CHST_F dw 7 dup(330),392,262,294,330,4 dup(349),2 dup(330),330,294,294,262,294,392 dw 7 dup(330),392,262,294,330,4 dup(349),2 dup(330),392,392,349,294,262,0 CHST_T dw 2 dup(25,25,50),4 dup(25),100,2 dup(25,25,50) dw 4 dup(25),2 dup(50),2 dup(25,25,50) dw 4 dup(25),100,2 dup(25,25,50),4 dup(25),100其中,CHST_F为频率表,CHST_T为节拍表,两个表中的数据一一对应,每一组代表着乐曲中的一个音符,频率表中以0作为结束的标志。1.3 实验要求1进一步理解和掌握程序直接控制I/O方式,掌握计算机发声程序的设计。具体的设计任务及要求:1) 进一步理解程序直接控制I/O方式和位触发方式控制声音的工作原理。2) 一首乐曲是由不同频率和节拍的音调组成,因此控制脉冲的频率和持续时间是编写乐曲程序的关键。根据已知的音符频率对照表,设置乐曲的频率表和节拍时间表;3) 编写程序并调试通过。2了解定时器的工作原理,掌握利用定时器产生声音的方法,使计算机演奏乐曲(例如两只老虎等)。编写程序并调试通过。1.4 通用发声程序的设计原理PC机发声系统以8254的2号计数器为核心。系统初始化时,2号计数器I作在“方波发生器”方式,初值为二进制数,写入顺序为先低后高,CLK2为1MHz,当计数初值为533H时,OUT2输出的方波大约为900Hz,经过简单的滤波之后,送至扬声器。改变1.4号计数器的计数初值就可以使扬声器发出不同频率的音响。ROM BIOS 中有个BEEP子程序,这能根据BL中组出的时间计数值控制8254定时器,产生持续时间为1个或几个0.5秒,频率为896HZ的声音,我们可以利用并修改BEEP,使其产生任一频率的声音。为此我们需要做两点修改,首先,BEEP程序只能产生896HZ的声音,我们的通用发声程序应能产生任一频率的声音。其次,BEEP产生声音的持续时间(音长)只能是0.5秒的倍数,我们希望声音的持续时间更易于调整,例如可以是10ms的倍数。我们知道BEEP能将计数值533H送给定时器2产生896HZ的声音的,那么产生其它频率声音的时间计数值应为:533H×896÷给定频率=H÷给定频率发声程序包括3个步骤: (1)在8253中的42端口送一个控制字0B6H(B),该控制字对定时器2进行初始化,使定时器2准备接收计数初值。 (2)在8253中的42H端口(Timer2)装入一个16位的计数值(533H×895/频率),以建立将要产生的声音频率。 (3)把输出端口61H的PB0、PB1两位置1,发出声音。 对于发音部分。PC机上的大多数输入/输出(I/O)都是由主板上的8255(或8255A)可编程序外围接口芯片(PPI)管理的。PPI包括3个8位寄存器,两个用于输入功能,一个用于输出功能。输入寄存器分配的I/O端口号为60H和62H,输出寄存器分配的I/O端口号为61H。由PPI输出寄存器中的0、1两位来选择扬声器的驱动方式。连接到扬声器上的是定时器2,从上图可以看到,GATE2与端口61H的PB0相连,当PB0=1时,GATE2获得高电平,使定时器2可以在模式3(方波)下工作。定时器2的OUT2与端口61H的PB1通过一个与门与扬声器的驱动电路相连。当PB1=1时,允许OUT2的输出信号到达扬声器电路。因此,只有PB0和PB1同时为“1”时,才能驱动扬声器地声。通过以下指令实现: IN AL,61H OR AL,3 OUT 61H,AL 上面的指令用以打开扬声器,如要关闭扬声器时则为: AND AL,0FCH OUT 61H,AL 当从8255中采集到输入的数据时,需要确定相应的频率,所以在软件编程时要建立一个数据表: TABLE DW 493,440,392,349,329,293,261 把相应的频率送到一个寄存器上,通过公式: 计数值=533H×896÷ f=1234DCH÷ f 算出计数值,再把算得的计数值送给8253,就可产生所要频率的方波。在把计数值送8253前,必须先把8253进行初始化: MOV AL,0B6H OUT 43H,AL 使其选用通道2,工作在方式3下。 就整个电路而言,接好电路后,通过软件编程不断地采集从8255口中输入的信号,而8个开关都接在8255的A口上,只要有开关按下,就会采集到一个数据,根据这个数据与事先编好的表对应,得到一个计数值,把这个计数值送给8253的通道2,8253的通道2工作的方式3下,这样就可以产生满足频率要求的发声方波。这个方波经驱动放大就可以使扬声器发出相应的声音。 所以8255在这里完成两个任务,它不仅从A口中采集到数据,而且B口的PB1和PB0两个位要控制发声。8253的主要任务就是产生所要求发声的不同频率的方波。2.1 设计实现及功能了解了乐曲演奏的原理,就可以开始设计方案。 首先,明确整个程序的结构及各个程序段的结构和功能,然后设计流程图。按照要求,程序需要完成的功能如下所示:1. 程序需要通过定时器原理完成播放乐曲的功能,这是最基本的功能。2. 在程序中添加一个键盘发声功能,即通过按键盘上不同的按键来发出不同频率的音符。3. 程序应该有判断用户输入是否符合规定,如果输入不正确,应该有所提示。4. 在用户输入较多的情况下,选择界面会显得较为凌乱,所以添加一个清屏功能显得很有必要。5. 在主界面选择不同的选项时,应该跳转到不同的子界面,结束之后再返回主选择界面。2.2 流程图开始显示提示信息接收键盘输入是“Q”?是“A”?是“C”?是“B”?退出程序将音乐节拍频率地址导入ADDRESS调用MUSIC,播放音乐显示错误提示调用清屏程序是是是是否否否否 说明:在进入主界面的时候有6个选项,分别是 1: MUSIC1 - MERRY CHRISTMAS 2: MUSIC2 TAIHU 3: MUSIC3 - LITTLE BEE4: PLAY BY KEYBOARD5: PRESS 5 TO QUIT6: CLEAR THE SCREEN 通过选择不同的选项进入其子界面来实现不同的功能。2.3 关键代码设计实现及分析2.3.1 程序段说明1) DATAS为数据段,其中存放在程序中所要显示的提示选择信息,还有乐曲的频率表和节拍表,和键盘控制发声对应的音符表。2) CODES为代码段,由于在整个程序中各个子程序都定义为NEAR,所以只需要有一个代码段,各个子程序的定义及实现都放在其中。2.3.2 PLAY_MUSIC 乐曲演奏程序的实现及分析 “PLAY_MUSIC”为播放音乐的子程序,完成的功能是通过SI(频率表的偏移地址) BP(节拍表的偏移地址)(通过主程序传递过来的参数)找到对应的频率(DI)、节拍(BX),再以DI、BX为参数调用SOUNDF子程序来发出声音。关键代码:FREQ: MOV DI, SI CMP DI, 0 JE END_MUSIC MOV BX, DS:BP CALL SOUNDF ; 以DI(频率) BX(节拍)为参数,调用SOUNDF ADD SI, 2 ADD BP, 2JMP FREQ SI, BP是频率表和节拍表的偏移地址,通过寄存器间接寻址方式找到数据段中定义数据,传递给BX和DI,然后调用SOUNDF发出一个频率为DI,节拍数为BX的声音注意: 在频率表中应该设置一个结束标志,“CMP DI, 0”,在这里以0作为结束标志。 2.3.3 SOUNDF通用发声程序的实现及分析 SOUNDF”为以传递过来的频率和节拍数,发出一个音符的频率的子程序。关键代码分析: MOV AL, 0B6H OUT 43H, AL 置43H端口为0B6H,选择计数器2,读/写LSB, MSB , 模式3,计数值为二进制数。 MOV DX, 12H MOV AX, 348CHDIV DI 按照公式,计数值=12348CH÷ f ,商存放在AX中。 OUT 42H, AL MOV AL, AH OUT 42H, AL825354的数据总线为8位,而计数值为16位,所以应该分两次传递计数值。 IN AL, 61H MOV AH, AL OR AL, 3 OUT 61H, AL将61H的后两位置1,打开扬声器,使其发声。WAIT1: CALL WAITF DEC BX JNZ WAIT1 用WAITF产生一个10ms的延时,BX是节拍(10ms的倍数)。 MOV AL, AH OUT 61H, AL 恢复寄存器状态2.3.4 WAITF延迟程序的实现及分析 “WAITF”为通过监控端口61H的PB4固定不变的触发时间来产生延迟时间的子程序。关键代码分析: MOV CX, 663WAITF1: IN AL, 61H AND AL, 10H ; 查看61H寄存器的第四位(PB4) CMP AL, AH JE WAITF ; PB4每15.08秒触发一次 MOV AH, AL ; LOOP WAITF1 10ms / 15.08us = 663,所以先置CX为663,每次通过调用WAITF都会产生一个10ms的延迟。2.3.5 KEYBOARD键盘发声程序的实现及分析“KEYBOARD”子程序,通过按不同的按键(1 8)来产生不同频率的音符。关键代码分析:PLAY_BY_KB: MOV AH, 7 INT 21H CMP AL, 0DHJE QT MOV BX, OFFSET TABLE CMP AL, '1' JB PLAY_BY_KB CMP AL, '8'JA PLAY_BY_KB 输入按键,回车退出,如果不是1 8的话跳转到开始重新输入。 AND AX, 0FH ; 清空AH SHL AX, 1 SUB AX, 2找到索引地址,是DW型的,所以需要乘2,而且是从0开始,应该减去2 MOV SI, AX MOV DI, BXSI MOV BX, 10CALL SOUNDF 通过索引从符号表里面找到对应的频率,调用SOUNDF发出声音。3.1主要的宏和过程的实现3.1.1DISPLAY显示宏为将事先定义的数据段字符串显示在屏幕上,定一个参数为b的宏。将b的地址传到DX。随后调用DOS09号功能调用。将字符串显示到屏幕。调用DISPLAY的实例为: DISPLAY INFO1 DISPLAY INFO2 DISPLAY INFO3 DISPLAY MUSLIST在此段代码中,程序显示提示作用的字符串和歌曲列表。DISPLAY宏具体实现如下:DISPLAY MACRO b LEA DX,b MOV AH,9 INT 21H ENDM3.1.2ADDRESS音乐地址宏歌曲包含节拍和频率。此处定义的音乐地址宏包含两个参数,将歌曲频率地址导入SI将歌曲节拍导入BP。当选择不同的歌曲时,主程序调用该宏,将用户要求的歌曲的频率和节拍导入,以便在MUSIC中实现发声。音乐地址宏实现如下:ADDRESS MACRO A,B LEA SI,A LEA BP,DS:B ENDM3.1.3MUSIC宏在ADDRESS中,程序已经将歌曲的首个频率地址和首个节拍地址分别导入SI、BP。为了检测歌曲是否结束,在MUSIC中,首先将SI传递到DI,DI与-1相减,如等于0,则得出该频率定义为-1 。在歌曲频率表定义中将-1定为该歌曲结束标志,此时MUSIC跳出结束。若该频率不为-1。调用通用发生程序GENSOUND,将该音符按照频率和节拍表发声。发声后SI、BP分别加2,跳转到下一个音符的频率和节拍,继续检测歌曲是否结束。如频率不为0,继续将该音符发声,并循环此过程。具体实现方法如下:MUSIC PROC NEAR PUSH DS SUB AX,AX PUSH AX FREG: MOV DI,SI CMP DI,-1 JE END_MUS MOV BX,DS:BP CALL GENSOUND ADD SI,2 ADD BP,2 JMP FREG END_MUS: RET MUSIC ENDP3.1.4通用发生程序GENSOUND该发生程序是在修改BEEP发声程序的基础上,以实现为8088/86编写一个任意频率和任意持续时间的通用发声程序。该程序包括以下三个步骤:(1)在8253/54 中的43端口送一个控制字0B6H(B),该控制字对定时器2进行初始化,使得定时器2准备接受计数初值。(2)在8253/54中的42H端口装入一个16位计数值,已建立将要产生的声音频率。(3)把输出端口61H的0、1两位置1,发出声音。具体实现如下:GENSOUND PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AL,0B6H OUT 43H,AL MOV DX,12H 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该GENSOUND程序能产生1965535Hz的声音,这个频率的下限是使除法不产生溢出的最小值。其上限65535是多余的,因为人能听到的声音最高频率为20000Hz。此外一般情况下,GENSOUND程序产生的声音不单单和频率有关,还和CPU有关。CPU工作频率越高,时延越短,产生的声音越急促。为了使程序产生一个与CPU工作频率无关的合适时延,在MUSCI中调用了一个时间延时程序WAITF。3.1.5WAITF延时程序80x86的各种处理器采取了666MHz的工作频率,loop指令的执行时间在这些处理器上也不相同。为了建立一个与处理器无关的延时,IBM采用了一种利用硬件产生时间延时的方法,即通过监控端口61H和PB4,使PB4每15.08微秒触发一次,一产生一个固定不变的时间基准。在IBM PC AT BIOS 的WAITF子程序,就是一个产生Nx15.08微秒时间演示的程序。调用WAITF子程序时,CX寄存器必须装入15.08微秒的倍数N。利用WAITF子程序能获得任意的时间延时,而不必在考虑CPU的型号和工作频率。具体实现如下: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 endp3.1.6CLEAR清屏程序当程序初始化或用户输入错误时,程序调用CLEAR清屏程序。清屏程序将AX、BX、CX、DX先入栈,以保存现场,保证清屏后重新执行不会出现错误。随后启用BIOS功能调用,将屏幕初始化或上卷。其中AL=0表示初始化窗口,AL=上卷行数, BH=卷入行属性,CH/CL=左上角行/列号,DH/DL=右上角行/列号。该程序段表示从左起0行0列到右起24行79列全部清屏。将屏幕清空后重新将AX、BX、CX、DX出栈。clear proc near push ax push bx push cx push dx mov ah,6 mov al,0 mov ch,0 mov cl,0 mov dh,24 mov dl,79 mov bh,7 int 10h pop dx pop cx pop bx pop ax ret clear endp3.1.7RETU退出当程序要求退出时,主程序会调用RETU进行退出。RETU程序内容实际为一个BIOS功能调用。RETU: MOV AH,4CH INT 21H 4、调试过程及实验结果分析4.1调试过程 1: 在刚开始显示字符串的时候,应该加上0DH,0AH换行,而且在字符串的最后应该以"$"来结尾,然后调用DOS调用 INT 21H,来显示字符串。调试中发现,如果一个字符串末尾不加"$"的话,DOS调用会直接把之后定义的字符串也同时显示出来,直到遇到"$"为止。这是由内存的分配模式所决定的,同时定义的变量在内存中会处于相邻位置。2: 在调试子程序KEYBOARD的时候,发现管输入0程序不会返回,是因为在程序中直接 CMP AL, 0。而从键盘输入的是ASC码,0对应的ASC码为30H,所以修改语句如下: CMP AL, '0'。3: 在调试KEYBOARD的时候,发现输入1 8 只有7会发出声音,检查后发现由于在TABLE表中定义的是DW字,而在程序中直接将输入符号作为索引值,应该将输入数字减一乘二才能得到正确的索引值。4: 在调用CLEAR的时候,发现每次显示的列表都会向下移动。在清除前应该将光标位置移动到第0行,第0列。 5: 在输入字符较多的情况下,界面显得较为凌乱,所以在程序中添加了一个清屏子程序,每次在返回选择界面的情况下清屏,但是在调试过程中,每当调用CLEAR的时候就出现错误: “C:WINDDOWSsystem32cmd.exe NTVDM CPU 遇到无效的指令 CS:01e7 IP:018b OP:db fe 06 cd 02”,查阅资料,发现是软件兼容问题。最后查阅书本,发现如果要实现清屏功能的话应该先把光标的位置定位到界面的开始位置(行、列号都为0),然后参照书本P330的例9.11来实现清屏功能。6: 刚开始时候,直接把延迟时间(15.08us)通过CX寄存器传递给子程序WAITF,这样会导致每次传递的时候都应该计算。所以之后在WAITF中直接将CX初始化为663(10ms/15.08us = 663),每次调用WAITF就能产生10ms的延迟,但要特别注意的是,如果WAITF中用到CX,首先应该将CX压栈(PUSH CX),返回之前出栈(POP CX)。7: 结果显示界面显得比较单调,为了增加程序美观性,定义了一个利用BIOS功能调用来设置显示方式和背景色。但要特别注意的是调用的时机,应该在每次刷新并且显示选择列表之前调用。 4、设计心得与改进方案4.1 心得体会1. 在程序中,各个变量及标号应该有统一且明确的命名规范,例如频率表的命名规则为:“歌曲名_F“,节拍表的命名规则为:“歌曲名_T“ 这样能使代码的可读性大大增强,且在编程中也能使逻辑更加清晰,增加编程效率。2. 不能一开始就开始编写程序,而是应该首先分析问题,设计出程序的框架流程图,明确各个程序段的功能,这样能使效率提高并且能增强持续的逻辑性和可读性。3. 在设计中应该考虑全面,并且兼顾到各方面的问题。不能仅仅完成布置的任务,应该努力使程序更健壮,能够处理错误的输入并且给出提示,而且应该有更强的交互能力。4. 在做课程设计的过程中难免会出现这样那样的问题,因此要保持良好的心态,在遇到问题时应该仔细想问题的起因及解决方法,不能想都不想就直接放弃或者问人,这样就失去了做报告的意义,因为在解决问题的过程中可以发现很多以前忽视的问题。发现问题,解决问题是我们的主要目的。5. 这次的课程设计让我们有机会通过实践来加强、巩固学习过的知识,极大的增强了自己编程能力。 4.2 注意事项1. 刚开始设计流程图的时候,直接将内置的2首音乐分别定义一个子程序来演奏,在之后的编程过程中,发现这样的设计不合理且会使代码变的更长且冗余,然后改进设计,以一个SOUNDF子程序来演奏音乐,调用SOUNDF的时候直接将需要演奏的频率表和节拍表作为参数传递给SOUNDF程序,这样能使代码更简洁,可读性大大增强。 2. 如果需要播放其他音乐时,只要在数据段增加此音乐的频率表和节拍表,然后在选择项中添加一个选项即可。3. 在调用子程序的过程中,应该注意保存寄存器中的内容,避免在子程序中破坏其中的数据。 4.3 改进方案 1: 在播放一首乐曲中,可以增加一个按ESC按键中断当前播放并返回到主选择界面的功能,而且在播放歌曲的时候能同步显示歌词。 2: 在主界面中,可以增加一个选择界面背景色的功能。 3: 可以通过自己设计的利用系统定时器的中断程序来实现控制发声时间长短的功能,使程序的发声时间有一个具体的时间基准。在系统定时器的中断处理程序中,有一条中断指令INT 1CH,时钟中断每发生一次(约每秒中断18.2次)都要嵌套调用一次中断类型1CH的处理程序。而ICH得处理程序没有做任何工作,因而可以自己设计处理程序来代替原有的中断程序。但在编写新的中断程序时,应该先保存之前的中断向量,结束时恢复。5、程序完整代码(程序代码来自网络)本程序的代码如下:DATA SEGMENT INFO1 DB 0DH,0AH,'welcome to this programe!$' INFO2 DB 0DH,0AH,'there are some music!$' INFO3 DB 0DH,0AH,'please select which one to play!$' INFO4 DB 0DH,0AH,'input error!$' INFO5 DB 0DH,0AH,'please input again!$' MUSLIST DB 0DH,0AH,'A MUSIC:Mary has a little ship' DB 0DH,0AH,'B MUSIC:the boat on Taihu lake' DB 0DH,0AH,'C MUSIC:two tiger' DB 0DH,0AH,'Q EXIT' db 0dh,0ah,'$' MUS_FREG1 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,-1MUS_TIME1 DW 6 DUP (25*8),50*8 DW 2 DUP (25*8,25*8,50*8) DW 12 DUP (25*8),100*8MUS_FREG2 DW 330,392,330,294,330,392,330,294,330 DW 330,392,330,294,262,294,330,392,294 DW 262,262,220,196,196,220,262,294,332,262,-1 MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100 DW 2 DUP(50,50,25,25),100 DW 3 DUP(50,25,25),100 MUS_FREG3 DW 262,294,330,262 DW 262,294,330,262 DW 330,349,392 DW 330,349,392 DW 392,440,392,349,330,262 DW 392,440,392,349,330,262 DW 294,196,262 DW 294,196,262,-1 MUS_TIME3 DW 50,50,100,100,100 DW 100,100,50,50,100,100 DW 100,100,100,50,50,100 DW 100,100,100,100,100,50 DW 50,100,100,100,100,100 DATA ENDS STACK SEGMENT DB 200 DUP ('STACK')STACK ENDSCODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA MOV DS,AX MOV aH, 0 MOV AL,00 INT 10H DISPLAY MACRO b LEA DX,b MOV AH,9 INT 21H ENDM ADDRESS MACRO A,B LEA SI,A LEA BP,DS:B ENDM DISPLAY INFO1 DISPLAY INFO2 DISPLAY INFO3 DISPLAY MUSLIST INPUT: MOV AH,01H INT 21H CMP AL,'Q' JZ retu CMP AL,'A' JNZ B0 ADDRESS MUS_FREG1,MUS_TIME1 CALL MUSIC JMP EXIT1 B0: CMP AL,'B' JNZ C0 ADDRESS MUS_FREG2,MUS_TIME2 CALL MUSIC JMP EXIT1 C0: CMP AL,'C' JNZ exit ADDRESS MUS_FREG3,MUS_TIME3 CALL MUSIC EXIT1: DISPLAY INFO5 JMP INPUT EXIT: call clear DISPLAY INFO4 DISPLAY INFO5 DISPLAY INFO1 DISPLAY INFO2 DISPLAY INFO3 DISPLAY MUSLIST jmp input RETU: MOV AH,4CH INT 21H GENSOUND PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX

    注意事项

    本文(汇编课程设计乐曲演奏程序武汉理工大学(共26页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开