您好,欢迎来到六九路网。
搜索
您的当前位置:首页汇编综合性实验报告

汇编综合性实验报告

来源:六九路网
实验报告

一、实验目的

《汇编语言程序设计》是计算机专业的重要的专业基础课,通过本综合性、设计性实验使学生进一步巩固课堂所学,全面熟悉、掌握8088宏汇编语言程序设计的基本方法和技巧,进一步提高编写程序、阅读分析程序及上机操作、调试程序的能力。 二、实验要求

用键盘选择计算机演奏乐曲,程序运行时首先在屏幕上显示出乐曲名单,当从键盘上输入乐曲的序号时,计算机则演奏所选择的乐曲,当键盘上按下Q键时,演奏结束。 三、实验原理分析

(一)发音原理

计算机有两种产生声音的方法,一种方法是通过I/O指令向设备寄存器(端口地址为61H)的第1位交替送1和0,使与第1位相连的扬声器脉冲门产生连续的脉冲电流,驱动扬声器发出声音。另一种方法是利用82(系统定时器)中的2号定时器向扬声器发送不同频率的脉冲,使之产生音调高低不同的声音,这种产生声音的方法可使计算机演奏出各种乐曲。本程序选用定时器产生声音。

ROM BIOS中的BEEP子程序能根据BL中给出的时间计数值控制82定时器,产生持续时间为1个或几个0.5秒、频率为6HZ的声音。通过对BEEP的修改,可以使其产生任一频率的声音。用汇编语言编写的程序GENSOUND,能使PC机发出指定频率和指定延迟时间的声音,它是一个很好的通用发声程序。组成乐曲的每个音符的频率值和持续时间是乐曲发声程序所必须的两组数据,知道了音调及频率的关系后,就可以按照乐曲的乐谱将每个音符的频率和持续时间定义成两个数据表,然后编程依次取出表中的频率值和时间值,调用GENSOUND程序发出各种声音。

但GENSOUND程序产生的声音不仅与输入频率有关,而且与CPU有关。如果80X86的工作频率为8MHZ(如IBM PS/ 2-25型),则T=125ns(1 /8MHz=125ns),那么上面程序产生的时间延迟就要短的多。在80286中,LOOP指令只需8个执行周期,而不是17个执行周期,这也会使延迟时间缩短很多。因此,从PC/ AT开始,对所有的80286,80386,80486和Intel Pentium计算机,IBM都提供一种利用硬件产生时间延迟的方法,这种方法不仅与频率无关,也与CPU无关。方法是通过监控端口61H的PB4,使PB4每15.08us触发一次,以产生一个固定不变的时间基准。在IBM PC AT BIOS中的WAITF子程序,就是一个产生N×15.08us

1

时间延迟的程序。调用WAITF子程序时,CX寄存器必须装入15.08us的倍数N。

利用WAITF子程序能获得任意的延迟时间,而再不必考虑CPU的型号和工作频率。依此原理可以进一步修改通用发声程序GENSOUND,使其不再依赖CPU的工作频率。GENSOUND程序中的10ms延迟时间是通过执行循环指令来获得的,现在可以用WAITF子程序来取代它,计数值设置为663(10ms/ 15.08us=663)。本系统将修改后的通用子程序改名为SOUNDF,延迟时间表仍为10ms。

(二)编曲原理

利用计算机控制发声的原理,可以编写演奏乐曲的程序。乐曲是按照一定的高低、长短和强弱关系组成的音调。在一首乐曲中,每个音符的音高和音长与频率和节拍有关。组成乐曲的每个音符的频率值和持续时间是乐曲程序发声所需要的两个数据。对于频率值,用WaveCN中的信号发生器输出262HZ、294HZ、 330HZ、 349HZ、392HZ、440HZ、494HZ、523HZ的信号相当于C调的dou,ruai,mi,fa,sou,la,si,dou。而音符的持续时间是根据乐曲的速度及每个音符的节拍数来确定的。在4/4(四四拍)中,四分音符为1拍,每小节4拍,全音符持续4拍,二分音符持续2拍,四分音符持续1拍。八分音符持续半拍等。如果给全音符分配1s(100×10ms)的时间,则二分音符的持续时间为0.5s(50×10ms),四分音符的持续时间为0.25s(25×10ms),八分音符的持续时间为0.125(12.5×10ms)。知道音调与频率和时间的关系,就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两个数据表,然后编写程序依次取出表中的频率值和时间值,调用SOUNDF程序发出各种声音。 四、流程图

2

开始 显示提示信息 接收键盘输入 是“A”? Y CALL MUSIC1 是“B”? Y CALL MUSIC2 是“C”? Y CALL MUSIC3 是“Q”? 退出 显示出错信息

五、源程序

;这是一个点歌系统程序 ;按大写字母“A”,播放乐曲“找朋友” ;按大写字母“B”,播放乐曲“月儿弯弯” ;按大写字母“C”,播放乐曲“小蜜蜂” ;按\"Q\"鍵,退出

DATA SEGMENT PARA 'DATA' INFO1 DB 0DH,0AH,'Welcome!$'

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-find friends' DB 0DH,0AH,'B MUSIC2-moon'

DB 0DH,0AH,'C MUSIC3-honey bee' DB 0DH,0AH,'Q EXIT' db 0dh,0ah,'$'

3

;用WaveCN中的信号发生器输出262HZ、294HZ、 330HZ、 349HZ、392HZ、440HZ、494HZ、523HZ的信号相当于C调的dou,ruai,mi,fa,sou,la,si,dou

;====================《找朋友》的频率表和时间节拍表======================= MUS_FREG1 DW 3 dup (392,440),392 ;为演奏的乐曲定义一个频率表 DW 392,523,494,440,392,330

DW 2 dup (392),330,349,2 dup (392),330

DW 262,349,330,294,262,294,262,-1 ;-1作为乐曲的结束符

MUS_TIME1 DW 6 DUP(50),100,4 DUP (50),100,100 ;为演奏乐曲定义一个节拍时间表 DW 2 DUP(6 DUP(50),100)

;========================================================================= ;====================《月儿弯弯》的频率表和时间节拍表===================== MUS_FREG2 DW 392,3 dup (262),330,2 dup (262) DW 2 dup (392,330),392

DW 392,3 dup (262),330,2 dup (262) DW 2 dup (392,330),294 dw 392,392,440,440 dw 392,330,294,330,440

dw 392,392,3 dup (262),294,330,440 DW 392,33,294,262,-1

MUS_TIME2 DW 2 DUP(6 dup(50),100,75,25,50,50,200) DW 75,25,100,200 DW 4 dup(50),200 dw 75,25,6 dup(50) dw 75,25,100,200

;===================《小蜜蜂》的频率表和时间节拍表======================== MUS_FREG3 DW 392,330,330,349,294,294 DW 262,294,330,349,3 dup(392) DW 392,330,330,349,294,294 DW 262,330,392,392,330 DW 5 dup(294),330,349 dw 5 dup(330),349,392

dw 392,330,330,349,294,294 dw 262,330,392,392,262,-1 MUS_TIME3 DW 2 dup(50,50,100) DW 6 dup(50),100 DW 2 dup(50,50,100) DW 4 dup(50),200

DW 2 dup(6 dup(50),100) dw 2 dup(50,50,100) DW 4 DUP(50),200

;========================================================================= DATA ENDS

4

STACK SEGMENT PARA STACK 'STACK' DB 200 DUP ('STACK') STACK ENDS

CODE SEGMENT

ASSUME DS:DATA,SS:STACK,CS:CODE MAIN PROC FAR MOV AX,DATA MOV DS,AX

MOV aH,0 ;0号功能,终止进程

MOV AL,4 ;显示方式号4放在AL中,320*200 INT 10H ;显示器输出控制中断调用 MOV AH,0BH ;置彩色调色板 MOV BH,0

MOV BL,1 ;BH=0,BL=1,背景色为蓝色 INT 10H ;显示器输出控制中断调用 MOV AH,0BH MOV BH,01H MOV BL,00

INT 10H ;显示器输出控制中断调用

;=========定义一个宏SHOW,用于显示字符串========== SHOW MACRO b LEA DX,b MOV AH,9 INT 21H ENDM

;================================================== show INFO1 ;Welcome!

show INFO2 ;This is a music program! show INFO3 ;Please select! show MUSLIST ;显示各歌曲名

;==========从键盘输入序号并跳到相应的分支========== INPUT: MOV AH,01H INT 21H CMP AL,'Q' JZ retu CMP AL,'A' JNZ B0

CALL MUSIC1 JMP EXIT1 B0: CMP AL,'B'

5

四色图形 JNZ C0

CALL MUSIC2 JMP EXIT1 C0: CMP AL,'C' JNZ exit CALL MUSIC3 EXIT1:

show INFO5 ;Please input again! JMP INPUT

;=================EXIT的作用:若输入的不是A,B,C,Q中任一个=============== ;=====================则清屏、输出错误信息并要求重新输入===================== EXIT:

call clear show INFO4 show INFO5 show INFO1 show INFO2 show INFO3 show MUSLIST jmp input

;============================================================================== RETU: MOV AH,4CH INT 21H MAIN ENDP

;=====================播放音乐1——《找朋友》的子程序========================= MUSIC1 PROC NEAR PUSH DS SUB AX,AX PUSH AX

LEA SI,MUS_FREG1 ;分别将频率表和节拍时间表的偏移地址放入SI和BP LEA BP,DS:MUS_TIME1 FREG1:

MOV DI,[SI] ;取音符频率 CMP DI,-1 ;结束? JE END_MUS1 ;是,退出 MOV DX,DS:[BP]

MOV BX,300 ;取音符持续时间

CALL SOUNDF ;调用SOUNDF发音子程序 ADD SI,2 ADD BP,2 JMP FREG1

6

END_MUS1: RET

MUSIC1 ENDP

;====================播放音乐2——《月儿弯弯》的子程序========================== MUSIC2 PROC NEAR PUSH DS SUB AX,AX PUSH AX

LEA SI,MUS_FREG2 LEA BP,DS:MUS_TIME2 FREG2: MOV DI,[SI] CMP DI,-1 JE END_MUS2 MOV DX,DS:[BP] MOV BX,300 CALL SOUNDF ADD SI,2 ADD BP,2 JMP FREG1 END_MUS2: RET

MUSIC2 ENDP

;===================播放音乐3——《小蜜蜂》的子程序============================ MUSIC3 PROC NEAR PUSH DS SUB AX,AX PUSH AX

LEA SI,MUS_FREG3 LEA BP,DS:MUS_TIME3 FREG3: MOV DI,[SI] CMP DI,-1 JE END_MUS3 MOV DX,DS:[BP] MOV BX,300 CALL SOUNDF ADD SI,2 ADD BP,2 JMP FREG1 END_MUS3: RET

MUSIC3 ENDP

7

;=============================通用发声程序SOUNDF============================== SOUNDF PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI

;=========以下代码目的:输入频率1.1931MHZ与音符频率相除的值送入计数器2========= MOV AL,0B6H ;write timer mode reg OUT 43H,AL

MOV DX,12H ;timer divisor MOV AX,348CH

DIV DI ;value of freg

OUT 42H,AL ;write timer2 count low byte MOV AL,AH

OUT 42H,AL ;write timer2 count high byte

;============================================================================= IN AL,61H ;get current port setting MOV AH,AL ;and save it in ah OR AL,3 ;turn speaker on OUT 61H,AL WAIT1: MOV CX,663

CALL WAITF ;wait for specified interval DELAY1: LOOP DELAY1 DEC BX JNZ WAIT1

MOV AL,AH ;recover value of port OUT 61H,AL

POP DI ;recover the rigister POP DX POP CX POP BX POP AX RET

SOUNDF ENDP

WAITF PROC NEAR PUSH AX WAITF1: IN AL,61H

AND AL,10H ;check PB4

CMP AL,AH ;did it just change

8

JE WAITF1 ;wait for change

MOV AH,AL ;save the new PB4 status LOOP WAITF1 ;continue until CX becomes 0 POP AX RET

WAITF ENDP

;===========清屏子程序=========== 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 endp CODE ENDS END MAIN 六、体会

一开始接到题目时,感觉每道题都很难,真不知从何下手。但我很早之前就对“音乐程序”产生了兴趣,所以这次我选择了“点歌系统”。乍看这四个字,我想到的是KTV那种点歌系统,即可以根据歌手搜索歌曲,又可根据歌名拼音来搜索,还有插入与删除操作等。心想挑战性未免太高了吧?但看了课本第十章第五节的乐曲程序后,我明确了实验要求,对点歌系统的原理与设计有了初步了解,于是也就有了完成这个程序的信心。

我用的编程软件是MASM for Windows集成实验环境,它支持Windows下32位汇编程序和DOS下16/32位汇编,还具有错误信息自动定位、关键字实时帮助、动画教程演示汇编指令的执行过程、语法着色、WORD式的查找、替换、定位等功能,用起来非常便捷。其颇具特色的关键字实时帮助及动画教程演示尤为实用,在我编程的过程中我可以方便地看到汇编语言中各指令的用法、DOS及BIOS功能调用表、ASCII码表、汇编语言错误信息表

9

等有常用信息。而动画教程演示,使各寻址方式的数据在寄存器中的运转过程更加明了清晰。这软件似乎浓缩了课本上的所有知识,因此在使用的过程中加强了我对汇编语言程序设计的认知。

而通过对歌曲频率表和时间节拍表的编写,我不仅了解到音调与频率和时间的关系,还对音乐上的知识有了更多的认识。虽然我对音乐有兴趣,但我几乎是不懂音乐。当我在课本上看到“四四拍”“四分音符”“全音符”“二分音符”等词语以及那些乐谱时,我真是傻眼了!看着那段话与那些图片,很久也不明白它的意思。但后来通过网上的资料和对程序的解读分析,我明白了究竟要如何编写乐曲的频率表和时间节拍表。这也让我明白了:所有知识都是从不懂到懂的,只要自己肯下功夫,就能学到更多。

我认为本系统较难把握的是时间间隔。初次运行时,一首歌曲几秒钟就播完了,似乎完全没有节拍而言。后来修改时间节拍值的,但效果也不明显。后来再看书,知道GENSOUND受硬件设备的影响较大,于是按书上的提示,用WAITF对GENSOUND进行改进。改进后,乐曲播放的速度竟极其的慢,一首歌曲拉了几分钟才完。于是我把节拍值改为原样,再对送入寄存器的值进行多次修改,最终才得以让一首歌曲以较正常地节拍播放。

总的来说,本次实验让我对计算机控制发声的原理、音调与频率和时间的关系、汇编语言的各指令、子程序的调用以及宏汇编等有了一定的认知,程序的成功运行让我对汇编充满了信心,并产生了浓厚的兴趣。我渴望在下一次课程设计中,对汇编语言程序设计有更多的了解和更深刻的体会。

10

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 69lv.com 版权所有 湘ICP备2023021910号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务