版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章汇编语言程序设计实例10.1视频显示系统程序设计10.2音频发声系统程序设计10.3数据通信系统程序设计习题10第10章汇编语言程序设计实例10.1视频显示系统程10.1视频显示系统程序设计在微型计算机的图形显示方面,汇编语言具有极大的优势,这是因为显示在屏幕上的图形是由成千上万个像素组成的,对图形处理也需要复杂的算法和大量的指令。与高级语言相比,虽然表面上汇编语言显得复杂、凌乱和可读性差,但就速度而言,汇编语言最快。10.1视频显示系统程序设计在用汇编语言设计出来的图形显示有着直观、醒目和反应快速的优点,并且一旦掌握汇编语言显示技术的思路和基本显示模块,编程的工作仅是模块的运用和参数的修正。因此,汇编程序编制图形程序是程序设计中非常有意义和价值的工作之一。用汇编语言设计出来的图形显示有着直观、醒目和反应快速10.1.1显示方式显示方式与显示适配器及显示器密切相关,因此,必须熟悉和掌握显示器和与显示适配器相关的性能与技术指标。1.显示适配器IBM–PC系列微机中,先后提供了多种显示适配器(显示卡),表10-1介绍了这些适配器的基本技术指标。显示适配器的功能基本是向下兼容,即新型显示卡功能包括前一档次显示卡的显示功能,而又有所增强。此外,实用中各厂家不同型号的产品性能不尽相同。10.1.1显示方式表10-1显示适配器的基本技术指标类型分辨率彩色度(灰度)字符图形单色字符显示适配器(MDA)9×14720×3502彩色图形适配器(CGA)8×8320×200640×20016选4高分辨率单色适配器(HGC)
720×200640×35016选4表10-1显示适配器的基本技术指标类型分辨率显示模式信号模式其他
7TTL
0~6TTL
7、FTTL
显示模式信号其他
7TTL
0~6TTL
7、FTTL
增强型图形适配器(EGA)8×14640×35064选16多色图形阵列(MCGA)8×14640×400256视频图形阵列(VGA)9×16640×480256高级视频图形阵列(TVGA)
800×60064K超级视频图形适配器(SVGA)
1024×7681280×10241680×128016M局部高性能总线显示卡(PCI)
1024×7681280×10241680×128016M图形加速阵列(AGP)
1024×7681280×10241680×12804G增强型图形适配器(EGA)8×14640×35064选16多0~6、D~F、10TTL
0~6、D~F、10模拟
0~6、D~F、11~13模拟
0~6、D~F、11~13模拟
0~6、D~F、11~13模拟
标准、非标准模拟图形加速标准、非标准模拟图形加速0~6、D~F、10TTL
0~6、D~F、10模拟
0~62.显示器目前,Intel公司80x86/Pentium的微型机主要使用两种类型的显示器:数字(TTL)显示器和模拟显示器。1)数字(TTL)显示器该类型显示器的彩色分辨是用“1”和“0”来决定的。若某彩色信号为“1”,则在屏幕上呈现出这一彩色,否则屏幕上不显示这一彩色。TTL显示器上能显示的彩色种类与彩色信号输入线的多少有关。2.显示器如CGA与彩色有关的信号线有红(R)、绿(G)、蓝(B)和亮度(I),这四种信号可组合成2~16种不同的颜色,字符的显示可从其中选择做前景或背景色。CGA和EGA适配器仅能支持TTL显示器。如CGA与彩色有关的信号线有红(R)、绿(G)、蓝2)模拟显示器模拟显示器有3种彩色信号输入线(红、绿、蓝),加在每个输入线上的电平的高低级别决定了显示在屏幕上的那种彩色的数量。从理论上讲,它能显示的彩色数量是无限的,但实际应用中却是有限的,这主要取决于显示适配器的能力。由于彩色数量的无限性,模拟显示器被认为是一种优秀的显示技术。VGA及以上显示方式必须配置模拟显示器。目前386及其以上的机型基本上选用VGA适配器和模拟显示器。2)模拟显示器3)显示器分辨率分辨率是显示器的重要指标,它关系到显示器的性能和图像质量。图像质量由两个主要因素决定:其一是屏幕上扫描图像的速度;其二是屏幕上的像素数,像素数又称分辨率,以屏幕行像素数(x)×列像素数(y)的形式表示。例如,表10-1中VGA的分辨率是640×480,就是说,这种方式下,每行可以分辨640个像素点,每列可以分辨480个像素点。3)显示器分辨率显示器分辨率也有着向下兼容的问题,高分辨率显示器可以由低分辨率的适配器驱动。例如,SVGA显示器上显示VGA信号。而低分辨率显示器则不可以由高分辨率的适配器驱动,如果这样做了,轻则显示器行不同步,看不见图像,重则将造成显示器烧毁。显示器分辨率也有着向下兼容的问题,高3.显示方式由于设置或改变PC机的显示方式对时间的要求不严格,而要编写设置或改变显示方式的程序很困难,因此一般由DOS或BIOS调用来完成。BIOS显示例程提供了设置显示方式的功能,程序只要给出调用参数,使用BIOS的INT10H即可建立某种显示方式。表10-2列出了几种常用的显示方式。3.显示方式表10-2INT10H设置显示方式功能表(AH=00)调用参数(AL)显示方式分辨率色度或灰度0040×25文本16级灰度0140×25文本16色或8色0280×25文本16级灰度0380×25文本16色或8色04320×200图形4色05320×200图形4色06640×200图形黑白显示表10-2INT10H设置显示方式功能表(AH=000780×25文本黑白显示0D320×200图形16色0E640×200图形16色0F640×350图形黑白显示10640×350图形4色或16色11640×480图形黑白显示12640×480图形16色13320×200图形256色0780×25文本黑白显示0D320×200图形16色0E6适用显示适配器CGAMCGAEGAVGACGAMCGAEGAVGACGAMCGAEGAVGACGAMCGAEGAVGACGAMCGAEGAVGACGAMCGAEGAVGACGAMCGAEGAVGAMDA
EGAVGA适用显示适配器CGAMCGAEGAVGACGAMCGAEGA
EGAVGA
EGAVGA
EGAVGA
EGAVGA
MCGA
VGA
VGA
MCGA
VGA
EGAVGA
EGAVGA
EGAVGA
EGAV10.1.2DOS功能调用显示技术操作系统的核心是由许多关于I/O驱动、磁盘读写和文件管理等程序段构成的。这些程序段都编了号,可由汇编语言的源程序调用。在调用时,把程序段的号(或称系统功能调用号)送至AH,把程序段规定的入口参数,送至指定的寄存器,然后由中断指令INT21H来实现调用。在这里通过几个程序举例来介绍有关I/O的功能调用,便于读者在编程中应用。10.1.2DOS功能调用显示技术【例10-1】在微型计算机系统上常常可以显示实时时钟,这就要求能输出数码00~59。要输出多于一个字符时,要利用DOS功能调用9,它是向CRT输出字符串的子程序,要求在调用前使DX指向字符串的首地址,字符串必须以字符“$”结束,则功能调用9能把字符“$”之前的全部字符向CRT输出。系统调用形式如下:【例10-1】在微型计算机系统上常常MOVDX,OFFSETOUTSTRING ;首地址装入DX寄存器 MOV AH,9;系统功能调用号送入AH INT 21H ;启动DOS功能调用程序流程图如图10.1所示。程序的清单如下:TITLE 例10-1.ASMSTACK SEGMENTPARA STACK'STACK'MOVDX,OFFSETOUTSTDB 100 DUP(?)STACK ENDSDATA SEGMENTBUFFER DB 3 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FARDB 100 DUP(?)图10.1例10-1流程图图10.1例10-1流程图BEGIN: PUSH DSMOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV CX,1000 MOV BL,0 LEA SI,BUFFER PUSH BXBEGIN: PUSH DSGOON: MOV DL,0DH MOV AH,2 INT 21H MOV DL,0AH MOV AH,2INT 21H POP BXGOON: MOV DL,0DHMOV AL,BL INC AL DAA CMP AL,60H JC NEXT MOV AL,0MOV AL,BLNEXT: MOV BL,ALPUSH BXMOV DL,ALPUSH CX MOV CL,4 SHR AL,CL OR AL,30H MOV [SI],ALNEXT: MOV BL,ALINC SI MOV AL,DL AND AL,0FH OR AL,30H MOV [SI],AL INC SI MOV AL,'$' MOV [SI],AL MOV DX,OFFSETBUFFER MOV AH,9INC SIINT 21H MOV CX,0FFFFHAGAIN:DEC CX JNE AGAIN POP CX DEC CX JE DONE MOV SI,OFFSETBUFFER JMP GOON INT 21HDONE: RETSTART ENDPCODE ENDSEND BEGINDONE: RET10.1.3BIOS功能调用显示技术1.PC机彩色图形模式PC机彩色图形适配器有两大类模式:一种是文本(字符)模式(AN);另一种是图形模式(APA)。而每种模式又可包括不同的显示方式,可以通过BIOS的INT10H功能调用号0来设置或改变显示模式和显示方式。采用BIOS设置显示方式见8.4节。10.1.3BIOS功能调用显示技术【例10-2】选择显示方式。程序流程图如图10.2所示。程序的清单如下:TITLE 例10-2.ASMSTACK SEGMENT STACK 'STACK' DB 100 DUP(0)STACK ENDSDATA SEGMENT【例10-2】选择显示方式。程序流程图如图10.2所示。程ERRORDB '…INPUTERROR!TRYAGAIN',0AH,0DH,'$'MSG0 DB '***MENU***',0AH,0DH,'$'MSG1 DB '1,40*25B&WTEXT',0AH,0DH,'$'MSG2 DB '2,40*25COLORTEXT',0AH,0DH,'$'MSG3 DB '3,80*25B&WTEXT',0AH,0DH,'$'MSG4 DB '4,80*25CLOORTEXT',0AH,0DH,'$'MSGS DB '5,320*200COLORGRAPHICS',0AH,0DH,'$'MSG6 DB '6,320*200B&WGRAPHICS',0AH,0DH,'$'ERRORDB '…INPUTERROR!TRYCOUNTEQU $-MSG6MSG7 DB 'PLEASECHOOSE:','$'OK DB 0AH,0DH,'SETDISPLAYMODELOK!','$'DATA ENDSCODE SEGMENTCOUNTEQU $-MSG6图10.2例10-2流程图图10.2例10-2流程图ASSUME CS:CODE,DS:DATA,SS:STACKSETMODE PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AXASSUME CS:CODE,DS:DATA,SS:STATRV: MOV DX,OFFSETMSG0 MOV DI,COUNT MOV CX,8DMENU: CALL DISP ADD DX,DI LOOP DMENU MOV AH,1INT 21H CMP AL,31H JLERRTRV: MOV DX,OFFSETMSG0CMP AL,36H JG ERR SUB AL,30H MOV AH,0 INT 10H JMP SETOK ERR: MOV DX,OFFSETERROR CALL DISPCMP AL,3 MOV AH,6 MOV AL,0 MOV BH,7 MOV CX,0 MOV DX,184FH INT 10H JMP TRVSETOK: MOV DX,OFFSETOK MOV AH,6 CALL DISP RETSETMODE ENDPDISP PROC NEARMOV AH,9 INT 21H RETDISP ENDP CODE ENDS END SETMODE CALL DISP2.在文本方式下显示字母、数字和一些字符图形对屏幕上的每一个字符,首先应给出它的ASCII码值,同时还要给出一个8bit(位)的属性字节。这个属性字节对单色和彩色显示均有效,在单色文本下,只提供闪烁、反显和亮度方面的属性。【例10-3】在屏幕的第10行10列以绿底红字闪烁显示“HOWDOYOUDO.”,程序流程图如图10.3所示。程序的清单如下:2.在文本方式下显示字母、数字和一TITLE 例10-3.ASMSTACK SEGMENTSTACK 'STACK' DB 100 DUP(0)STACK ENDSDATA SEGMENTMSG DB 'HOWDOYOUDO.'COUNT EQU $-MSGDATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACKTITLE 例10-3.ASM图10.3例10-3流程图图10.3例10-3流程图DISPLAY PROC 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,0AHDISPLAY PROC FARMOV AH,2 INT 10H MOV SI,OFFSETMSG MOV DI,COUNTDISP: MOV AL,[SI] MOV AH,9 MOV CX,1 MOV BH,0 MOV BL,0A4H INT 10H INC SI INC DL MOV BH,0MOMOV DH,0AH MOV AH,2 INT 10H DEC DI JNZ DISP RETDISPLAY ENDPCODE ENDS END DISPLAYMOV10.1.4彩色图形显示彩色图形是在图形方式下,由一组像素点在屏幕上形成的。图形方式相对于文本方式所要处理的数据量大,而且不同的显示适配器所支持的分辨率不同,因此同一彩色图形在不同分辨率的情况下,处理的数据量差别很大。10.1.4彩色图形显示1.彩色绘图在屏幕上绘制彩色图形,可用BIOS中INT10H的0号、11号、12号和13号功能调用。利用INT10H的这些功能调用,就可使屏幕上的绘图变得比较简单。通常情况下,有以下几步:1.彩色绘图(1)用INT10H的0号功能将显示方式设置成320×200彩色图形方式。 MOV AH,0 ;设置显示方式 MOV AL,4 ;置CGA为320×200彩色图形方式 INT 10H ;BIOS中断调用(1)用INT10H的0号功能将(2)用INT10H的11号功能设置彩色图形方式下的调色板或背景颜色。 MOV BH,0 ;设置背景色 MOV BL,C ;C=颜色值(0~16) MOV AH,11 ;功能号送入AH INT 10H ;BIOS中断调用 MOV BH,1 ;设置调色板 MOV BL,N ;N=调色板号(0,1) MOV AH,11 INT 10H(2)用INT10H的11号功能设置彩色图形方式下的调色(3)在上述工作的基础上,利用INT10H的12号功能调用或13号功能调用在屏幕上写彩色像素点或读彩色像素点。 MOVAH,12 ;12号功能调用,写像素点 MOVAL,C ;C=像素点颜色(0~3) MOVDX,ROW ;ROW=行号(0~199) MOVCX,COL ;COL=列号(0~319)(3)在上述工作的基础上,利用INT 10H ;BIOS中断调用 MOV AH,13 ;13号功能调用,读像素点 MOV DX,ROW ;ROW=行号(0~199) MOV CX,COL ;COL=列号(0~319) INT 10H ;BIOS中断调用INT 10H ;BIOS中断调用2.彩色绘图举例【例10-4】编写一个8086/8088汇编语言程序,使程序运行后屏幕显示器成为一台电子钟。首先屏幕上显示提示符,要求从键盘上输入当前时间,然后每隔一秒使显示的秒值加1,达到60秒时使分值加1,秒值清零;达到60分时使小时值加1,分值清零;达到24小时则小时值清零。上述过程一直进行下去,当键入Ctrl+C时退出“电子钟”状态,返回DOS。根据上述要求,可画出程序的流程图如图10.4所示。2.彩色绘图举例图10.4例10-4流程图图10.4例10-4流程图其中,显示一个字符串,以及从键盘上接收一个字符串可分别通过09号和0AH号DOS功能调用实现。延时1秒可以编写一个延时子程序。程序中对时、分和秒三个时间单位有许多类似的操作。例如,分别将它们由ASCII码转换为BCD码,或由BCD码转换为ASCII码,以及将时、分和秒值分别加1,并进行DAA调整后判断是否达到60H或24H等。对于这样的程序段,可以采用宏处理伪指令,以便缩短源程序的长度,使程序更加清晰,有利于结构的模块化。此外,还可以利用BIOS调用设计窗口,选择适当的背景色和前景色等,使屏幕显示更加美观。程序清单如下:其中,显示一个字符串,以及从键盘上TITLE 例10-4.ASMDATA SEGMENTBUF1 DB'Currenttimeis:$'BUF2 DB 10 DB 10 DUP(?)DATA ENDSSTACK SEGMENT STACK DB 100 DUP(?)STACK ENDSCODE SEGMENTTITLE 例10-4.ASM ASSUMECS:CODE,DS:DATAASSUMESS:STACKCURSOR MACRO ROW,CLM MOV AH,2 MOV BH,0 MOV DH,ROW MOV DL,CLM INT 10H ENDM ASSUMECS:CODE,DS:DATAWIN MACROROWL,CLML,ROWR,CLMR,COLOR MOVAH,6 MOV AL,0 MOV CH,ROWL MOV CL,CLML MOV DH,ROWR MOV DL,CLMR MOV BH,COLOR INT 10H ENDMWIN MACROROWL,CLML,ROWRASCBCD MACRO REG INC BX INC BX MOV REG,[BX] MOV CL,4 SHL REG,CL INC BXMOV AL,[BX] AND AL,0FH OR REG,AL ENDM
ASCBCD MACRO REGBCDASCMACROREG 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 ENDMBCDASCMACROREGINCBCD MACRO REG,COUNT MOV AL,REG INC AL DAA MOV REG,AL CMP AL,COUNT JNZ DISPY MOV REG,0 ENDMINCBCD MACRO REG,COUNTSTRDSPY MACRO ADRS LEA DX,ADRS MOV AH,9 INT 21H ENDMCLOCK PROC FARSTART: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AXSTRDSPY MACRO ADRSWIN 0,0,24,79,7, WIN 9,28,15,52,01010111B CURSOR 11,32 STRDSPY BUF1 CURSOR 13,36 LEA DX,BUF2 MOV AH,0AH INT 21H LEA BX,BUF2 ASCBCD CH ASCBCD DH ASCBCD DLWIN 0,0,24,79,7,TIMER: CALL DELY INCBCD DL,60H INCBCD DH,60H INCBCD CH,24HDISPY: LEA BX,BUF2BCDASC CHBCDASC DHBCDASC DLINC BXMOV AL,'$'TIMER: CALL DELYMOV [BX],ALPUSH DXCURSOR 13,36STRDSPY BUF2POP DX JMP TIMERDELY PROCPUSH CXPUSH AXMOV AX,3FFFHMOV [BX],ALX1: MOV CX,0FFFFHX2: DEC CXJNE X2DEC AXJNE X1POP AXPOP CXRETDELY ENDPCLOCK ENDPCODE ENDS END STARTX1: MOV CX,0FFFFH用这个程序可在屏幕上画出一些复杂图形,如多边形、山水花鸟和汽车等,也可在该程序的基础上增加图形装入、存盘和打印功能,以提高程序的实用性。用这个程序可在屏幕上画出一些复杂图10.2音频发声系统程序设计10.2.1PC机的发声原理IBM-PC系列机的主机箱装有一个小扬声器,系统板上的定时器8253(或8254)利用工作方式3产生一定频率信号,通过可编程的并行外围接口芯片8255(或8255A)控制其发音。扬声器的控制驱动电路如图10.5所示。10.2音频发声系统程序设计10.2.1P
图10.5扬声器控制驱动电路
图10.5扬声器控制驱动电路可编程的并行接口芯片8255有三个8位的并行端口:A口、B口和C口。在IBM系列微机中,BIOS在开机自检后已将8255初始化为A口和C口用于输入,B口用于输出。B口的I/O端口地址为61H。由图10.5可见,8255B口的低两位用来控制扬声器驱动,当输出端口61H的D1位为“1”或为“0”时,将使控制驱动器的与门电路接通或关闭,使8254所发出的音频信号能到达驱动器或被阻断。这样通过控制D1位的变化,可使扬声器接通和断开,控制扬声器是否能发出声音。此外,通过控制D1位的通断时间,就能发出不同的音长。可编程的并行接口芯片8255有三个861H端口的D0位为“1”时,控制8254定时器产生驱动扬声器发声的音频信号,该位为“0”则不发信号。8254有三个定时器,分为0号、1号和2号定时器,驱动扬声器的是2号定时器,该定时器工作在方式3,是一个频率发生器,它负责向扬声器发送指定频率的脉冲信号。当8255输出端口61H的D1位为“1”时,在61H的D0位为“1”,8254发出指定频率的声音信号的前提下,声音信号通过与门到达驱动器驱动扬声器发声。本节主要介绍利用8254产生声音和乐曲。61H端口的D0位为“1”时,控制10.2.2发音程序BIOS中有一个BEEP子程序,它可以产生896Hz的声音,且声音持续时间只能是0.5s的整数倍。BEEP子程序用于PC机加电自检发现硬件错误,或正常进入系统等过程后,向用户发出声音提示。可以利用这一子程序的思路,来编写通用的发音程序。发音程序的编制需要进行以下四个方面工作。10.2.2发音程序(1)确定发声频率。BEEP子程序将计数值533H送8254的定时器2而产生896Hz的声音,那么要产生其他频率的声音,则必须将对应频率的计数值送8254的定时器2产生其他频率声音的计数值。该方法如下所示:533H×896÷给定频率=123280÷给定频率(也可用定时器的时钟1192576Hz直接计算计数值:1192576÷给定频率。)假设给定频率在DI中,可用下面的指令序列在AX中得到计数值。(1)确定发声频率。BEEP子程序MOV DX,12HMOV AX,3280DIV DI ;计算某频率的计数值为了不产生除法溢出,限制DI中的频率不低于19Hz,一般情况下声音频率不会这样低。MOV DX,12H(2)确定音长。BEEP子程序只能产生持续时间(音长)为0.5s的整数倍的音长,如果要求持续时间容易调整,利用软件延时程序可选择较短的持续时间作为基数,如10ms(毫秒)。10ms延时可由执行循环指令实现:MOV CX,2801DELAY: LOOP DELAY如果要产生与10ms成倍数的延时,可将倍数送到BX寄存器中,由BX再控制10ms延时指令的执行次数。如产生0.5s持续时间,则将50送入BX中,指令序列如下:(2)确定音长。BEEP子程序只 MOV BX,50DELAY0: MOV CX,2801DELAY1: LOOP DELAY1 DEC BX JNZ DELAY0 MOV BX,50(3)定时器调节。在对BEEP子程序作上述两方面修改的基础上就可以编写一个任一频率(由DI指定)和任一持续时间(由CX和BX指定)的通用发音程序。由于该发音程序使用8254定时器2产生声音的频率,因此需要对定时器2进行相应的设置。①对输入/输出端口43H(该端口分配给8254的工作方式寄存器)送一个特定的数0B6H,这个数用于对定时器2的工作方式进行初始化,使定时器2准备接收计数值。(3)定时器调节。在对BEEP子程②对输入/输出端口42H(该端口分配给定时器2)中送一个16位的计数值(即123280÷给定频率),用于设置将要产生的声音频率。(4)操作扬声器开关。由于扬声器驱动由8255的输出端口61H的低两位控制,故应把输出端口61H的D0和D1位置“1”,以便使扬声器发出声音。②对输入/输出端口42H(该端口分配10.2.3乐曲演奏程序利用通用发音子程序CSOUND,可以编写演奏乐曲程序。在乐曲中,每个音符的音高和音长与频率节拍有关。下面给出音律表的一部分,见表10-3,该表对应3个音阶。10.2.3乐曲演奏程序表10-3音阶频率对照表······ ······· ·音名 C D EFGA BC'D'E'F'G' A' B'简谱 12345 6712345 6 7频率131147 165175 196 220 247262294330349392 440 494 C'' D''E''F''G''A'' B'' 1 234567524588660698 784 880 984表10-3音阶频率对照表···演奏乐曲的程序中需要有两组数据支持:一组是频率数据;一组是节拍时间数据。音符的频率可以从表10-3中查得。节拍时间就是音符的持续时间,取决于乐曲的速度和每个音符的节拍数据。如4/4(四四拍)中,每小节包括4拍,全音符持续4拍,二分音符持续2拍,四分音符持续一拍,八分音符持续半拍等。有了音调与频率和时间的关系后,就可以按照乐曲的曲谱将每个音符的频率和持续的时间定义成两组数据表,然后编程依次取出表中的频率值和时间值,调用CSOUND子程序就可发出各种声音。例10-5的程序中为全音符分配了1s时间。演奏乐曲的程序中需要有两组数据支持【例10-5】图10.6是“两只老虎”的简谱。根据乐谱在数据段中定义了频率数据表(Freq)和节拍时间数据表(Time),程序以?1作为频率数据表的结束标志。程序流程图如图10.7所示,演奏该乐曲程序如下:1=C4/4【例10-5】图10.6是“两只老图10.6“两只老虎”简谱1=C4/41231|1231|345–|345–|
56
5431|56
5431|251–|251–|图10.6“两只老虎”简谱1=C4/4NAME例10-5.ASMDATASEGMENTFREQ W262,294,330,262,262,294,330,262 W 330,349,392,330,349,392,392,440 W 392,349,330,262,392,440,392,349DW 330,262,294,196,262,294,196,262,-1NAME例10-5.ASMTIME DW 25,25,25,25,25,25,25,25,25,25 DW 50,25,25,50,12,12,12,12,25,25 DW 12,12,12,12,25,25,25,25,50,25,25,50SNAME DB 'TWOTIGER.$'DATA ENDSSTACK SEGMENT STACK 'STACK' DB 100 DUP(0)STACK ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATATIME DW 25,25,25,25,25,25,25图10.7例10-5流程图图10.7例10-5流程图PLAY PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV DX,OFFSETSNAME MOV AH,9 INT 21H MOV AL,0B6H OUT 43H,ALMOV BP,OFFSETTIME MOV SI,OFFSETFREQPLAY PROC FARSONG: MOV DI,[SI] CMP DI,?1 JZ EXIT MOV BX,DS:[BP] CALL CSOUND INC SI INC SI INC BP INC BP JMP SONGSONG: MOV DI,[SI]EXIT: RETCSOUND PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI MOVDX,12H MOV AX,34DCH DIV DI OUT 42H,ALEXIT: RETMOV AL,AH OUT 42H,AL IN AL,61H MOV AH,AL OR AL,03HOUT 61H,AL MOV BX,3FFFHDLY0: MOV CX,32717DLY1: LOOP DLY1MOV ADEC BX JNZ DLY0 MOV AL,AH OUT 61H,AL POP SI POP DX POP CX POP BX POP AX RETDEC CSOUND ENDPPLAY ENDPCODE ENDS END PLAYCSOUND ENDP例10-5的演奏程序比较简单,如果想演奏另一乐曲,只需将数据段中频率数据表Freq、节拍数据表Time和乐曲名SNAME换成另一个乐曲的频率、节拍和乐曲名即可。音乐的质量取决于三个指标,即音量、音质和音调。微机的扬声器(Speaker)是不具备音量控制功能的;由于8254发出的是方波,驱动前后未加滤波处理,再有现在大多微机使用压电陶瓷扬声器,因此,所发出的声音单调、呆板、干瘪,谈不上什么音乐;音调(即声音频率)的产生是由硬件设备完成的,由于微机的继承性(向下兼容),各档次微机所发音调是准确的。例10-5的演奏程序比较简单,如如果要求高质量的音乐,则只能由多媒体设备来完成,具体参见多媒体技术教材。上述两个音乐演奏程序的节奏(节拍时间长短)与微机的机型和主频有关。其原因是:节拍时间的长短是用软件延时完成的,由于机型不同,指令LOOP的执行时间长短也不同,目前应用的微机由于各种因素,从80386~Pentium4(P4),主频从40MHz~2GHz以上的机型共同存在着,这样软件延时时间就要因机型而异。例如,P4微机比PⅠ微机速度快,而同一档次的机器主频又有区别。如果要求高质量的音乐,则只能由多媒例如,P4微机有的主频为1GHz,而有的为2.4GHz,显然主频2.4GHz的P4比主频1GHz的P4要快,因此为了取得合适的演奏节拍,必须根据具体的机器来选择合适的内外循环次数,即调节延时软件DLY中BX和CX的数值。通常是高档次微机循环的次数多,同档次微机中,主频高的比主频低的循环次数多。选择了适当的循环次数,就能达到控制演奏节奏的目的。例如,P4微机有的主频为1GHz,而有的为2.410.3数据通信系统程序设计10.3.1并行通信口I/O【例10-6】应用BIOS和DOS功能调用,编写一个简单的打字程序。要求把从键盘上接收的字符显示在屏幕上,并由打印机输出,在键盘上按下Esc键,即退出程序。程序流程图如图10.8所示。程序的清单如下:10.3数据通信系统程序设计10.3.1并行通NAME 例10-6.ASM.MODELSMALL.STACK.DATAINTR_INSG DB 'YOUAREUSINGATYPERSLTNULATOR.' DB ''TOQUITTHISPROGRAM',13,10,'$'NAME 例10-6.ASMPROMPT_MSG DB 9EH,10H,'$'KEY_ESC EQU 1BHKEY_CR EQU 0DHKEY_IF EQU 0AH.CODEPRINT MACRO STR_ADDR PUSH DX PUSH AX LEA DX,STR_ADDRPROMPT_MSG DB 9EH,10H,'$'MOV AH,09 INT 21H POP AX POP DXENDMINCLUDE CLS.INCMAIN ROC FARSTIMOV AH图10.8例10-6流程图图10.8例10-6流程图CLDMOV AH,0MOV DX,0INT 17HCALL CLEAR_SCREENMOV AX,@DATAMOV DS,AXMOV DX,0MOV AH,2INT 10HPRINT INTR_INSGPRINT PROMPT_MSGCLDGET_CH:MOV AH,1 INT21H CMPAL,0 JZ GET_CH CMP AL,KEY_Esc JZ EXITMOVDL,AL MOVAH,5 INT21H CMPAL,KEY_CRJNZ GET_CHGET_CH:MOV AH,1MOV DL,KEY_LFMOV AH,2INT 21HMOV AH,5 INT 21H PRINT PROMPT_MSG JMP GET_CHEXIT: MOV AX,4C00HINT 21HMAIN ENDPEND MAINMOV DL,K10.3.2串行通信接口I/O利用BIOSINT14H,通过COM端口与另一台PC机通信。其过程如下:(1)用INT14N,AH=1,AL=字符,发送一个字符。(2)为了接收字符,用INT14H,AH=3来获得COM端口的状态,其值返回在AH寄存器中。注意,Modem的状态值是返回在AL寄存器中的。10.3.2串行通信接口I/O(3)检验COM端口状态值的第0位,它是数据准备好位,如果该位为1,说明COM端口已接收到字符并送到了8250UART。(4)为了读取接收到的字符,使用INT14H,AH=2功能,将字符读到AL寄存器。利用BIOSINT14H,通过COM端口也可以实现双机双向通信。举例如下:(3)检验COM端口状态值的第0位【例10-7】两台PC机通过COM2端口进行串行数据通信,编写一个汇编语言程序,要求从一台PC机上键盘输入的字符能传送到另一台PC机,若按下Esc键,则退出程序。在程序中,COM2端口初始化为4800波特,8位数据位,无校验,1位终止位。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026CMA美国注册管理会计师考试(战略财务管理)历年参考题库含答案详解
- 2026矿泉水行业技术工人缺口与职业教育对接方案报告
- 2026汽车制造行业市场品质分析及质量控制与品牌建设研究报告
- 大学计算机一级考试操作题考试要点
- 工艺用水设计运行维护与验证
- 湖北省鄂教版八年级数学下册第6章同步练习题及答案
- 2026人工智能产业市场应用渗透及投资前景规划分析报告
- 人教版五年级英语第9单元日常交际专项训练习题及答案
- 2026年人教版小学语文二年级上册第12单元课后练习题及答案
- 2026年北师大版初中七年级数学上册第12章同步练习题及答案
- 消防水泵房安装专项施工方案
- 保安员证考试题库(含答案)2026年
- 2026 年产科产后出血急救护理流程培训课件
- 2025年中级安全工程师《化工安全》考试真题及答案解析
- 光明区2025广东深圳市光明区科技创新服务中心博士后招聘笔试历年参考题库典型考点附带答案详解
- 《长颈鹿与小鸟》教学设计-北师大版小学二年级数学上册第九单元第一课时
- 高级机工见习记录薄填写
- 2026年建行信息技术类笔必背题库【夺冠】附答案详解
- 《濒危野生动植物种国际贸易公约》附录中文版2026
- 超声介入管理制度
- 杭州雷峰塔图文课件
评论
0/150
提交评论