汇编语言程序设计实例_第1页
汇编语言程序设计实例_第2页
汇编语言程序设计实例_第3页
汇编语言程序设计实例_第4页
汇编语言程序设计实例_第5页
已阅读5页,还剩113页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 第第10章章 汇编语言程序设计实例汇编语言程序设计实例 10.1 视频显示系统程序设计视频显示系统程序设计 10.2 音频发声系统程序设计音频发声系统程序设计10.3 数据通信系统程序设计数据通信系统程序设计 习题习题10 第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 10.1 视频显示系统程序设计视频显示系统程序设计 在微型计算机的图形显示方面,汇编语言具有极大的优势,这是因为显示在屏幕上的图形是由成千上万个像素组成的,对图形处理也需要复杂的算法和大量的指令。与高级语言相比,虽然表面上汇编语言显得复杂、凌乱和可读性差,

2、但就速度而言,汇编语言最快。 第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 用汇编语言设计出来的图形显示有着直观、醒目和反应快速的优点,并且一旦掌握汇编语言显示技术的思路和基本显示模块,编程的工作仅是模块的运用和参数的修正。因此,汇编程序编制图形程序是程序设计中非常有意义和价值的工作之一。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 10.1.1 显示方式 显示方式与显示适配器及显示器密切相关,因此,必须熟悉和掌握显示器和与显示适配器相关的性能与技术指标。 1. 显示适配器 IBMPC系列微机中,先后提供了多种显示适配器(显示卡),表10-1介绍了这些适配器的基本技

3、术指标。 显示适配器的功能基本是向下兼容,即新型显示卡功能包括前一档次显示卡的显示功能,而又有所增强。此外,实用中各厂家不同型号的产品性能不尽相同。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 表10-1 显示适配器的基本技术指标 类 型分辨率彩色度(灰度)字符图形单色字符显示适配器(MDA)9147203502彩色图形适配器(CGA)8832020064020016选4高分辨率单色适配器(HGC) 72020064035016选4第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 显示模式信号模式其他 7TTL 06TTL 7、FTTL 第第1010章章 汇编语言程序设

4、计实例汇编语言程序设计实例 增强型图形适配器(EGA)81464035064选16多色图形阵列(MCGA)814640400256视频图形阵列(VGA)916640480256高级视频图形阵列(TVGA) 80060064 K超级视频图形适配器(SVGA) 1024768128010241680128016 M局部高性能总线显示卡(PCI) 1024768128010241680128016 M图形加速阵列(AGP) 102476812801024168012804 G第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 06、DF、10TTL 06、DF、10模拟 06、DF、1113

5、模拟 06、DF、1113模拟 06、DF、1113模拟 标准、非标准模拟图形加速标准、非标准模拟图形加速第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 2. 显示器 目前,Intel公司80 x86/Pentium的微型机主要使用两种类型的显示器:数字(TTL)显示器和模拟显示器。 1) 数字(TTL)显示器 该类型显示器的彩色分辨是用“1”和“0”来决定的。若某彩色信号为“1”,则在屏幕上呈现出这一彩色,否则屏幕上不显示这一彩色。TTL显示器上能显示的彩色种类与彩色信号输入线的多少有关。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 如CGA与彩色有关的信号线有红(

6、R)、绿(G)、蓝(B)和亮度(I),这四种信号可组合成216种不同的颜色,字符的显示可从其中选择做前景或背景色。CGA和EGA适配器仅能支持TTL显示器。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 2) 模拟显示器 模拟显示器有3种彩色信号输入线(红、绿、蓝),加在每个输入线上的电平的高低级别决定了显示在屏幕上的那种彩色的数量。从理论上讲,它能显示的彩色数量是无限的,但实际应用中却是有限的,这主要取决于显示适配器的能力。 由于彩色数量的无限性,模拟显示器被认为是一种优秀的显示技术。VGA及以上显示方式必须配置模拟显示器。目前386及其以上的机型基本上选用VGA适配器和模拟显示

7、器。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 3) 显示器分辨率 分辨率是显示器的重要指标,它关系到显示器的性能和图像质量。图像质量由两个主要因素决定:其一是屏幕上扫描图像的速度;其二是屏幕上的像素数,像素数又称分辨率,以屏幕行像素数(x)列像素数(y)的形式表示。 例如,表10-1中VGA的分辨率是640480,就是说,这种方式下,每行可以分辨640个像素点,每列可以分辨480个像素点。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 显示器分辨率也有着向下兼容的问题,高分辨率显示器可以由低分辨率的适配器驱动。例如,SVGA显示器上显示VGA信号。而低分辨率显示器

8、则不可以由高分辨率的适配器驱动,如果这样做了,轻则显示器行不同步,看不见图像,重则将造成显示器烧毁。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 3. 显示方式 由于设置或改变PC机的显示方式对时间的要求不严格,而要编写设置或改变显示方式的程序很困难,因此一般由DOS或BIOS调用来完成。 BIOS显示例程提供了设置显示方式的功能,程序只要给出调用参数,使用BIOS的 INT 10H即可建立某种显示方式。表10-2列出了几种常用的显示方式。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 表10-2 INT 10H设置显示方式功能表(AH=00)调用参数(AL)显示方式

9、分辨率色度或灰度004025 文本16级灰度014025文本16色或8色028025 文本16级灰度038025文本16色或8色04320200图形4色05320200图形4色06640200图形黑白显示第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 078025文本黑白显示0D320200图形16色0E640200图形16色0F640350图形黑白显示10640350图形4色或16色11640480图形黑白显示12640480图形16色13320200图形256色第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 适用显示适配器CGAMCGAEGAVGACGAMCGAEG

10、AVGA CGAMCGAEGAVGACGAMCGAEGAVGACGAMCGAEGAVGACGAMCGAEGAVGACGAMCGAEGAVGAMDA EGAVGA第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 EGAVGA EGAVGA EGAVGA EGAVGA MCGA VGA VGA MCGA VGA第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 10.1.2 DOS功能调用显示技术 操作系统的核心是由许多关于I/O驱动、磁盘读写和文件管理等程序段构成的。这些程序段都编了号,可由汇编语言的源程序调用。在调用时,把程序段的号(或称系统功能调用号)送至AH,把程序段规定

11、的入口参数,送至指定的寄存器,然后由中断指令INT 21H来实现调用。在这里通过几个程序举例来介绍有关I/O的功能调用,便于读者在编程中应用。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 【例10-1】 在微型计算机系统上常常可以显示实时时钟,这就要求能输出数码0059。要输出多于一个字符时,要利用DOS功能调用9,它是向CRT输出字符串的子程序,要求在调用前使DX指向字符串的首地址,字符串必须以字符“”结束,则功能调用9能把字符“”之前的全部字符向CRT输出。系统调用形式如下:第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 MOV DX,OFFSET OUTSTRI

12、NG ;首地址装入DX寄存器 MOVAH,9 ;系统功能调用号送入AH INT21H ;启动DOS功能调用程序流程图如图10.1所示。程序的清单如下:TITLE 例10-1.ASM STACKSEGMENT PARASTACK STACK第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 DB100DUP(?) STACKENDS DATA SEGMENTBUFFERDB3DUP(?)DATA ENDSCODE SEGMENT ASSUME CS: CODE,DS: DATA,SS: STACKSTARTPROC FAR 第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 图1

13、0.1 例10-1流程图 (AL)清零开始初始化,基准值BX基准值AL(AL)1AL十进制调整等于60H?(AL)存基准值(AL)高四位装配成ASCII码(AL)BUFFERYNN(AL)低四位装配成ASCII码(AL)BUFFER1显示字符串延时(CX)1CX(CX)0?结束Y第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 BEGIN:PUSH DS MOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVCX,1000 MOVBL,0LEASI,BUFFER PUSHBX第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 GOON:MOV DL,0DHMOV

14、AH,2 INT21HMOVDL,0AHMOVAH,2 INT 21HPOPBX第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 MOVAL,BLINCALDAACMPAL,60H JCNEXT MOVAL,0 第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 NEXT:MOV BL,ALPUSH BXMOVDL,ALPUSH CXMOVCL,4SHRAL,CLORAL,30H MOVSI,AL第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 INCSIMOVAL,DLANDAL,0FHORAL,30HMOVSI,ALINCSIMOVAL,$MOVSI,ALMOV

15、DX,OFFSET BUFFERMOVAH,9第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 INT21H MOV CX,0FFFFHAGAIN:DEC CX JNEAGAIN POPCX DECCX JEDONE MOV SI,OFFSET BUFFER JMPGOON第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 DONE:RETSTARTENDPCODE ENDSENDBEGIN第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 10.1.3 BIOS功能调用显示技术 1. PC机彩色图形模式 PC机彩色图形适配器有两大类模式:一种是文本(字符)模式(AN

16、);另一种是图形模式(APA)。 而每种模式又可包括不同的显示方式,可以通过BIOS的INT 10H功能调用号0来设置或改变显示模式和显示方式。采用BIOS设置显示方式见8.4节。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 【例10-2】 选择显示方式。程序流程图如图10.2所示。程序的清单如下:TITLE例10-2.ASMSTACKSEGMENTSTACKSTACK DB100DUP(0)STACKENDSDATASEGMENT第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 ERROR DB INPUT ERROR! TRY AGAIN,0AH,0DH,$MSG0

17、DB * * * MENU * * * ,0AH,0DH,$MSG1DB1, 40*25 B&W TEXT,0AH,0DH,$MSG2DB2, 40*25 COLOR TEXT,0AH,0DH,$MSG3DB3, 80*25 B&W TEXT,0AH,0DH,$MSG4DB4, 80*25 CLOOR TEXT,0AH,0DH,$MSGSDB5, 320*200 COLORGRAPHICS,0AH,0DH,$MSG6DB6, 320*200 B&W GRAPHICS,0AH,0DH,$第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 COUNT EQU$-MS

18、G6MSG7 DBPLEASE CHOOSE:,$OK DB0AH,0DH,SET DISPLAY MODEL OK!,$DATAENDSCODE SEGMENT第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 图10.2 例10-2流程图 开始初始化显示主菜单接收键入值提示错误信息小于31H?大于36H?设置对应的显示方式显示所选显示方式结束YYNN第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 ASSUME CS:CODE,DS:DATA,SS:STACKSETMODEPROC FARPUSH DS MOV AX,0 PUSH AX MOVAX,DATAMOV DS,

19、AX第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 TRV:MOV DX,OFFSET MSG0 MOV DI,COUNT MOV CX,8DMENU:CALL DISPADDDX,DI LOOP DMENU MOV AH,1 INT21H CMPAL,31H JL ERR 第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 CMPAL,36H JGERR SUBAL,30H MOV AH,0 INT10H JMPSETOKERR:MOVDX,OFFSET ERRORCALL DISP第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 MOVAH,6MOVAL,0M

20、OVBH,7MOVCX,0MOVDX,184FHINT10HJMPTRVSETOK:MOV DX,OFFSET OK第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 CALLDISPRETSETMODEENDPDISPPROC NEARMOV AH,9INT 21HRETDISP ENDPCODE ENDSENDSETMODE第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 2. 在文本方式下显示字母、数字和一些字符图形 对屏幕上的每一个字符,首先应给出它的ASCII码值,同时还要给出一个8 bit(位)的属性字节。这个属性字节对单色和彩色显示均有效,在单色文本下,只提供闪

21、烁、反显和亮度方面的属性。 【例10-3】 在屏幕的第10行10列以绿底红字闪烁显示“HOW DO YOU DO.”,程序流程图如图10.3所示。程序的清单如下:第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 TITLE 例10-3.ASMSTACK SEGMENT STACK STACK DB 100DUP(0)STACKENDSDATA SEGMENTMSG DB HOW DO YOU DO.COUNT EQU $-MSGDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS: STACK第第1010章章 汇编语言程序设计实例汇编语言程序

22、设计实例 图10.3 例10-3流程图 开始初始化结束设置显示方式为8025彩色设置光标在10行10列在当前页显示字符大于36H?提示错误信息YN第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 DISPLAYPROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV AH,0 MOV AL,3 INT 10H MOV BH,0 MOV DH,0AH MOV DL,0AH第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 MOV AH,2 INT 10H MOV SI,OFFSET MSG MOV DI,COUNTD

23、ISP: MOV AL,SI MOV AH,9 MOV CX,1 MOV BH,0 MOV BL,0A4H INT 10H INC SI INC DL MOV BH,0第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 MOV DH,0AH MOV AH,2 INT 10H DEC DI JNZ DISP RETDISPLAY ENDPCODE ENDS END DISPLAY第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 10.1.4 彩色图形显示 彩色图形是在图形方式下,由一组像素点在屏幕上形成的。图形方式相对于文本方式所要处理的数据量大,而且不同的显示适配器所支持的分

24、辨率不同,因此同一彩色图形在不同分辨率的情况下,处理的数据量差别很大。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 1. 彩色绘图 在屏幕上绘制彩色图形,可用BIOS中INT 10H的0号、11号、12号和13号功能调用。利用INT 10H的这些功能调用,就可使屏幕上的绘图变得比较简单。通常情况下,有以下几步:第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 (1) 用INT 10H的0号功能将显示方式设置成 320200彩色图形方式。MOV AH,0;设置显示方式MOV AL,4 ;置CGA为320200彩色图形方式INT 10H;BIOS中断调用第第1010章章 汇

25、编语言程序设计实例汇编语言程序设计实例 (2) 用INT 10H的11号功能设置彩色图形方式下的调色板或背景颜色。MOV BH,0;设置背景色MOV BL,C;C=颜色值(016)MOVAH,11;功能号送入AHINT10H;BIOS中断调用MOV BH,1;设置调色板MOV BL,N;N=调色板号(0,1)MOVAH,11INT 10H第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 (3) 在上述工作的基础上,利用 INT 10H的12号功能调用或13号功能调用在屏幕上写彩色像素点或读彩色像素点。MOV AH,12 ;12号功能调用,写像素点MOV AL,C ;C=像素点颜色(0

26、3)MOV DX,ROW;ROW=行号(0199)MOV CX,COL;COL =列号(0319) 第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 INT 10H;BIOS中断调用MOV AH,13;13号功能调用,读像素点MOV DX,ROW;ROW=行号(0199)MOV CX,COL;COL =列号(0319)INT 10H;BIOS中断调用第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 2. 彩色绘图举例 【例10-4】 编写一个8086/8088汇编语言程序,使程序运行后屏幕显示器成为一台电子钟。首先屏幕上显示提示符,要求从键盘上输入当前时间,然后每隔一秒使显

27、示的秒值加1,达到60秒时使分值加1,秒值清零;达到60分时使小时值加1,分值清零;达到24小时则小时值清零。上述过程一直进行下去,当键入Ctrl+C时退出“电子钟”状态,返回DOS。 根据上述要求,可画出程序的流程图如图10.4所示。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 图10.4 例10-4流程图 开始显示提示符接收键入当前时间时、分、秒值转换及存储延时1秒DL加1,DAA调整(DL)60H?DL清零,DH加1,DAA调整(IH)60H?DH清零,CH加1,DAA调整(CH)24H?CH清零时分秒值BCDASCII显示YNYNNY第第1010章章 汇编语言程序设计实例

28、汇编语言程序设计实例 其中,显示一个字符串,以及从键盘上接收一个字符串可分别通过09号和0AH号DOS功能调用实现。延时1秒可以编写一个延时子程序。程序中对时、分和秒三个时间单位有许多类似的操作。例如,分别将它们由ASCII码转换为BCD码,或由BCD码转换为ASCII码,以及将时、分和秒值分别加1,并进行DAA调整后判断是否达到60H或24H等。对于这样的程序段,可以采用宏处理伪指令,以便缩短源程序的长度,使程序更加清晰,有利于结构的模块化。 此外,还可以利用BIOS调用设计窗口,选择适当的背景色和前景色等,使屏幕显示更加美观。程序清单如下:第第1010章章 汇编语言程序设计实例汇编语言程序

29、设计实例 TITLE例10-4.ASMDATA SEGMENTBUF1 DB Current time is: $BUF2DB 10 DB 10DUP(?)DATA ENDS STACK SEGMENT STACK DB 100DUP(?)STACKENDSCODE SEGMENT第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 ASSUME CS: CODE,DS:DATAASSUME SS: STACKCURSOR MACROROW,CLM MOV AH,2 MOV BH,0 MOV DH,ROW MOV DL,CLM INT 10H ENDM第第1010章章 汇编语言程序设计实

30、例汇编语言程序设计实例 WIN MACRO ROWL,CLML,ROWR,CLMR,COLOR MOV AH,6 MOV AL,0 MOV CH,ROWL MOV CL,CLML MOV DH,ROWR MOV DL,CLMR MOV BH,COLOR INT10H ENDM第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 ASCBCD MACROREG INC BX INC BX MOV REG,BX MOV CL,4 SHLREG,CL INCBX MOVAL,BX ANDAL,0FH ORREG,AL ENDM 第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 BCD

31、ASC MACROREG INC BX INC BX MOV AL,REG MOV CL,4 SHR AL,CL OR AL,30H MOV BX,AL INC BX MOV AL,REG AND AL,0FH OR AL,30H MOV BX,AL ENDM第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 INCBCD MACROREG,COUNT MOV AL,REG INC AL DAA MOV REG,AL CMP AL,COUNT JNZ DISPY MOV REG,0 ENDM第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 STRDSPYMACROADRS L

32、EA DX,ADRS MOV AH,9 INT 21H ENDMCLOCK PROC FARSTART:PUSH DS MOV AX,0PUSH AX MOVAX,DATA MOVDS,AX第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 WIN0,0,24,79,7,WIN9,28,15,52,01010111BCURSOR11,32STRDSPYBUF1CURSOR13,36LEADX,BUF2MOVAH,0AHINT21HLEABX,BUF2ASCBCDCHASCBCDDHASCBCDDL第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 TIMER: CALLDELY

33、INCBCD DL,60HINCBCDDH,60HINCBCDCH,24HDISPY: LEABX,BUF2 BCDASCCH BCDASCDH BCDASCDL INCBX MOVAL,$第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 MOVBX,ALPUSH DXCURSOR13,36STRDSPYBUF2POPDXJMPTIMERDELYPROCPUSHCXPUSHAXMOVAX,3FFFH第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 X1:MOV CX,0FFFFHX2:DECCXJNEX2DECAXJNEX1POPAXPOPCXRETDELY ENDPCLO

34、CKENDPCODE ENDS ENDSTART第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 用这个程序可在屏幕上画出一些复杂图形,如多边形、山水花鸟和汽车等,也可在该程序的基础上增加图形装入、存盘和打印功能,以提高程序的实用性。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 10.2 音频发声系统程序设计音频发声系统程序设计 10.2.1 PC机的发声原理 IBM-PC系列机的主机箱装有一个小扬声器,系统板上的定时器8253(或8254)利用工作方式3产生一定频率信号,通过可编程的并行外围接口芯片8255(或8255A)控制其发音。扬声器的控制驱动电路如图10.5所

35、示。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 图10.5 扬声器控制驱动电路 7 6 5 4 3 2 108254定时器与门驱动器接CPU扬声器B口8255 PPI(61H)1.19 MHz时钟第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 可编程的并行接口芯片8255有三个8位的并行端口:A口、B口和C口。在IBM系列微机中,BIOS在开机自检后已将8255初始化为A口和C口用于输入,B口用于输出。B口的I/O端口地址为61H。 由图10.5可见,8255B口的低两位用来控制扬声器驱动,当输出端口61H的D1位为“1”或为“0”时,将使控制驱动器的与门电路接通或

36、关闭,使8254所发出的音频信号能到达驱动器或被阻断。这样通过控制D1位的变化,可使扬声器接通和断开,控制扬声器是否能发出声音。此外,通过控制D1位的通断时间,就能发出不同的音长。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 61H端口的D0位为“1”时,控制8254定时器产生驱动扬声器发声的音频信号,该位为“0”则不发信号。8254有三个定时器,分为0号、1号和2号定时器,驱动扬声器的是2号定时器,该定时器工作在方式3,是一个频率发生器,它负责向扬声器发送指定频率的脉冲信号。 当8255输出端口61H的D1位为“1”时,在61H的D0位为“1”,8254发出指定频率的声音信号的

37、前提下,声音信号通过与门到达驱动器驱动扬声器发声。本节主要介绍利用8254产生声音和乐曲。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 10.2.2 发音程序 BIOS中有一个BEEP子程序,它可以产生896 Hz的声音,且声音持续时间只能是0.5 s的整数倍。BEEP子程序用于PC机加电自检发现硬件错误,或正常进入系统等过程后,向用户发出声音提示。可以利用这一子程序的思路,来编写通用的发音程序。 发音程序的编制需要进行以下四个方面工作。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 (1) 确定发声频率。BEEP子程序将计数值533H送8254的定时器2而产生896

38、 Hz的声音,那么要产生其他频率的声音,则必须将对应频率的计数值送8254的定时器2产生其他频率声音的计数值。该方法如下所示: 533H896给定频率=123 280给定频率 (也可用定时器的时钟1 192 576 Hz直接计算计数值:1 192 576给定频率。) 假设给定频率在DI中,可用下面的指令序列在AX中得到计数值。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 MOV DX,12H MOV AX,3280 DIV DI;计算某频率的计数值 为了不产生除法溢出,限制DI中的频率不低于19 Hz,一般情况下声音频率不会这样低。第第1010章章 汇编语言程序设计实例汇编语言程

39、序设计实例 (2) 确定音长。BEEP子程序只能产生持续时间(音长)为0.5 s的整数倍的音长,如果要求持续时间容易调整,利用软件延时程序可选择较短的持续时间作为基数,如10 ms(毫秒)。10 ms延时可由执行循环指令实现: MOV CX,2801 DELAY:LOOP DELAY 如果要产生与10 ms成倍数的延时,可将倍数送到BX寄存器中,由BX再控制10 ms延时指令的执行次数。如产生0.5 s持续时间,则将50送入BX中,指令序列如下:第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 MOV BX,50DELAY0:MOV CX,2801DELAY1: LOOP DELAY

40、1 DEC BX JNZ DELAY0第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 (3) 定时器调节。在对BEEP子程序作上述两方面修改的基础上就可以编写一个任一频率(由DI指定)和任一持续时间(由CX和BX指定)的通用发音程序。由于该发音程序使用8254定时器2产生声音的频率,因此需要对定时器2进行相应的设置。 对输入/输出端口43H(该端口分配给8254的工作方式寄存器)送一个特定的数0B6H,这个数用于对定时器2的工作方式进行初始化,使定时器2准备接收计数值。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 对输入/输出端口42H(该端口分配给定时器2)中送一个

41、16位的计数值(即123 280给定频率),用于设置将要产生的声音频率。 (4) 操作扬声器开关。由于扬声器驱动由8255的输出端口61H的低两位控制,故应把输出端口61H的D0和D1位置“1”,以便使扬声器发出声音。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 10.2.3 乐曲演奏程序 利用通用发音子程序CSOUND,可以编写演奏乐曲程序。在乐曲中,每个音符的音高和音长与频率节拍有关。下面给出音律表的一部分,见表10-3,该表对应3个音阶。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 表10-3 音阶频率对照表 音名C D E F G A BC D E F G

42、A B简谱1 2 3 4 5 6 71 2 3 4 5 6 7频率131 147 165 175 196 220 247262 294 330 349 392 440 494C D E F G A B1 2 3 4 5 6 7524 588 660 698 784 880 984第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 演奏乐曲的程序中需要有两组数据支持:一组是频率数据;一组是节拍时间数据。音符的频率可以从表10-3中查得。节拍时间就是音符的持续时间,取决于乐曲的速度和每个音符的节拍数据。如4/4(四四拍)中,每小节包括4拍,全音符持续4拍,二分音符持续2拍,四分音符持续一拍

43、,八分音符持续半拍等。 有了音调与频率和时间的关系后,就可以按照乐曲的曲谱将每个音符的频率和持续的时间定义成两组数据表,然后编程依次取出表中的频率值和时间值,调用CSOUND子程序就可发出各种声音。例10-5的程序中为全音符分配了1 s时间。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 【例10-5】 图10.6是“两只老虎”的简谱。根据乐谱在数据段中定义了频率数据表(Freq)和节拍时间数据表(Time),程序以?1作为频率数据表的结束标志。程序流程图如图10.7所示,演奏该乐曲程序如下: 1=C 4/4 第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 图10.6

44、“两只老虎”简谱 1=C 4/4 1 2 3 1 | 1 2 3 1 | 3 4 5 | 3 4 5 | 5 6 5 4 3 1 | 5 6 5 4 3 1 | 2 5 1 | 2 5 1 |第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 NAME 例10-5.ASMDATA SEGMENTFREQ W 262,294,330,262,262,294,330,262W330,349,392,330,349,392,392,440W392,349,330,262,392,440,392,349 DW 330,262,294,196,262,294,196,262,-1第第1010章章

45、 汇编语言程序设计实例汇编语言程序设计实例 TIMEDW 25,25,25,25,25,25,25,25,25,25DW 50,25,25,50,12,12,12,12,25,25DW 12,12,12,12,25,25,25,25,50,25,25,50SNAME DB TWO TIGER.$DATA ENDSSTACK SEGMENTSTACK STACKDB100DUP(0)STACK ENDSCODE SEGMENTASSUME CS: CODE,SS: STACK,DS: DATA第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 图10.7 例10-5流程图 开始初始化显示

46、歌名设置定时器设置计数值结束否?取节拍时间调用发声程序取下一音符和节拍结束YN第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 PLAY PROC FARPUSH DS MOV AX,0 PUSH AXMOV AX,DATAMOV DS,AX MOV DX,OFFSET SNAME MOV AH,9 INT 21H MOV AL,0B6HOUT43H,AL MOV BP,OFFSET TIME MOV SI,OFFSET FREQ第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 SONG:MOV DI,SICMP DI,?1JZ EXIT MOV BX,DS: BPCALL

47、 CSOUNDINC SI INC SI INC BP INC BP JMP SONG 第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 EXIT: RET CSOUNDPROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI MOV DX,12H MOV AX,34DCH DIV DIOUT 42H,AL第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 MOV AL,AH OUT 42H,AL IN AL,61H MOV AH,AL OR AL,03H OUT 61H,AL MOV BX,3FFFHDLY0: MOV CX,327

48、17DLY1: LOOP DLY1第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 DEC BX JNZ DLY0 MOV AL,AH OUT 61H,AL POP SI POP DX POP CX POP BX POP AX RET第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 CSOUND ENDPPLAY ENDPCODE ENDS ENDPLAY第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 例10-5的演奏程序比较简单,如果想演奏另一乐曲,只需将数据段中频率数据表Freq、节拍数据表Time和乐曲名SNAME换成另一个乐曲的频率、节拍和乐曲名即可。

49、音乐的质量取决于三个指标,即音量、音质和音调。微机的扬声器(Speaker)是不具备音量控制功能的;由于8254发出的是方波,驱动前后未加滤波处理,再有现在大多微机使用压电陶瓷扬声器,因此,所发出的声音单调、呆板、干瘪,谈不上什么音乐;音调(即声音频率)的产生是由硬件设备完成的,由于微机的继承性(向下兼容),各档次微机所发音调是准确的。 第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 如果要求高质量的音乐,则只能由多媒体设备来完成,具体参见多媒体技术教材。 上述两个音乐演奏程序的节奏(节拍时间长短)与微机的机型和主频有关。其原因是:节拍时间的长短是用软件延时完成的,由于机型不同,指

50、令LOOP的执行时间长短也不同,目前应用的微机由于各种因素,从80386Pentium 4(P),主频从40 MHz2 GHz以上的机型共同存在着,这样软件延时时间就要因机型而异。例如,P4微机比P微机速度快,而同一档次的机器主频又有区别。 第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 例如,P4微机有的主频为1 GHz,而有的为2.4 GHz,显然主频2.4 GHz的P4比主频1 GHz的P4要快,因此为了取得合适的演奏节拍,必须根据具体的机器来选择合适的内外循环次数,即调节延时软件DLY中BX和CX的数值。通常是高档次微机循环的次数多,同档次微机中,主频高的比主频低的循环次数

51、多。选择了适当的循环次数,就能达到控制演奏节奏的目的。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 10.3 数据通信系统程序设计数据通信系统程序设计 10.3.1 并行通信口I/O 【例10-6】 应用BIOS和DOS功能调用,编写一个简单的打字程序。要求把从键盘上接收的字符显示在屏幕上,并由打印机输出,在键盘上按下Esc键,即退出程序。程序流程图如图10.8所示。程序的清单如下:第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 NAME 例10-6.ASM .MODEL SMALL.STACK.DATAINTR_INSGDB YOU ARE USING A TYPE

52、R SLTNULATOR. DB TO QUIT THIS PROGRAM,13,10,$第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 PROMPT_MSG DB9EH,10H,$KEY_ESCEQU 1BH KEY_CR EQU 0DHKEY_IFEQU 0AH.CODEPRINT MACRO STR_ADDR PUSH DX PUSH AX LEADX,STR_ADDR第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 MOV AH,09 INT 21H POP AX POP DX ENDMINCLUDECLS.INCMAINROCFAR STI第第1010章章 汇编

53、语言程序设计实例汇编语言程序设计实例 图10.8 例10-6流程图开 始初 始 化 打 印 机Esc 键 ?结 束清 屏显 示 提 示 信 息接 收 键 入有 键 入 ?打 印 字 符CR键 ?屏 幕 、 打 印 机 换 行NYYNYN第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 CLDMOV AH,0MOV DX,0INT 17HCALL CLEAR_SCREENMOV AX,DATAMOV DS,AXMOV DX,0MOVAH,2INT 10HPRINT INTR_INSGPRINT PROMPT_MSG第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 GET_CH

54、:MOV AH,1 INT 21H CMP AL,0 JZ GET_CH CMP AL,KEY_Esc JZ EXIT MOV DL,AL MOV AH,5 INT 21H CMP AL,KEY_CR JNZ GET_CH第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 MOV DL,KEY_LF MOV AH,2 INT 21H MOV AH,5 INT 21H PRINT PROMPT_MSG JMP GET_CHEXIT:MOV AX,4C00H INT 21HMAIN ENDP ENDMAIN 第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 10.3.2 串行通信

55、接口I/O 利用BIOS INT 14H,通过COM端口与另一台PC机通信。其过程如下: (1) 用INT 14N,AH=1,AL=字符,发送一个字符。 (2) 为了接收字符,用INT 14H,AH=3来获得COM端口的状态,其值返回在AH寄存器中。注意,Modem的状态值是返回在AL寄存器中的。第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 (3) 检验COM端口状态值的第0位,它是数据准备好位,如果该位为1,说明COM端口已接收到字符并送到了8250UART。 (4) 为了读取接收到的字符,使用INT 14H,AH=2功能,将字符读到AL寄存器。 利用BIOS INT 14H,通过COM端口也可以实现双机双向通信。举例如下:第第1010章章 汇编语言程序设计实例汇编语言程序设计实例 【例10-7】 两台PC机通过COM2端口进行串行数据通信,编写一个汇编语言程序,要求从一台PC机上键盘输入的字符能传送到另一台PC机,若按下Esc键,则退出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论