《《显示程序设计》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《显示程序设计》PPT课件.ppt(89页珍藏版)》请在三一办公上搜索。
1、1,新 编汇编语言程序设计,2,第7章 显示程序设计,7.1 宏指令 7.2字符方式显示程序设计 7.3图形显示程序设计 习题七,3,键盘与显示器是重要的人机对话界面。显示器通过显示适配器(Video Adapter,也称显卡)与PC机相连,显卡是计算机和显示器的接口。显卡的两种工作方式字符方式也称文本方式,在这种方式下,屏幕只能显示字符及其属性(颜色,亮度等),屏幕被分成若干行和列,最常见的是80列25行。图形方式下的屏幕由一个个像素(Pixel)组成,例如,标准VGA格式的屏幕由480行,每行640个像素组成。通过读写屏幕上各个像素(点),可以显示出各种单色和彩色的图形。,4,7.1宏指令
2、,7.1.1 宏指令的定义 7.1.2 宏指令的使用,5,一组指令/伪指令,用来完成某项功能。宏指令使用之前,需要为这一组指令起一个名字,称为“定义”,此后就可以在程序中多次使用。可以将宏指令的定义存放在一个文件中,建立宏指令库,好像高级语言的库函数,使用时用INCLUDE伪指令将这个库插入源程序。,宏指令,6,宏指令实际上就代表了它对应的一组指令。对程序中出现的宏指令进行汇编时,这条宏指令被它对应的一组指令所代替。如果程序中多次使用宏指令,就等于多次重复拷贝了这个指令组,占用的内存随之增加。调用子程序通过执行CALL指令实现,存在从“主程序”与“子程序”之间的两次控制转移。使用宏指令不存在控
3、制转移的过程。使用子程序和宏指令都可以提高编程效率。子程序占用固定大小的存储空间,被主程序调用时,空间不会随调用次数而增加。但是,宏指令占用存储空间会随着使用次数的增加而增加。,宏指令和子程序的区别:,7,7.1.1 宏指令的定义,形式参数表中的参数可以为“空”(没有),也可以有多个,用逗号分隔。宏体由指令、伪指令和前面已经定义的宏指令组成。,宏指令名MACRO形式参数表;宏体(指令组)ENDM,8,CRLFMACROMOVDL,0AHINT21HMOVDL,0DHINT21HENDM,例7.1 定义一个宏,输出换行回车符。,9,SUM2MACROX,YMOVAX,XADDAX,YENDMSU
4、M3MACRO A,B,CSUM2A,BADDAX,CENDM,例7-2 可以用已经定义的宏指令来定义另一个宏指令,也 就是说,宏指令可以嵌套定义。,10,MAXMACROX,Y,ZLOCALL1MOVAX,XCMPAX,YJGEL1MOVAX,YL1:MOVZ,AXENDM,例7.3 定义一个宏,求两个带符号数中的较大者。,11,7.1.2宏指令的使用,.MODEL SMALL.CODESTART:MOVCX,10MOVBL,0AGAIN:MOVDL,BLMOVAH,02HINT21HCRLFINCBLLOOPAGAINMOVAH,4CHINT 21HEND START,CRLFMACROM
5、OVDL,0AHMOVAH,02HINT21HMOVAH,02HMOVDL,0DHINT21HENDM,例7.4在屏幕上输出09十个字符,每个字符占一行。,12,.MODEL SMALL.DATABUFDW 90,90,234;3个数BIGDW?;存放最大数的单元MESSDB0DH,0AH,The Max Is:$,宏指令的展开,例7.5 利用例7.3定义的宏指令,求3个带符号数中最大的数 并显示。,13,.CODESTART:MOVAX,DATAMOVDS,AXMAXBUF,BUF+2,BIG;求前两个数中的较;大者,存入BIGMAXBUF+4,BIG,BIG;求第三个数与BIG中的较;大者
6、,存入BIGLEADX,MESSMOVAX,BIGCALLWRITEINT;输出结果MOVAX,4C00HINT21H;返回操作系统ENDSTART,14,在MAX宏指令定义中,出现了标号L1。该指令被二次调用。这样,在目标代码中会出现二个L1标号,也就是说,在同一个源程序中出现两个同名标号。为了避免这个错误,宏定义中使用LOCAL局部标号定义伪指令把L1定义为“局部标号”。宏展开时,汇编程序对局部标号进行换名处理,用?0000、?0001依次代替各个宏展开中的标号。注意,LOCAL伪指令应紧接MACRO语句之后,两句之间不得有其他语句。,15,7.2 字符方式显示程序设计,7.2.1 文本显
7、示模式和字符属性7.2.2 直接写屏输出 7.2.3 BIOS显示功能调用,16,7.2.1文本显示模式和字符属性,BIOS的显示功能调用INT 10H的0号功能用于设定显示模式。MOVAH,0MOVAL,显示模式号INT10H;无返回参数。,显示模式,17,18,2.字符属性,19,7.2.2 直接写屏输出,显存(VRAM)用来存放需要在显示器上显示的文本、图形信息 的内存区域。屏幕上每个坐标位置上的字符或图形信息与显存中某些单元的内容一一对应。,20,使用MOV指令将数据送到显存的某个单元时,在屏幕的对应位置上就会立即显示出相应的字符或图形。在字符显示模式下,显存从B800H:0000H开
8、始,每个字符用两个字节来表示:第一个字节为显示字符的ASCII码,第二个字节是字符的显示属性。以25行80列的字符显示方式为例,一个屏幕可显示2000个字符,需要约4KB的显示存储器,称为一页。屏幕上某个坐标位置对应显存中的偏移地址:=页起始偏移地址2(字符行坐标每行列数列坐标),直接写屏方式,21,DATASEGMENTBUF DW2000 DUP(?);保存显存信息的缓冲区MESSDB Press Any Key to Review the Screen!;显示的信息LENEQU$-MESSDATAENDS,例7.6清屏并输出字符串,按任意键后,恢复清屏前屏幕内容。,22,CODESEGM
9、ENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AXMOVAX,0B800HMOVES,AX;ES为显示缓冲区段地址MOVCX,2000;2000个字符MOVSI,0LEADI,BUF;存放显存信息的缓;冲区首地址送DI,23,NEXT:MOVAX,ES:SI;将显存中的内容全部读入到BUFMOVDI,AXADDSI,2ADDDI,2LOOPNEXTMOVDI,0;显存首地址送DIMOVCX,2000;屏幕上2000个字符都写成空格,即清屏MOVAX,0720H;20H是空格的ASCII代码,07H是显示属性CLD;设置串操作指针递增REPSTO
10、SW;将AX内容送显存,共2000次,实现清屏,24,MOVDX,050AH;屏幕坐标(5,10)CALLCALADDR;计算屏幕坐标(5,10)在显存中的偏移地址LEASI,MESS;要显示的字符串首地址送SIMOVCX,LEN;字符串长度送CXMOVAH,1EH;显示属性送入AHNEXT2:MOVAL,SI;字符ASCII码送ALSTOSW;字符ASCII码及其属性送;显存的相应位置INCSI;修改字符串指针LOOPNEXT2;循环LEN次MOVAH,10H;等待键盘输入INT16H,25,;以下程序将BUF中的内容恢复到B800:0000H开始的;4000个字节中,恢复原先的屏幕 MOV
11、CX,2000 LEASI,BUFMOVDI,0REPMOVSWMOVAX,4C00HINT21H,26,;计算偏移地址子程序:入口参数 DH=行数,DL列数;返回参数 DI=偏移地址CALADDRPROCNEARPUSHAXMOVAL,80;总列数为80列MULDH XORDH,DH ADDAX,DX SHLAX,1MOVDI,AX;DI2(字符行坐标总列数列坐标)POPAXRETCALADDRENDPCODEENDSEND START,27,7.2.3 BIOS显示功能调用(INT 10H),28,29,30,31,SCROLL MACRO TOP,LEFT,BOTTOM,RIGHT,AT
12、TRIB MOVAX,0600H;屏幕上卷功能 MOVCH,TOP;左上角行号 MOVCL,LEFT;左上角列号 MOVDH,BOTTOM;右下角行号 MOVDL,RIGHT;右下角列号 MOVBH,ATTRIB;卷入行属性 INT10H;对指定范围屏幕清屏ENDM,CLSMACROSCROLL0,0,24,79,7;宏嵌套定义ENDM,宏定义CLS,清除整个屏幕显示内容,宏定义SCROLL,清除屏幕内一个区域的显示内容,32,SETCUSORMACRO PAGE1,ROW,COLUMN MOVAH,2;设置光标位置 MOVDH,ROW;光标行坐标 MOVDL,COLUMN;光标列坐标 MOV
13、BH,PAGE1;BH=页号 INT 10H;BIOS功能调用ENDM,宏定义SETCURSOR,设置光标位置,宏指令SETMODE,设置显示模式,SETMODEMACROMODE1MOVAH,0MOVAL,MODE1INT10HENDM,33,将上面文本添加到“YLIB.H”中。这样,以后需要进行“清屏”,设置光标操作时,在程序首部写上:“INCLUDE YLIB.H”,在需要地方写上已经定义的宏指令,就可以实现对应的操作。,34,例7.7在屏幕上建立一个5行38列窗口:(5,10)(10,48),蓝底黄字。显示信息后,按任意键退出。,;EX707.ASM.MODEL SMALLINCLUD
14、EYLIB.H;包含清屏、设置光标宏指令的定义.DATAMESSDB Message In Window$MESS1DB Press Any Key To Exit!$.CODESTART:MOVAX,DATAMOVDS,AX,35,CLS;宏指令,清屏SCROLL5,10,10,48,00011110B;滚屏,在屏幕上建立一个蓝底黄字的小窗口;窗口的左上角坐标(5,10),右下角坐标(10,48)SETCUSOR 0,7,20;设置光标位置,坐标(7,20)LEA DX,MESS;在光标位置显示MESS字符串MOVAH,09HINT21H,36,SETCUSOR 0,9,20;设置光标位置,
15、坐标(9,20)LEA DX,MESS1;光标位置显示MESS1字符串MOVAH,09HINT21H MOVAH,10H;等待键盘输入INT16H;BIOS调用MOVAX,4C00HINT21HEND START,37,;EX708.ASM.MODELSMALLINCLUDEYLIB.H;包含清屏、设置光标位置宏指令的定义.DATAMESSDB H,1EH,E,1EH,L,1EH,L,1EH,O,1EH;字符串由字符及属性(蓝底黄字)组成LENEQU($-MESS)/2MESS1DBP,3CH,r,3CH,e,3CH,s,3CH,s,3CH DB,3CH,A,3CH,n,3CH,y,3CH,3
16、CHDBK,3CH,e,3CH,y,3CH;字符串由字符及属性(绿底红字)组成LEN1EQU($-MESS1)/2,例7.8 题意同例7.7,字符串显示由BIOS功能调用AH=13H完成,38,.CODESTART:MOVAX,DATAMOVDS,AXMOVES,AX CLS;宏指令,清屏SCROLL5,10,10,48,00011110B;宏指令,清屏,建立一个窗口LEABP,MESS;ES:BP=字符串首地址MOVAH,13H;AH=13H,显示字符串MOVAL,3;AL=3,光标跟随移动MOVDX,0714H;起始行号7,列号20MOVBH,0;页号0MOVCX,LEN;CX=串长度IN
17、T 10H;BIOS调用,显示字符串MESS,39,MOVAH,13H;MOVAL,3MOVDX,0914H;起始行号9,列号20MOVBH,0MOVCX,LEN1LEA BP,MESS1INT10H;显示字符串MESS1MOVAH,10H;等待键盘输入INT16HMOVAX,4C00HINT21HENDSTART,40,7.3 图形显示程序设计,7.3.1 图形显示模式 7.3.2 用BIOS功能调用设计图形显示程序7.3.3 图形方式下的显存组织 7.3.4 动画程序设计,41,图形方式下,显示屏幕由若干行和列的像素点组成。可以通过写各个像素点,在屏幕上显示出各种各样的图形。使用汇编语言进
18、行图形显示的程序设计,能够发挥汇编语言程序接近底层硬件、运行速度快的优势,产生高品质的动态画面效果。,42,7.3.1图形显示模式,进行图形程序设计时,应选择适当的显示模式。设置图形显示模式的方法:AL模式号,AH=00H,INT 10H。,43,7.3.2 用BIOS功能调用设计图形显示程序,AH=0CH,写像素入口参数:AL=像素值,BH=显示页 CX=X坐标,DX=Y坐标返回参数:无AH=0DH,读像素入口参数:BH=显示页,CX=X坐标,DX=Y坐标返回参数:AL=像素值,INT 10H提供了图形方式下的读像素和写像素的两项功能。,44,WRITE_PIXEL MACRO PAGE1,
19、ROW,COLUMN,COLORMOVAH,0CH;写像素功能MOVAL,COLOR;颜色MOVBH,PAGE1;页号 MOVDX,ROW;行坐标MOVCX,COLUMN;列坐标INT10H;写像素ENDM,写像素宏指令WRITE_PIXEL,45,READ_PIXELMACROPAGE1,ROW,COLUMNMOVAH,0DH;读像素功能MOVBH,PAGE1;页号 MOVDX,ROW;行坐标MOVCX,COLUMN;列坐标INT10H;读像素ENDM,读像素宏指令READ_PIXEL,46,;EX709.ASM.MODEL SMALLINCLUDEYLIB.H;头文件,包括读、写像素的;宏
20、指令定义.DATAOLDMODEDB?XDW100YDW 100COLORDB5;16色可查表72LEN EQU 100;直线的长度(像素点数),例7.9在屏幕上绘制一条直线。,47,.CODESTART:MOVAX,DATAMOVDS,AXMOVAH,0FH;读当前显示模式并保存INT10HMOVOLDMODE,ALSETMODE12H;设置当前显示模式为12HMOVCX,LENMOVDX,Y,48,L1:PUSHCXWRITE_PIXEL 0,Y,X,COLOR;写像素功能,红色INCX;X坐标加1,准备画下一点POPCXLOOPL1MOVAH,0INT16H;等待键盘输入 MOVAH,0
21、MOVAL,OLDMODE;恢复原来的显示模式INT10H MOVAH,4CH INT21HENDSTART,49,;EX710.ASMINCLUDEYLIB.HDATA SEGMENTROW DW10;矩形块左上角的行COLUMN DW10;矩形块左上角的列COLOR DB1;矩形块的颜色OLDMODEDB?;原来的显示模式DATA ENDS,例7.10 用三种颜色各显示一个矩形块,每按一次键出现 一个彩色矩形。,50,CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;主程序MOVDS,AXMOVAH,0FH;读当前显示模式 INT10HMOV
22、OLDMODE,AL;保存当前显示模式SETMODE 0DH;设置320200彩色图形方式MOVCX,4,51,L1:CALLDISP_RECT;显示一个矩形 MOVAH,0 INT16H;等待键盘输入 INCCOLOR;循环一次,点的颜色加1 ADDCOLUMN,40;产生下一个方块的显示位置 LOOPL1SETMODE OLDMODE;恢复原来的显示模式 MOVAX,4C00H INT21H;返回DOS,52,;显示矩形块的子程序,矩形块的显示位置由 DATA段中的ROW、COLUMN变量指定;颜色由COLOR变量指定,矩形块的大小是固定的:20个点宽,100个点高。,53,DISP_RE
23、CT PROCNEAR PUSHCX;保护现场 MOVAH,0CH;“写像素”功能号 MOVAL,COLOR;取点的颜色 MOVDI,100;行循环计数器置初值:100 MOVDX,ROW;取点的行坐标DISP_2:MOVSI,20;列循环计数器置初值:20 MOVCX,COLUMN;取显示点的列坐标,54,DISP_1:INT10H;写一个像素(显示一个点)INCCX;列坐标加1(行不变)DECSI JNZDISP_1;列循环控制 INCDX;行坐标加1 DECDI JNZDISP_2;行循环控制 POPCX;恢复现场 RETDISP_RECT ENDPCODEENDS ENDSTART,5
24、5,7.3.3 图形方式下的显存组织,VGA显示工作在模式12H时,分辨率640480,每个像素由4位二进制表示,可显示16种颜色。VGA显卡上的256KB显存,被划分成4个64KB的“位平面”,4个位平面共用A0000HAFFFFH共64KB的系统地址空间。每个位平面上的一位二进制,表示一个像素的一个颜色分量,4个位平面上相同位置上的4位二进制合在一起,表示屏幕上的某个像素点的颜色。4个位平面中的每个字节表示8个相邻的水平像素的一个颜色分量。在屏幕上要画出一个像素点,就要将像素的4位颜色值分别写入显示缓冲区的4个位平面。,56,如果屏幕上像素的位置为(X,Y),则该像素在显存位平面中字节地址
25、的计算公式:字节地址A0000H+Y(6408)X MOD 8(屏幕有640列,每字节是8位)。确定了像素的字节地址后,还需确定该像素在字节中的位。例如,某像素的坐标为(20,20),X除以8余4,这个4就是这个像素在字节中的“位号”。,57,如果我们将图形数据直接送到显示缓冲区,这些内容会立即显示在屏幕上,达到最快的图形输出速度。这种方法称为“内存图形映射”,或“直接写屏”。图形方式下的直接写屏较之文本方式下的“直接写屏”要复杂一些,在使用MOV指令将像素信息写入显存之前,需要首先设置VGA接口内的“图形控制寄存器”。,58,7.3.4 动画程序设计,屏幕上的动画能够产生生动的效果,因而受到
26、普遍的欢迎。所谓动画,就是在不同的时间坐标上,显示不相同、但是其内容又具有连续性的画面(称为“帧”)。制作动画,首先需要制作一幅画的“原稿”,将这幅画显示在屏幕上,然后对这幅画进行移动、旋转和变换。例如,在连续递增的X坐标上不断重画图像,就得到屏幕上的物体从左向右水平地移动的效果。,59,1.在打算显示图像的区域上,进行“读像素”的操作,保存原图像信息 2.在这个区域上,通过“写像素”操作,画出需要显示的图像 3.延时 4.通过“写像素”操作,重画保存的原图像信息(恢复)5.修改将要显示图像的区域的坐标值,显示动画的一般过程:,60,例7.11 下面是一辆小车在屏幕上水平开过的程序,小车的图形
27、由字符组成。在图形方式下显示字符,也能产生一定的图形效果。;EX711.ASM.MODELSMALLINCLUDEYLIB.HMODEDB?;DRAW子程序工作模式,;=0时擦除,61,.DATACHAR_CNTLABELWORDCARDW 7;小车图形由7个字符组成 DB0,0,52H,7,0,1,0B1H,7;每个字符的信息需要4个字节DB0,1,0DBH,7,0,1,0DBH,7;第一、二字节为字符坐标位移量DB1,0,4FH,12,0,-2,4FH,12;第三、四字节为字符ASC码和属性DB-2,0,2,7ROWDB?;小车起始行坐标COLUMNDB?;小车起始列坐标,62,.CODE
28、START:MOVAX,DATA;装载DS MOVDS,AX MOVROW,5;设置小车开始位置:第5行,第0列 MOVCOLUMN,0 CALL MOVE_SHAPE;显示汽车动画SETMODE2;恢复屏幕文本显示方式 MOV AX,4C00H INT21H,63,MOVE_SHAPEPROCNEARSETMODE0DH;设置显示方式(320200彩色),自动清屏PLOT:MOVMODE,1;设置DRAW子程序工作模式CALLDRAW;画出这辆小车CALLDELAY;延时CMPCOLUMN,75;下一个位置还能画小车?JAEXIT;不能再画,返回MOVMODE,0;设置DRAW子程序工作模式
29、:擦除CALLDRAW;重新“画”这辆小车(擦除)INCCOLUMN;小车显示完毕,修改起始位置JMPPLOT;在新的位置上画出小车EXIT:RETMOVE_SHAPEENDP,64,DRAWPROCNEARMOVDH,ROW;开始画小车,小车起始位置坐标;装入DH,DLMOVDL,COLUMNMOVCX,CHAR_CNT;小车图形使用的字符个数LEADI,CAR+2;小车图形使用的字符信息区指针ONE:ADDDH,DI+0;计算本字符显示位置ADDDL,DI+1MOVAH,2 INT10H;设置光标位置MOVAL,DI+2;取字符ASC代码MOVBL,DI+3;取字符属性CMPMODE,0;
30、判模式JNESKIP;模式非0,跳过MOVBL,0;模式为0,设字符为黑底黑字,擦除该字符,65,SKIP:PUSHCXMOVCX,1MOVAH,09H;在光标位置显示字符;重复1次INT10HPOPCXADDDI,4;修改指针,指向下一个字符LOOPONE;显示下一个字符RETDRAWENDP,66,DELAYPROCNEAR;延时子程序 MOVDX,1000HDL1:MOVCX,0LOOP$DECDX JNZDL1 RETDELAYENDPENDSTART,67,例7.12 设计一只小狗在屏幕上奔跑的动画程序。在这个程序中,绘图通过调用BIOS的读写像素的功能完成。工作过程:先读出下一帧图
31、形位置的背景像素,存放到缓冲区中,然后写图形的像素,延时后,把背景像素写回屏幕,再重复前面的过程。,68,.MODEL SMALL.386.DATABACKDD 42 DUP(?);背景像素缓存区;以下是小狗的五个动作的图形数据DOG1DDXDW 50;起始坐标为(50,0)Y DW 0COUNT1DW32;图形每行有32点像素COUNT2DW21;图形有21行COUNT3DB 5;图形共有5帧COUNT4DW 20;背景由20组黑白相间的竖条组成COUNT5DW200;整个屏幕由200行像素组成COUNT6DW2;小狗图像的每个像素重复显示2次,;横向拉伸图形OLDMODEDB?;原来的显示
32、模式,69,.CODESTART:MOV AX,DATAMOVDS,AX MOVAH,0FHINT10HMOVOLDMODE,AL;保存原来的显示模式MOVAH,0 MOVAL,6HINT 10H;设置图形显示模式,同时清屏CALLDRAWL;画初始“背景”;(20组黑白相间的竖条)CALLGETBACK;读背景像素LEADI,DOG1;设置图形数据指针,70,FRAME:CALLDRAWDOG;画1帧小狗图形 CALLDELAY;延时 MOVAH,1INT16H;读键盘输入JNZEXIT;按任意键退出PUSHDI;保存小狗数据指针LEADI,BACK;写回背景图像 CALLDRAWBACKA
33、DDY,4;列坐标加4(向右运动)CALLGETBACK;读下一块背景像素POPDI;恢复小狗数据指针DECCOUNT3;小狗图形帧计数JNZFRAME;5帧未结束,继续显示下一帧,71,MOV COUNT3,5;5帧结束,恢复计数器LEADI,DOG1;5帧结束,恢复数据指针JMPFRAMEEXIT:MOVAL,OLDMODE;恢复原来的显示模式MOVAH,0INT10H MOV AX,4C00H;返回DOSINT 21H,72,DRAWL PROC NEAR;画屏幕背景(20组黑白相间的竖条)MOVBL,16;每条宽16个像素MOVBH,0;第0页MOVDX,0;起始坐标为(0,0)MOV
34、CX,0DRL:MOVAL,0;写像素BIOS调用MOVAH,0CHINT10HINCCX;列坐标加1DECBL;判16个点是否画完?JNEDRL;未完,继续,73,MOVBL,16;16点画完,重新置计数值DRL1:MOVAL,1;改变像素值,准备画下一条竖条纹INT10HINCCX;列坐标加1DECBLJNEDRL1DECCOUNT4;20对黑白条画完否?MOVBL,16JNEDRL;未完,继续MOVCOUNT4,20;完,重新置计数值MOVCX,0;列坐标清0,重新从第0列开始画INCDX;行坐标加1DECCOUNT5;200行画完否?JNEDRL;未完,继续RET;完成,返回DRAWL
35、ENDP,74,GETBACK PROC NEARPUSHAX PUSHBXPUSHCXPUSHDXPUSHSIPUSHCOUNT1PUSHCOUNT2PUSHCOUNT6LEASI,BACK,75,GETB:MOVBH,0MOVCX,YMOVDX,XGETB1:MOV AH,0DH;读像素 INT10H SHR AX,1;AL的最低位为像素值,右移入CFGETB2:RCLDWORD PTRSI,1;CF左移移入像素双字单元 INCCX;列坐标加1 DEC COUNT1;判断是否已经读了一行像素值JNEGETB1;否,继续,76,GETB:MOVBH,0MOVCX,YMOVDX,XGETB1:
36、MOVAH,0DH;读像素INT10HSHRAX,1;AL的最低位为像素值,右移入CFGETB2:RCLDWORD PTRSI,1;CF左移移入像素双字单元INCCX;列坐标加1DEC COUNT1;判断是否已经读了;一行像素值JNEGETB1;否,继续,77,MOVCOUNT1,32;重置计数器ADDSI,4;修改像素指针DECCOUNT6;每行2个32位像素显示完?JNZGETB1;没有,继续MOVCOUNT6,2;重置计数器MOVCX,Y;列坐标回到起始处INCDX;行坐标加1DECCOUNT2;判一帧像素读完否?JNEGETB1;否,继续,78,POPCOUNT6;恢复现场POPCOU
37、NT2POPCOUNT1POPSIPOPDXPOPCXPOPBXPOPAXRET;返回主程序GETBACK ENDP,79,DRAWBACKPROC NEAR;恢复背景子程序,背景区大小6421 PUSH CX;保护现场 PUSHCOUNT1 PUSHCOUNT2PUSH COUNT6MOVBH,0;页号MOVCX,Y;Y坐标MOVDX,X;X坐标LEADI,BACK;背景数据缓冲区首地址,80,DRAWB:MOVESI,DI;取出一个背景;数据(32位)DRAWB1:MOVAL,0;像素初值0ROLESI,1;分离出一位像素值ADCAL,0;形成一个像素的值DRAWB2:MOVAH,0CH;
38、写像素INT 10H INCCX;修改列坐标DEC COUNT1;列数减1JNZ DRAWB1;一行没完成,继续,81,MOVCOUNT1,32;重新置列数计数器ADDDI,4;修改背景数据指针DECCOUNT6;每行有2个32位像素,即64个点JNZDRAWBMOVCOUNT6,2MOVCX,Y;列坐标回到起始处INCDX;行坐标加1DECCOUNT2;完成一帧图像否?,82,JNEDRAWB;未完成,继续POPCOUNT6;恢复现场 POPCOUNT2POPCOUNT1POP CXRETDRAWBACKENDP,83,DRAWDOGPROC NEARPUSHCX;保护现场PUSHDXPUS
39、HCOUNT1PUSHCOUNT2MOVBH,0MOVCX,Y;设置像素坐标MOVDX,X,84,DRAWD:MOVESI,DI;取小狗图像数据(32位)DRAWD1:MOVAL,0ROLESI,1;取一位像素值ADCAL,0;形成一个点像素值DRAWD3:MOVAH,0CH;写像素INT 10HINCCXINT10H;一个像素值显示2点,85,INCCX;修改列坐标DEC COUNT1;列数减1JNZ DRAWD1;一行没完成,继续MOVCOUNT1,32;重新置列数计数器MOVCX,Y;列坐标回到起始处INCDX;行坐标加1ADDDI,4;修改指针DECCOUNT2;完成一帧图像否?JNZ
40、DRAWD;未完成,继续POPCOUNT2;恢复现场 POPCOUNT1POPDXPOP CXRETDRAWDOGENDP,86,DELAY PROC NEAR;延时子程序PUSHCXPUSHDXMOVDX,800HDLY:MOVCX,0LOOP$DECDXJNZDLYPOPDXPOPCXRETDELAYENDPEND START,87,习题七,7.1 宏指令与子程序有什么不同之处?7.2 设有一个宏定义如下:DISPMACROSTRINGLEADX,STRINGMOVAH,09HINT21HENDM该宏的功能是什么?参数STRING应是什么类型数据?,88,7.3 下面是一个软件延时DELA
41、Y的宏定义,请判断宏是否正确,如果不正确,请改正。DELAYMACROTIMERPUSHAMOVDX,TIMERD1:MOVCX,0LOOP$DECDXJNZD1POPAENDM,89,7.4 调用一个宏,将一个0F的ASCII码转换成16进制数,并利用这个宏,将内存中BUF开始的10个十六进制数字的ASCII码转换为对应的16进制数存回BUF原来位置。7.5 在2580的文本显示方式下,屏幕上第8行第20列字符所对应的显存地址是多少?7.6 在屏幕中央建立一个30行40列的窗口,以蓝色为背景,在窗口显示”GOOD DONE!”7.7 INT 10H 的哪个功能能在屏幕上显示一个像素点?7.8 在使用INT 10H绘制像素点时,在AL,BH,CX和DX寄存器中需要放置什么值?7.9 写汇编语言将显示模式设置为模式12H。7.10 在屏幕上用BIOS调用,以图形方式画一个正方形,4条边的颜色不一样,