版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 12 27.1 7.1 宏指令宏指令 7.27.2 字符方式显示程序设计字符方式显示程序设计 7.37.3 图形显示程序设计图形显示程序设计 习题七习题七3 3 键盘与显示器是重要的人机对话界面。显示器通过显示适键盘与显示器是重要的人机对话界面。显示器通过显示适配器(配器(Video Adapter,也称显卡)与,也称显卡)与PC机相连,显卡是计算机相连,显卡是计算机和显示器的接口。机和显示器的接口。显卡的两种工作方式v字符方式也称文本方式,在这种方式下,屏幕只能显示字也称文本方式,在这种方式下,屏幕只能显示字符及其属性(颜色,亮度等),屏幕被分成若干行和列,最符及其属性(颜色,亮度等),
2、屏幕被分成若干行和列,最常见的是常见的是80列列25行。行。v图形方式下的屏幕由一个个像素(下的屏幕由一个个像素(Pixel)组成,例如,标)组成,例如,标准准VGA格式的屏幕由格式的屏幕由480行,每行行,每行640个像素组成。通过读写个像素组成。通过读写屏幕上各个像素(点),可以显示出各种单色和彩色的图形。屏幕上各个像素(点),可以显示出各种单色和彩色的图形。4 47.1.17.1.1 宏指令的定义宏指令的定义 7.1.27.1.2 宏指令的使用宏指令的使用 5 5 一组指令一组指令/伪指令,用来完成某项功能。伪指令,用来完成某项功能。 宏指令使用之前,需要为这一组指令起一个名字,称为宏指
3、令使用之前,需要为这一组指令起一个名字,称为“定义定义”,此后就可以在程序中多次使用。,此后就可以在程序中多次使用。 可以将宏指令的定义存放在一个文件中,建立可以将宏指令的定义存放在一个文件中,建立宏指令库宏指令库,好像高级语言的库函数,使用时用好像高级语言的库函数,使用时用INCLUDE伪指令将这个伪指令将这个库插入源程序。库插入源程序。宏指令6 6 宏指令实际上就代表了它对应的一组指令。对程序中出现宏指令实际上就代表了它对应的一组指令。对程序中出现的宏指令进行汇编时,这条宏指令被它对应的一组指令所的宏指令进行汇编时,这条宏指令被它对应的一组指令所代替。如果程序中多次使用宏指令,就等于多次重
4、复拷贝代替。如果程序中多次使用宏指令,就等于多次重复拷贝了这个指令组,占用的内存随之增加。了这个指令组,占用的内存随之增加。 调用子程序通过执行调用子程序通过执行CALL指令实现,存在从指令实现,存在从“主程序主程序”与与“子程序子程序”之间的两次控制转移。使用宏指令不存在控制之间的两次控制转移。使用宏指令不存在控制转移的过程。转移的过程。 使用子程序和宏指令都可以提高编程效率。子程序占用固使用子程序和宏指令都可以提高编程效率。子程序占用固定大小的存储空间,被主程序调用时,空间不会随调用次定大小的存储空间,被主程序调用时,空间不会随调用次数而增加。但是,宏指令占用存储空间会随着使用次数的数而增
5、加。但是,宏指令占用存储空间会随着使用次数的增加而增加。增加而增加。宏指令和子程序的区别:宏指令和子程序的区别: 7 77.1.1 宏指令的定义宏指令的定义 形式参数表中的参数可以为形式参数表中的参数可以为“空空”(没有),也可以(没有),也可以有多个,用逗号分隔。有多个,用逗号分隔。 宏体由指令、伪指令和前面已经定义的宏指令组成。宏体由指令、伪指令和前面已经定义的宏指令组成。 宏指令名宏指令名MACRO形式参数表形式参数表 ;宏体(指令组);宏体(指令组)ENDM 8 8CRLFMACROMOVDL, 0AHINT21HMOVDL, 0DHINT21HENDM例例7.1 定义一个宏,输出换行
6、回车符。定义一个宏,输出换行回车符。9 9SUM2MACROX, YMOVAX, XADDAX, YENDMSUM3MACROA, B, CSUM2A, BADDAX, CENDM 例例7-2 可以用已经定义的宏指令来定义另一个宏指令,也可以用已经定义的宏指令来定义另一个宏指令,也 就是说,宏指令可以嵌套定义。就是说,宏指令可以嵌套定义。1010MAXMACROX, Y, ZLOCALL1MOVAX, XCMPAX, YJGEL1MOVAX, YL1:MOVZ, AXENDM 例例7.3 定义一个宏,求两个带符号数中的较大者。定义一个宏,求两个带符号数中的较大者。11117.1.2 宏指令的使
7、用宏指令的使用 .MODEL SMALL.CODESTART:MOVCX, 10MOVBL, 0AGAIN:MOVDL, BLMOVAH, 02HINT21HCRLFINCBLLOOP AGAINMOVAH, 4CHINT 21HEND STARTCRLFMACROMOVDL, 0AHMOVAH, 02HINT21HMOVAH, 02HMOVDL, 0DHINT 21HENDM例例7.4 在屏幕上输出在屏幕上输出09十个字符,每个字符占一行。十个字符,每个字符占一行。1212 . MODEL SMALL. DATABUFDW 90, 90, 234; 3个数个数BIGDW ?; 存放最大数的单
8、元存放最大数的单元MESSDB0DH, 0AH, The Max Is: $宏指令的展开宏指令的展开 例例7.5 利用例利用例7.3定义的宏指令,求定义的宏指令,求3个带符号数中最大的数个带符号数中最大的数 并显示。并显示。1313. CODESTART:MOVAX, DATAMOVDS, AXMAXBUF, BUF+2, BIG; 求前两个数中的较求前两个数中的较;大者,存入大者,存入BIGMAXBUF+4, BIG, BIG; 求第三个数与求第三个数与BIG中的中的;较大者,存入较大者,存入BIGLEADX, MESSMOVAX, BIGCALLWRITEINT; 输出结果输出结果MOVA
9、X, 4C00HINT21H; 返回操作系统返回操作系统ENDSTART1414在在MAX宏指令定义中,出现了标号宏指令定义中,出现了标号L1。该指令被二次。该指令被二次调用。这样,在目标代码中会出现二个调用。这样,在目标代码中会出现二个L1标号,也就是说,标号,也就是说,在同一个源程序中出现两个同名标号。在同一个源程序中出现两个同名标号。为了避免这个错误,宏定义中使用为了避免这个错误,宏定义中使用LOCAL局部标号定局部标号定义伪指令义伪指令把把L1定义为定义为“局部标号局部标号”。宏展开时,汇编程序对局部标号进行换名处理,宏展开时,汇编程序对局部标号进行换名处理,用用?0000、?0001
10、依次代替各个宏展开中的标号。依次代替各个宏展开中的标号。注意注意,LOCAL伪指令应紧接伪指令应紧接MACRO语句之后,两句之间语句之后,两句之间不得有其他语句。不得有其他语句。 15157.2.17.2.1 文本显示模式和字符属性文本显示模式和字符属性7.2.2 7.2.2 直接写屏输出直接写屏输出 7.2.3 BIOS7.2.3 BIOS显示功能调用显示功能调用 16167.2.1 文本显示模式和字符属性文本显示模式和字符属性 BIOS的显示功能调用的显示功能调用INT 10H的的0号功能用于设定显示模式。号功能用于设定显示模式。MOVAH, 0MOVAL, 显示模式号显示模式号INT10
11、H;无返回参数。无返回参数。1.1. 显示模式显示模式 1717显示模式显示模式分辨率分辨率颜色颜色显示方式显示方式040列列25行行16级灰色级灰色黑白文本黑白文本140列列25行行16色色彩色文本彩色文本280列列25行行16级灰色级灰色黑白文本黑白文本380列列25行行16色色彩色文本彩色文本780列列25行行单色单色黑白文本黑白文本18182. 字符属性字符属性 BL R G B I R G B背景色前景色闪烁IRGB色彩色彩IRGB色彩色彩0000黑黑1000灰灰0001蓝蓝1001浅蓝浅蓝0010绿绿1010浅绿浅绿0011青青1011浅青浅青0100红红1100浅红浅红0101洋
12、红洋红1101浅洋红浅洋红0110棕棕1110黄黄0111浅灰浅灰1111白白19197.2.2 直接写屏输出直接写屏输出 显存显存(VRAM) 用来存放需要在显示器上显示的文本、图形信息用来存放需要在显示器上显示的文本、图形信息 的内存区域。的内存区域。屏幕上每个坐标位置上的字符或图形信息与显存中某些单元屏幕上每个坐标位置上的字符或图形信息与显存中某些单元的内容一一对应。的内容一一对应。2020 使用使用MOV指令将数据送到显存的某个单元时,在屏幕的对指令将数据送到显存的某个单元时,在屏幕的对应位置上就会立即显示出相应的字符或图形。应位置上就会立即显示出相应的字符或图形。 在字符显示模式下,
13、显存从在字符显示模式下,显存从B800H: 0000H开始,每个字符开始,每个字符用两个字节来表示:第一个字节为显示字符的用两个字节来表示:第一个字节为显示字符的ASCII码,码,第二个字节是字符的显示属性。第二个字节是字符的显示属性。 以以25行行80列的字符显示方式为例,一个屏幕可显示列的字符显示方式为例,一个屏幕可显示2000个字符,需要约个字符,需要约4KB的显示存储器,称为一页。的显示存储器,称为一页。 屏幕上某个坐标位置对应显存中的偏移地址屏幕上某个坐标位置对应显存中的偏移地址:=页起始偏移地址2(字符行坐标每行列数列坐标)直接写屏方式直接写屏方式 2121DATASEGMENTB
14、UFDW2000 DUP(?);保存显存信息的缓冲区;保存显存信息的缓冲区MESSDB Press Any Key to Review the Screen ! ;显示的信息显示的信息LENEQU$ -MESSDATAENDS例例7.6 清屏并输出字符串,按任意键后,恢复清屏前屏幕内容。清屏并输出字符串,按任意键后,恢复清屏前屏幕内容。2222CODESEGMENT ASSUMECS: CODE, DS: DATASTART: MOVAX, DATA MOVDS, AXMOVAX, 0B800HMOVES, AX;ES为显示缓冲区段地址为显示缓冲区段地址MOVCX, 2000;2000个字符个
15、字符MOVSI, 0LEADI, BUF;存放显存信息的缓冲区;存放显存信息的缓冲区; 首地址送首地址送DI2323NEXT:MOVAX, ES:SI;将显存中的内容全部读入到;将显存中的内容全部读入到BUFMOVDI, AXADDSI, 2ADDDI, 2LOOPNEXTMOVDI, 0;显存首地址送;显存首地址送DIMOVCX, 2000;屏幕上;屏幕上2000个字符都写成空格,即清屏个字符都写成空格,即清屏MOVAX, 0720H; 20H是空格的是空格的ASCII代码,代码,07H是显示属性是显示属性CLD; 设置串操作指针递增设置串操作指针递增REPSTOSW;将;将AX内容送显存,
16、共内容送显存,共2000次,实现清屏次,实现清屏2424MOVDX, 050AH; 屏幕坐标(屏幕坐标(5,10)CALLCALADDR;计算屏幕坐标(;计算屏幕坐标(5,10)在显存中的偏移地址)在显存中的偏移地址LEASI, MESS;要显示的字符串首地址送;要显示的字符串首地址送SIMOVCX, LEN; 字符串长度送字符串长度送CXMOVAH, 1EH;显示属性送入;显示属性送入AHNEXT2:MOVAL, SI; 字符字符ASCII码送码送ALSTOSW ; 字符字符ASCII码及其属性送码及其属性送; 显存的相应位置显存的相应位置INCSI ; 修改字符串指针修改字符串指针LOOP
17、 NEXT2;循环;循环LEN次次MOVAH, 10H;等待键盘输入;等待键盘输入INT16H2525;以下程序将;以下程序将BUF中的内容恢复到中的内容恢复到B800:0000H开始的开始的; 4000个字节中,恢复原先的屏幕个字节中,恢复原先的屏幕 MOVCX, 2000 LEASI, BUFMOVDI, 0REPMOVSWMOVAX, 4C00HINT21H 2626;计算偏移地址子程序:入口参数;计算偏移地址子程序:入口参数 DH=行数,行数,DL列数列数 ;返回参数;返回参数 DI=偏移地址偏移地址CALADDRPROC NEARPUSHAXMOVAL, 80;总列数为;总列数为80
18、列列MULDH XORDH, DH ADDAX, DX SHLAX, 1MOVDI, AX ;DI2(字符行坐标(字符行坐标总列数列坐标)总列数列坐标) POPAXRETCALADDRENDPCODEENDSEND START 27277.2.37.2.3 BIOS BIOS显示功能调用显示功能调用(INT 10H)(INT 10H) AH功能功能入口参数入口参数出口参数出口参数0设置显示模式设置显示模式AL=显示模式号显示模式号无返回参数无返回参数1设置光标类型设置光标类型(CH)4=0, 光标显示,光标显示,(CH)0-3=光标起始光标起始线线(CL)0-3=光标结束线,光标结束线,(CH
19、)4=1, 光标不显光标不显示示无无2设置光标位置设置光标位置BH=页号,页号,DH=光标的行号,光标的行号,DL=光标的列号光标的列号无无28283读光标位置读光标位置BH=页号(显示的当前页号)页号(显示的当前页号)CH=光标光标起始线起始线,CL=光标光标结束线结束线DH=光标光标当前行号当前行号DL=光标光标当前列号当前列号5选择当前显选择当前显示页示页AL=选择的页号选择的页号无无6屏幕初始化屏幕初始化或向上滚动或向上滚动AL=要滚动的行数,要滚动的行数,AL=0, 全屏全屏滚动(清屏)滚动(清屏)CH, CL=窗口左上角行号,列号窗口左上角行号,列号DH, DL=右下角行号右下角行
20、号, 列号列号BH=滚入行属性滚入行属性无无29297屏幕初始化或屏幕初始化或向下滚动向下滚动AL=要滚动的行数,要滚动的行数,AL=0, 全屏滚全屏滚动(清屏)动(清屏)CH=滚动窗口左上角行号,滚动窗口左上角行号,CL=滚滚动窗口左上角列号动窗口左上角列号DH=滚动窗口右下角行号,滚动窗口右下角行号,DL=滚滚动窗口右下角列号动窗口右下角列号BH=滚入行属性滚入行属性无无8读光标位置的读光标位置的属性和字符属性和字符BH=显示页显示页AH=光标光标属性属性AL=光标光标位置字符位置字符9在光标位置显在光标位置显示字符及属性示字符及属性BH=显示页,显示页,BL=字符属性字符属性AL=待显示
21、字符的待显示字符的ASCII码码CX=字符重复次数(只显示一个字字符重复次数(只显示一个字符,则符,则CX=1)无无30300AH在光标位置只显在光标位置只显示字符示字符BH=显示页显示页AL=待显示字符的待显示字符的ASCII码码CX=字符重复次数字符重复次数无无0EH显示字符且光标显示字符且光标自动前移自动前移AL=待显示字符的待显示字符的ASCII码,码,BL=前景色前景色无无0FH获取当前的显示获取当前的显示模式模式无无AL=当前显当前显示模式号示模式号AH=当前显当前显示模式每行的列示模式每行的列数数BH=当前显当前显示页号示页号13H显示字符串显示字符串ES: BP=字符串首地址字
22、符串首地址, CX=串长度,串长度,BH=显示页号显示页号,DH, DL起始行号,列号起始行号,列号AL=0, BL=属性,光标保持在原处,串由属性,光标保持在原处,串由字符组成,仅显示字符字符组成,仅显示字符AL=1, BL=属性,光标到串尾,串由字符属性,光标到串尾,串由字符组成,仅显示字符组成,仅显示字符AL=2, 光标保持在原处,串由字符及属性光标保持在原处,串由字符及属性组成组成AL=3, 光标到串尾,串由字符及属性组成光标到串尾,串由字符及属性组成无无3131SCROLL MACRO TOP,LEFT,BOTTOM,RIGHT,ATTRIB MOVAX, 0600H; 屏幕上卷功能
23、屏幕上卷功能 MOVCH, TOP; 左上角行号左上角行号 MOVCL, LEFT; 左上角列号左上角列号 MOVDH, BOTTOM ; 右下角行号右下角行号 MOVDL, RIGHT; 右下角列号右下角列号 MOVBH, ATTRIB; 卷入行属性卷入行属性 INT10H; 对指定范围屏幕清屏对指定范围屏幕清屏ENDMCLSMACROSCROLL0, 0, 24, 79, 7; 宏嵌套定义宏嵌套定义ENDM宏定义宏定义CLS,清除整个屏幕显示内容,清除整个屏幕显示内容宏定义宏定义SCROLL,清除屏幕内一个区域的显示内容,清除屏幕内一个区域的显示内容3232SETCUSOR MACRO P
24、AGE1, ROW, COLUMN MOVAH, 2;设置光标位置;设置光标位置 MOVDH, ROW;光标行坐标;光标行坐标 MOVDL, COLUMN ;光标列坐标;光标列坐标 MOVBH, PAGE1;BH=页号页号 INT 10H;BIOS功能调用功能调用ENDM宏定义宏定义SETCURSOR,设置光标位置,设置光标位置宏指令宏指令SETMODE,设置显示模式,设置显示模式SETMODE MACROMODE1MOVAH, 0MOVAL, MODE1INT10HENDM3333将上面文本添加到将上面文本添加到“YLIB.H”中。这样,以后需要进行中。这样,以后需要进行“清屏清屏”,设置光
25、标操作时,在程序首部写上,设置光标操作时,在程序首部写上:“INCLUDE YLIB.H”,在需要地方写上已经定义的宏指令,在需要地方写上已经定义的宏指令,就可以实现对应的操作。就可以实现对应的操作。3434例例7.7在屏幕上建立一个在屏幕上建立一个5行行38列窗口列窗口: (5, 10) (10, 48) , 蓝底黄字。显示信息后,按任意键退出。蓝底黄字。显示信息后,按任意键退出。; EX707.ASM. MODEL SMALLINCLUDEYLIB.H ;包含清屏、设置光标宏指令的定义;包含清屏、设置光标宏指令的定义. DATAMESSDB Message In Window $MESS1
26、DB Press Any Key To Exit! $. CODESTART:MOVAX, DATAMOVDS, AX3535CLS;宏指令,清屏;宏指令,清屏SCROLL5, 10, 10, 48, 00011110B ;滚屏,在屏幕上建立一个蓝底黄字的小窗口;滚屏,在屏幕上建立一个蓝底黄字的小窗口;窗口的左上角坐标(;窗口的左上角坐标(5,10),右下角坐标(),右下角坐标(10,48)SETCUSOR 0, 7, 20;设置光标位置,坐标(;设置光标位置,坐标(7,20)LEA DX, MESS;在光标位置显示;在光标位置显示MESS字符串字符串MOVAH, 09HINT21H3636S
27、ETCUSOR 0, 9, 20;设置光标位置,坐标(;设置光标位置,坐标(9,20)LEA DX, MESS1;光标位置显示;光标位置显示MESS1字符串字符串MOVAH, 09HINT21H MOVAH, 10H; 等待键盘输入等待键盘输入INT16H;BIOS调用调用MOVAX, 4C00HINT21HEND START3737; EX708.ASM. MODELSMALLINCLUDEYLIB.H;包含清屏、设置光标位置宏指令的定义;包含清屏、设置光标位置宏指令的定义. DATAMESSDB H,1EH,E,1EH,L,1EH,L,1EH,O,1EH;字符串由字符及属性(蓝底黄字)组成
28、字符串由字符及属性(蓝底黄字)组成LENEQU($-MESS)/2MESS1DBP, 3CH, r, 3CH, e, 3CH, s, 3CH, s, 3CH DB , 3CH, A, 3CH, n, 3CH, y, 3CH, , 3CHDBK, 3CH, e, 3CH, y, 3CH; 字符串由字符及属性(绿底红字)组成字符串由字符及属性(绿底红字)组成LEN1EQU($-MESS1)/2例例7.8 题意同例题意同例7.7,字符串显示由,字符串显示由BIOS功能调用功能调用AH=13H完成完成3838. CODESTART:MOVAX, DATAMOVDS, AXMOVES, AX CLS;宏
29、指令,清屏;宏指令,清屏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=串长度串长度INT 10H; BIOS调用,显示字符串调用,显示字符串MESS3939MOVAH, 13H;MOVAL, 3MOVDX, 0914H;起始行号;起始
30、行号9,列号,列号20MOVBH, 0MOVCX, LEN1LEA BP, MESS1INT10H;显示字符串;显示字符串MESS1MOVAH, 10H;等待键盘输入;等待键盘输入INT16HMOVAX, 4C00HINT21HENDSTART40407.3.1 7.3.1 图形显示模式图形显示模式 7.3.2 7.3.2 用用BIOSBIOS功能调用设计图形显示程序功能调用设计图形显示程序7.3.3 7.3.3 图形方式下的显存组织图形方式下的显存组织 7.3.4 7.3.4 动画程序设计动画程序设计 4141图形方式下,显示屏幕由若干行和列的像素点组成。图形方式下,显示屏幕由若干行和列的像
31、素点组成。可以通过写各个像素点,在屏幕上显示出各种各样的图形。可以通过写各个像素点,在屏幕上显示出各种各样的图形。使用汇编语言进行图形显示的程序设计,能够发挥汇使用汇编语言进行图形显示的程序设计,能够发挥汇编语言程序接近底层硬件、运行速度快的优势,产生高品编语言程序接近底层硬件、运行速度快的优势,产生高品质的动态画面效果。质的动态画面效果。 42427.3.1 图形显示模式图形显示模式 进行图形程序设计时,应选择适当的显示模式。进行图形程序设计时,应选择适当的显示模式。 设置图形显示模式的方法:设置图形显示模式的方法: AL模式号,模式号,AH=00H, INT 10H。 显示模式号显示模式号
32、分辨率分辨率颜色数颜色数适用的显卡适用的显卡0DH32020016EGA VGA0EH64020016EGA VGA0FH6403502EGA VGA10H64035016EGA VGA11H6404802MCGA VGA12H64048016VGA13H320200256MCGA VGA43437.3.2 7.3.2 用用BIOSBIOS功能调用设计图形显示程序功能调用设计图形显示程序 AH=0CH,写像素,写像素入口参数:入口参数:AL=像素值,像素值,BH=显示页显示页 CX=X坐标,坐标,DX=Y坐标坐标返回参数:无返回参数:无AH=0DH,读像素,读像素入口参数:入口参数:BH=显示
33、页,显示页,CX=X坐标,坐标,DX=Y坐标坐标返回参数:返回参数:AL=像素值像素值INT 10H提供了图形方式下的读像素和写像素的两项功能。提供了图形方式下的读像素和写像素的两项功能。4444WRITE_PIXEL MACRO PAGE1, ROW, COLUMN, COLORMOVAH, 0CH;写像素功能;写像素功能MOVAL, COLOR;颜色;颜色MOVBH, PAGE1;页号;页号 MOVDX, ROW;行坐标;行坐标MOVCX, COLUMN;列坐标;列坐标INT10H; 写像素写像素ENDM写像素宏指令写像素宏指令WRITE_PIXEL4545READ_PIXELMACROP
34、AGE1, ROW, COLUMNMOVAH, 0DH;读像素功能;读像素功能MOVBH, PAGE1;页号;页号 MOVDX, ROW;行坐标;行坐标MOVCX, COLUMN;列坐标;列坐标INT10H; 读像素读像素ENDM读像素宏指令读像素宏指令READ_PIXEL4646;EX709.ASM. MODEL SMALLINCLUDEYLIB.H; 头文件,包括读、写像素的宏指令定义头文件,包括读、写像素的宏指令定义. DATAOLDMODE DB?XDW100YDW 100COLORDB5;16色可查表色可查表72LEN EQU 100;直线的长度(像素点数);直线的长度(像素点数)例
35、例7.9 在屏幕上绘制一条直线。在屏幕上绘制一条直线。4747. CODESTART:MOVAX, DATAMOVDS, AXMOVAH, 0FH;读当前显示模式并保存;读当前显示模式并保存INT10HMOVOLDMODE, ALSETMODE12H;设置当前显示模式为;设置当前显示模式为12HMOVCX, LENMOVDX, Y4848L1: PUSHCXWRITE_PIXEL 0, Y, X, COLOR ;写像素功能,红色;写像素功能,红色INCX;X坐标加坐标加1,准备画下一点,准备画下一点POPCXLOOP L1MOVAH, 0INT16H; 等待键盘输入等待键盘输入 MOVAH,
36、0MOVAL, OLDMODE;恢复原来的显示模式;恢复原来的显示模式INT10H MOVAH, 4CH INT21HENDSTART4949; EX710.ASMINCLUDEYLIB.HDATA SEGMENTROW DW10; 矩形块左上角的行矩形块左上角的行COLUMN DW10; 矩形块左上角的列矩形块左上角的列COLOR DB1; 矩形块的颜色矩形块的颜色OLDMODE DB?; 原来的显示模式原来的显示模式DATA ENDS例例7.10 用三种颜色各显示一个矩形块,每按一次键出现用三种颜色各显示一个矩形块,每按一次键出现 一个彩色矩形。一个彩色矩形。5050CODESEGMENT
37、ASSUMECS: CODE, DS: DATASTART: MOVAX, DATA ;主程序;主程序MOVDS, AXMOVAH, 0FH;读当前显示模式;读当前显示模式 INT10HMOVOLDMODE, AL;保存当前显示模式;保存当前显示模式SETMODE 0DH;设置;设置320200彩色图形方式彩色图形方式MOVCX, 45151L1: CALLDISP_RECT;显示一个矩形;显示一个矩形 MOVAH, 0 INT16H;等待键盘输入;等待键盘输入 INCCOLOR ;循环一次,点的颜色加;循环一次,点的颜色加1 ADDCOLUMN, 40;产生下一个方块的显示位置;产生下一个方
38、块的显示位置 LOOP L1SETMODE OLDMODE;恢复原来的显示模式;恢复原来的显示模式 MOVAX, 4C00H INT21H ; 返回返回DOS5252; 显 示 矩 形 块 的 子 程 序 , 矩 形 块 的 显 示 位 置 由显 示 矩 形 块 的 子 程 序 , 矩 形 块 的 显 示 位 置 由 DATA段中的段中的ROW、COLUMN变量指定变量指定; 颜色由颜色由COLOR变量指定,矩形块的大小是固定的变量指定,矩形块的大小是固定的: 20个点宽,个点宽,100个点高。个点高。5353DISP_RECT PROCNEAR PUSH CX; 保护现场保护现场 MOVAH
39、, 0CH ; “写像素写像素”功能号功能号 MOVAL, COLOR ; 取点的颜色取点的颜色 MOVDI, 100 ; 行循环计数器置初值:行循环计数器置初值:100 MOVDX, ROW ; 取点的行坐标取点的行坐标DISP_2: MOVSI, 20 ; 列循环计数器置初值:列循环计数器置初值:20 MOVCX, COLUMN ; 取显示点的列坐标取显示点的列坐标5454DISP_1: INT10H ; 写一个像素(显示一个点)写一个像素(显示一个点) INCCX ; 列坐标加列坐标加1(行不变)(行不变) DECSI JNZDISP_1 ; 列循环控制列循环控制 INCDX ; 行坐标
40、加行坐标加1 DECDI JNZDISP_2 ; 行循环控制行循环控制 POPCX; 恢复现场恢复现场 RETDISP_RECT ENDPCODEENDS ENDSTART55557.3.3 7.3.3 图形方式下的显存组织图形方式下的显存组织 VGA显示工作在模式显示工作在模式12H时,分辨率时,分辨率640480,每个像素,每个像素由由4位二进制表示,可显示位二进制表示,可显示16种颜色。种颜色。VGA显卡上的显卡上的256KB显存,被划分成显存,被划分成4个个64KB的的“位平位平面面”,4个位平面共用个位平面共用A0000HAFFFFH共共64KB的系统地址空的系统地址空间。间。每个位
41、平面上的一位二进制,表示一个像素的一个颜色分每个位平面上的一位二进制,表示一个像素的一个颜色分量,量,4个位平面上相同位置上的个位平面上相同位置上的4位二进制合在一起,表示屏幕位二进制合在一起,表示屏幕上的某个像素点的颜色。上的某个像素点的颜色。4个位平面中的每个字节表示个位平面中的每个字节表示8个相邻的水平像素的一个颜个相邻的水平像素的一个颜色分量。色分量。在屏幕上要画出一个像素点,就要将像素的在屏幕上要画出一个像素点,就要将像素的4位颜色值分位颜色值分别写入显示缓冲区的别写入显示缓冲区的4个位平面。个位平面。 5656如果屏幕上像素的位置为(如果屏幕上像素的位置为(X, Y),则该像素在显
42、存位平),则该像素在显存位平面中字节地址的计算公式:面中字节地址的计算公式:字节地址A0000H+Y(6408)X MOD 8 (屏幕有(屏幕有640列,每字节是列,每字节是8位)。位)。确定了像素的字节地址后,还需确定该像素在字节中的位。确定了像素的字节地址后,还需确定该像素在字节中的位。例如,某像素的坐标为(例如,某像素的坐标为(20,20),),X除以除以8余余4,这个,这个4就是就是这个像素在字节中的这个像素在字节中的“位号位号”。5757如果我们将图形数据直接送到显示缓冲区,这些内容会如果我们将图形数据直接送到显示缓冲区,这些内容会立即显示在屏幕上,达到最快的图形输出速度。这种方法称
43、立即显示在屏幕上,达到最快的图形输出速度。这种方法称为为“内存图形映射内存图形映射”,或,或“直接写屏直接写屏”。图形方式下的直接写屏较之文本方式下的图形方式下的直接写屏较之文本方式下的“直接写屏直接写屏”要复杂一些,在使用要复杂一些,在使用MOV指令将像素信息写入显存之前,需指令将像素信息写入显存之前,需要首先设置要首先设置VGA接口内的接口内的“图形控制寄存器图形控制寄存器”。 58587.3.4 7.3.4 动画程序设计动画程序设计 屏幕上的动画能够产生生动的效果,因而受到普遍的欢迎。屏幕上的动画能够产生生动的效果,因而受到普遍的欢迎。所谓动画,就是在不同的时间坐标上,显示不相同、但是其
44、内所谓动画,就是在不同的时间坐标上,显示不相同、但是其内容又具有连续性的画面(称为容又具有连续性的画面(称为“帧帧”)。)。 制作动画,首先需要制作一幅画的制作动画,首先需要制作一幅画的“原稿原稿”,将这幅画显,将这幅画显示在屏幕上,然后对这幅画进行移动、旋转和变换。示在屏幕上,然后对这幅画进行移动、旋转和变换。例如,在连续递增的例如,在连续递增的X坐标上不断重画图像,就得到屏幕坐标上不断重画图像,就得到屏幕上的物体从左向右水平地移动的效果。上的物体从左向右水平地移动的效果。59591. 在打算显示图像的区域上,进行在打算显示图像的区域上,进行“读像素读像素”的操作,保存原的操作,保存原图像信
45、息图像信息 2. 在这个区域上,通过在这个区域上,通过“写像素写像素”操作,画出需要显示的图像操作,画出需要显示的图像 3. 延时延时 4. 通过通过“写像素写像素”操作,重画保存的原图像信息(恢复)操作,重画保存的原图像信息(恢复) 5. 修改将要显示图像的区域的坐标值修改将要显示图像的区域的坐标值 显示动画的一般过程:6060例例7.11 下面是一辆小车在屏幕上水平开过的程序,小车的图形下面是一辆小车在屏幕上水平开过的程序,小车的图形由字符组成。在图形方式下显示字符,也能产生一定的图形由字符组成。在图形方式下显示字符,也能产生一定的图形效果。效果。; EX711.ASM.MODELSMAL
46、LINCLUDEYLIB.HMODEDB?; DRAW子程序工作模式子程序工作模式;=0时擦除时擦除6161.DATACHAR_CNTLABEL WORDCARDW 7; 小车图形由小车图形由7个字符组成个字符组成 ; 每个字符的信息需要每个字符的信息需要4个字节个字节; 第一、二字节为字符坐标位移量第一、二字节为字符坐标位移量; 第三、四字节为字符第三、四字节为字符ASC码和属性码和属性DB0, 0, 52H, 7 ,0, 1, 0B1H, 7DB0, 1, 0DBH,7 , 0, 1, 0DBH, 7DB1, 0, 4FH, 12 , 0, -2, 4FH, 12DB-2, 0, 2, 7
47、ROWDB?; 小车起始行坐标小车起始行坐标COLUMNDB?; 小车起始列坐标小车起始列坐标6262.CODESTART:MOVAX, DATA; 装载装载DSMOVDS, AXMOVROW, 5 ; 设置小车开始位置:第设置小车开始位置:第5行,第行,第0列列MOVCOLUMN, 0CALLMOVE_SHAPE ; 显示汽车动画显示汽车动画SETMODE2; 恢复屏幕文本显示方式恢复屏幕文本显示方式MOV AX, 4C00HINT21H6363MOVE_SHAPEPROC NEARSETMODE 0DH; 设置显示方式(设置显示方式(320200彩色),自动清屏彩色),自动清屏PLOT:M
48、OVMODE, 1; 设置设置DRAW子程序工作模式子程序工作模式CALLDRAW; 画出这辆小车画出这辆小车CALLDELAY ; 延时延时CMPCOLUMN, 75; 下一个位置还能画小车?下一个位置还能画小车?JAEXIT; 不能再画不能再画, 返回返回MOVMODE, 0; 设置设置DRAW子程序工作模式:子程序工作模式:;擦除擦除CALLDRAW; 重新重新“画画”这辆小车(擦除)这辆小车(擦除)INCCOLUMN; 小车显示完毕,修改起始位置小车显示完毕,修改起始位置JMPPLOT; 在新的位置上画出小车在新的位置上画出小车EXIT:RETMOVE_SHAPEENDP 6464DR
49、AWPROC NEARMOVDH, ROW; 开始画小车,小车起始位置坐标开始画小车,小车起始位置坐标MOVDL, COLUMN ; 装入装入DH, DLMOVCX, CHAR_CNT; 小车图形使用的字符个数小车图形使用的字符个数LEADI, CAR+2; 小车图形使用的字符信息区指针小车图形使用的字符信息区指针ONE:ADDDH, DI+0; 计算本字符显示位置计算本字符显示位置ADDDL, DI+1MOVAH, 2 INT10H; 设置光标位置设置光标位置MOVAL, DI+2; 取字符取字符ASC代码代码MOVBL, DI+3; 取字符属性取字符属性6565CMPMODE, 0; 判模
50、式判模式JNESKIP; 模式非模式非0,跳过,跳过MOVBL, 0;模式为模式为0,设字符为黑底黑字,擦除该字符,设字符为黑底黑字,擦除该字符SKIP:PUSH CXMOVCX, 1MOVAH, 09H; 在光标位置显示字符,重复在光标位置显示字符,重复1次次INT10HPOPCXADDDI, 4; 修改指针修改指针,指向下一个字符指向下一个字符LOOP ONE; 显示下一个字符显示下一个字符RETDRAWENDP6666DELAYPROC NEAR; 延时子程序延时子程序 MOVDX, 1000HDL1:MOVCX, 0LOOP $DECDX JNZDL1 RETDELAYENDPENDS
51、TART 6767例例7.12 设计一只小狗在屏幕上奔跑的动画程序。在这个程序设计一只小狗在屏幕上奔跑的动画程序。在这个程序中,绘图通过调用中,绘图通过调用BIOS的读写像素的功能完成。的读写像素的功能完成。工作过程工作过程:先读出下一帧图形位置的背景像素,存放到缓冲:先读出下一帧图形位置的背景像素,存放到缓冲区中,然后写图形的像素,延时后,把背景像素写回屏幕,区中,然后写图形的像素,延时后,把背景像素写回屏幕,再重复前面的过程。再重复前面的过程。 .MODEL SMALL.386.DATABACKDD 42 DUP(?) ;背景像素缓存区;背景像素缓存区;以下是小狗的五个动作的图形数据;以下
52、是小狗的五个动作的图形数据DOG1DD6868XDW 50;起始坐标为(;起始坐标为(50,0)Y DW 0COUNT1DW32;图形每行有;图形每行有32点像素点像素COUNT2DW21;图形有;图形有21行行COUNT3DB 5;图形共有;图形共有5帧帧COUNT4DW 20;背景由;背景由20组黑白相间的竖条组成组黑白相间的竖条组成COUNT5DW200;整个屏幕由;整个屏幕由200行像素组成行像素组成COUNT6DW2;小狗图像的每个像素重复显示;小狗图像的每个像素重复显示2次,次,; 横向拉伸图形横向拉伸图形OLDMODE DB ?;原来的显示模式;原来的显示模式6969.CODES
53、TART:MOV AX, DATAMOVDS, AX MOVAH, 0FHINT10HMOVOLDMODE, AL;保存原来的显示模式;保存原来的显示模式MOVAH, 0 MOVAL, 6HINT 10H;设置图形显示模式,同时清屏;设置图形显示模式,同时清屏CALLDRAWL;画初始;画初始“背景背景”(20组黑白相间的竖条组黑白相间的竖条)CALLGETBACK; 读背景像素读背景像素LEADI, DOG1;设置图形数据指针;设置图形数据指针7070FRAME:CALLDRAWDOG;画;画1帧小狗图形帧小狗图形 CALL DELAY;延时;延时 MOVAH, 1INT16H;读键盘输入;
54、读键盘输入JNZEXIT;按任意键退出;按任意键退出PUSHDI;保存小狗数据指针;保存小狗数据指针LEADI, BACK;写回背景图像;写回背景图像 CALL DRAWBACKADDY, 4;列坐标加;列坐标加4(向右运动)(向右运动)CALLGETBACK;读下一块背景像素;读下一块背景像素POPDI;恢复小狗数据指针;恢复小狗数据指针DECCOUNT3;小狗图形帧计数;小狗图形帧计数JNZFRAME;5帧未结束,继续显示下一帧帧未结束,继续显示下一帧7171MOV COUNT3, 5;5帧结束,恢复计数器帧结束,恢复计数器LEADI, DOG1;5帧结束,恢复数据指针帧结束,恢复数据指针
55、JMPFRAMEEXIT:MOVAL, OLDMODE;恢复原来的显示模式;恢复原来的显示模式MOVAH, 0INT10HMOV AX, 4C00H;返回;返回DOSINT 21H7272DRAWL PROC NEAR ;画屏幕背景(;画屏幕背景(20组黑白相间的竖条)组黑白相间的竖条)MOVBL, 16; 每条宽每条宽16个像素个像素MOVBH, 0; 第第0页页MOVDX, 0; 起始坐标为起始坐标为(0,0)MOVCX, 0DRL:MOV AL, 0; 写像素写像素BIOS调用调用MOVAH, 0CHINT10HINCCX; 列坐标加列坐标加1DECBL; 判判16个点是否画完个点是否画
56、完?JNEDRL; 未完未完,继续继续7373MOVBL, 16; 16点画完点画完,重新置计数值重新置计数值DRL1:MOV AL, 1; 改变像素值改变像素值,准备画下一条竖条纹准备画下一条竖条纹INT10HINCCX; 列坐标加列坐标加1DECBLJNEDRL1DECCOUNT4; 20对黑白条画完否对黑白条画完否?MOVBL, 16JNEDRL; 未完未完, 继续继续MOVCOUNT4, 20; 完完, 重新置计数值重新置计数值MOVCX, 0; 列坐标清列坐标清0,重新从第重新从第0列开始画列开始画INCDX; 行坐标加行坐标加1DECCOUNT5; 200行画完否行画完否?JNED
57、RL; 未完未完, 继续继续RET; 完成完成, 返回返回DRAWLENDP7474GETBACK PROC NEARPUSHAX PUSHBXPUSHCXPUSHDXPUSHSIPUSHCOUNT1PUSHCOUNT2PUSHCOUNT6LEASI, BACK7575GETB:MOV BH, 0MOVCX, YMOVDX, XGETB1:MOV AH, 0DH;读像素;读像素INT10HSHRAX, 1;AL的最低位为像素值,右移入的最低位为像素值,右移入CFGETB2:RCL DWORD PTRSI, 1;CF左移移入像素双字单元左移移入像素双字单元INCCX;列坐标加;列坐标加1DEC
58、COUNT1;判断是否已经读了一行像素值;判断是否已经读了一行像素值JNEGETB1;否,继续;否,继续7676MOVCOUNT1, 32;重置计数器;重置计数器ADDSI, 4;修改像素指针;修改像素指针DECCOUNT6;每行;每行2个个32位像素显示完否?位像素显示完否?JNZGETB1;没有,继续;没有,继续MOVCOUNT6, 2;重置计数器;重置计数器MOVCX, Y;列坐标回到起始处;列坐标回到起始处INCDX;行坐标加;行坐标加1DECCOUNT2;判一帧像素读完否?;判一帧像素读完否?JNEGETB1;否,继续;否,继续7777POPCOUNT6;恢复现场;恢复现场POPCOUNT2POPCOUNT1POPSIPOPDXPOPCXPOPBXPOPAXRET;返回主程序返回主程序GETBACK ENDP7878;恢复背景子程序,背景区大小;恢复背景子程序,背景区大小6421DRAWBACK PROC NEAR PUSH CX; 保护现场保护现场PUSHCOUNT1 PUSHCOUNT2PUSH COUNT6MOVBH, 0;页号;页号MOVCX, Y;Y坐标坐标MOVDX, X;X坐标坐标LEADI, BACK;背景数据缓冲区首地址;背景数据缓冲区首地址79
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 城市更新背景下工业遗产再利用研究论文
- 环保法规下肉制品企业风险管理研究论文
- 乡村振兴视角下乡村旅游可持续发展研究论文
- 数字化转型中创业竞争力提升论文
- 乡村振兴战略下农村文化传承困境研究论文
- 小学六年级道德与法治上册第11课《做守法公民》教学设计
- 初中八年级地理教学设计:黄河流域生态保护与高质量发展
- 高中信息技术必修2《信息系统中的数据处理与软件》教学设计
- 初中九年级科学《功与机械效率》教学设计
- 小学三年级科学教学设计:第六单元第十九课《赛小车》
- 眼科疾病诊疗技术新进展与挑战
- 2026年初三年级资深班主任工作经验分享课件-班级管理的“细”与“实”
- 2026年丽江市消防救援局第三批政府专职消防员、消防文员招聘(55人)笔试备考试题及答案详解
- 2026年中考英语短文填空(7大考点14篇跟踪训练)
- 高校实验室建设项目投标文件
- 住宅项目施工总承包工程方案投标文件(技术标)
- 营商环境平台建设方案
- 2026新教材统编版九年级上册历史:全册教材问题答案
- 2026年国企纪检监察岗位面试题含答案
- 2026北京市市政工程设计研究总院有限公司校园招聘笔试历年参考题库
- 七大浪费分析与改善培训
评论
0/150
提交评论