文档介绍:实验报告一、 实验目的《汇编语言程序设计》是计算机专业的重要的专业基础课,通过本综合性、设计性实验使学生进一步巩固课堂所学,全面熟悉、掌握8088宏汇编语言程序设计的基本方法和技巧,进一步捉高编写程序、阅读分析程序及上机操作、调试程序的能力。二、 实验耍求用键盘选择计算机演奏乐曲,程序运行时首先在屏幕上显示出乐曲名小,当从键盘上输入乐曲的序号时,计算机则演奏所选择的乐曲,当键盘上按下Q键吋,演奏结束。三、 实验原理分析(一)发音原理计算机有两种产生声音的方法,一•种方法是通过I/O指令向设备寄存器(端口地址为61H)的第1位交替送1和0,使与第1位相连的扬声器脉冲门产生连续的脉冲电流,驱动扬声器发出芦音。另一种方法是利用8254(系统定吋器)中的2号定时器向扬声器发送不同频率的脉冲,使之产生音调高低不同的声音,这种产生声音的方法可使计算机演奏出各种乐曲。本程序选用定时器产生声音。ROMBTOS中的BEEP子程序能根据BL中给出的时间计数值控制8254定时器,、频率为896HZ的声音。通过对BEEP的修改,可以使其产生任一频率的声音。用汇编语言编写的程序GENSOUND,能使PC机发出指速频率和指泄延迟吋间的声音,它是一个很好的通用发声程序。纽成乐曲的每个音符的频率值和持续时间是乐曲发声程序所必须的两组数据,知道了音调及频率的关系后,就可以按照乐曲的乐谱将每个音符的频率和持续时间定义成两个数据农,然后编程依次取出表中的频率值和时间值,调用GENSOUND程序发出各种声音。但GENSOUND程序产生的声音不仅与输入频率有关,而且与CPU有关。如果80X86的工作频率为8MHZ(如IBMPS/2-25型),则T=125ns(1/8MHz=125ns),那么上面程序产生的时间延迟就耍短的多。在80286中,LOOP指令只需8个执行周期,而不是17个执行周期,这也会使延迟时间缩短很多。因此,从PC/AT开始,对所有的80286,80386,80486和IntelPentium计算机,IBM都提供一种利用硬件产生时间延迟的方法,这种方法不仅与频率无关,也与CPU无关。方法是通过监控端口61H的PB4,•次,以产生一个固定不变的时间基准。在IBMPCATBIOS中的WAITF子程序,。调用WAITF子程序时,。利用WAITF子程序能获得任意的延迟时间,血再不必考虑CPU的型号和工作频率。依此原理町以进一步修改通用发声程序GENS01JND,使英不再依赖CPU的工作频率。GENS01JND程序屮的10ms延迟时间是通过执行循环指令來获得的,现在可以用WAITF子程序来取代它,计数值设置为663(10ms/=663)o本系统将修改后的通用子程序改名为S0UNDF,延迟时间表仍为lOmso(二)编曲原理利用计算机控制发声的原理,可以编写演奏乐曲的程序。乐曲是按照一定的高低、长短和强弱关系组成的音调。在一首乐曲屮,每个音符的音高和音长与频率和节拍有关。组成乐曲的每个音符的频率值和持续吋间是乐曲程序发声所需要的两个数据。对于频率值,中的信号发生器输出262HZ、294HZ、330HZ、349HZ、392HZ、440HZ、494HZ、523HZ的信号相当于C调的dou,ruai,mi,fa,sou,la,si,dou0而音符的持续时间是根据乐曲的速度及每个音符的节扌“数來确定的。在4/4(四四拍)中,四分音符为1拍,每小节4拍,全音符持续4拍,二分音符持续2拍,四分音符持续1拍。八分音符持续半拍等。如果给全音符分配ls(lOOXlOms)的时间,(50X10nis),(25X10ms),()0知道音调与频率和时间的关系,就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两个数据表,然后编写程序依次取出衣中的频率值和时间值,调用SOUNDF程序发出各种声音。四、流程图五、源程序;这是i个点歌系统程序;按大写字母“A”,播放乐曲“找朋友”;按大写字母“B”,播放乐曲“月儿弯弯”;按大写字母“C”,播放乐曲“小蜜蜂”;按〃Q〃鍵,退岀DATATNF01TNF02TNF03INF041NF05MUSL1STSEGMENTPARA'DATA,DBODH,OAH/e!$*DBODH,OAH,*Thisisamusicprogram!DBODH,0AH,'Pleaseselect!DBODH,OAH,'INPUTERROR!$'DBODH,OAH,*Pleaseinputagain!$JDBODH,O