实验8图形处理程序设计实验报告.doc
实验八 图形处理程序设计一、实验目的1.了解文本方式和图形方式处理图形的方法。2.掌握应用BIOS显示功能进行彩色图形处理的方式。3.正确编写图形处理程序。二、实验内容1.分析程序1的功能。代码如下:DATASEGMENT ;1 ;2 a db 'How do you do?',0ah,0dh ;3 db '$' ;4 字符串的结束标志b db 20,?,20 dup (?) ;5 ;6DATA ENDS ;7 ;8CODESEGMENT ;9ASSUMECS:CODE,DS:DATA ;10START:MOV AX,DATA ;11 MOVDS,AX ;12 ;13 mov ah, 09h ;14 显示字符串的中断调用 lea dx, a ;15 a的地址存入到dx中 int 21h ;16 dos键盘操作的中断调用,显示字符串 lea dx, b ;17 b的地址存到dx中 mov ah, 0ah ;18 输入字符串到缓冲区,缓冲区首地址是DS:DX,即b的位置 int 21h ;19 dos键盘操作的中断调用,等待输入字符串 mov dl, 0ah ;20 dl=输出字符 mov ah, 02h ;21 显示输出的中断调用 int 21h ;22 dos键盘操作的中断调用, mov al, b+1 ;23 将字符串的字符数目存放到al中 mov ah, 0 ;24 ah清零,这时ax中存放的是字符串的数目 mov si, ax ;25 字符串字符数目存到si中 mov dx, offset b+2 ;26 将字符串的开始地址放到dx中 mov bx, dx ;27 bx=dx mov byte ptr bx+si+1, '$' ;28 将'$'放到字符串的末尾 mov ah, 09h ;29 显示字符串的中断调用 int 21h ;30 dos键盘操作的中断调用,显示字符串 ;31 MOVAH,4CHINT21HCODEENDSEND START功能:在屏幕上显示键入的字符串,如图一所示:图一 屏幕回显2.分析程序2的功能。代码如下:CODESEGMENTASSUMECS:CODESTART:MOVAX,0002H ;3 设置显示方式INT10H ;4 BIOS显示输出的中断调用MOVAH,02H ;5 置光标位置MOVBH,00H ;6 bh=页号,首页显示MOVDX,0524H ;7 dh/dl=行/列,第五行第三十六列INT10H ;8 bios 显示 中断 置光标位置MOVAH,09H ;9 在光标位置显示字符和属性MOVBH,00H ;10 bh=显示页,首页显示MOVBL,2CH ;11 bl=属性,2ch=00101100d,背景为绿的字符为红的高亮固定字符MOVAL,'G' ;12 al=字符,说明字符为GMOVCX,8 ;13 cx=字符的重复次数,说明重复显示八次INT10H ;14 bios 显示 中断 在光标位置显示字符和属性MOVAH,02H ;15 置光标位置MOVBH,00H ;16 bh=页号,首页显示MOVDX,0A24H ;17 dh/dl=行/列,第十行第三十六列INT10H ;18 bios 显示 中断 置光标位置MOVAH,09H ;19 在光标位置显示字符和属性MOVBH,00H ;20 bh=显示页,首页显示MOVBL,1EH ;21 bl=属性,1eh=00011110d,背景为蓝的字符为棕的高亮固定字符MOVAL,'O' ;22 al=字符,说明字符为OMOVCX,8 ;23 cx=字符的重复次数,说明重复显示八次INT10H ;24 bios 显示 中断 在光标位置显示字符和属性MOVAH,02H ;25 置光标位置MOVBH,00H ;26 bh=页号,首页显示MOVDX,0F24H ;27 dh/dl=行/列,第十五行第三十六列INT10H ;28 bios 显示 中断 置光标位置MOVAH,09H ;29 在光标位置显示字符和属性MOVBH,00H ;30 bh=显示页,首页显示MOVBL,4FH ;31 bl=属性,4fh=01001111d,背景为红的字符为白的高亮固定字符MOVAL,'O' ;32 al=字符,说明字符为OMOVCX,8 ;33 cx=字符的重复次数,说明重复显示八次INT10H ;34 bios 显示 中断 在光标位置显示字符和属性MOVAH,02H ;35 置光标位置MOVBH,00H ;36 bh=页号,首页显示MOVDX,1424H ;37 dh/dl=行/列,第二十行第三十六列INT10H ;38 bios 显示 中断 置光标位置MOVAH,09H ;39 在光标位置显示字符和属性MOVBH,00H ;40 bh=显示页,首页显示MOVBL,02H ;41 bl=属性,02h=00000010d,背景为黑的字符为绿的正常固定字符MOVAL,'D' ;42 al=字符,说明字符为OMOVCX,8 ;43 cx=字符的重复次数,说明重复显示八次INT10H ;44 bios 显示 中断 在光标位置显示字符和属性MOVAH,4CHINT21HCODEENDSENDSTART功能:在屏幕中央以列为单位输出八次“GOOD”且G为绿底红色的高亮字体,O为蓝底黄色的高亮字体,O为红底白色的高亮字体,D为黑底绿色的普通字体,如图二所示图二 GOOD输出3.分析程序3的功能。代码如下:WINWIDTH=40WINTOP=8WINLEFT=20WINBOTTOM=17WINRIGHT=WINLEFT+WINWIDTH-1COLOR=74HPAGEN=0CTRL_C=03HCODESEGMENTASSUMECS:CODESTART:MOVAL,PAGENMOVAH,5INT10H;置当前显示页的bios中断调用,页号为0MOVCH,WINTOPMOVCL,WINLEFTMOVDH,WINBOTTOMMOVDL,WINRIGHTMOVBH,COLORMOVAL,0MOVAH,6INT10H;屏幕初始化或上滚,初始化窗口,卷入行属性为74h=01110100d,背景为白字符为红的正常固定字符;ch/cl=8/20,左上角为第八行第二十列,dh/dl=17/59,右上角为第十七行第五十九列MOVBH,PAGENMOVDH,WINBOTTOMMOVDL,WINLEFT;MOVBH,COLORMOVAH,2INT10H;置光标位置,bh=0,页号为0,dh/dl=17/20,第十七行第二十列NEXT:MOVAH,0INT16HCMPAL,CTRL_CJEEXITMOVBH,PAGENMOVCX,1MOVAH,0AHINT10H;在光标位置显示字符,首页,显示一次输入的字符INCDLCMPDL,WINRIGHT+1;dl和60比较 判断是否第一行写满JNESETCUR ;不相等,则跳转 不相等即未写满MOVCH,WINTOPMOVCL,WINLEFTMOVDH,WINBOTTOMMOVDL,WINRIGHTMOVBH,COLORMOVAL,1MOVAH,6INT10H;因为第一行写满,所以上滚一行;屏幕初始化或上滚,上滚一行,卷入行属性为74h=01110100d,背景为白字符为红的正常固定字符;ch/cl=8/20,左上角为第八行第二十列,dh/dl=17/59,右上角为第十七行第五十九列MOVDL,WINLEFT;dl=20SETCUR:MOVBH,PAGEN;bh=0MOVAH,02H ;置光标位置,首页,dh=17行dl列INT10HJMPNEXTEXIT:MOVAH,4CHINT21HCODEENDSENDSTART功能:在划分的白色背景区域,自下向上以行为单位输入红色字符,以ctrl+c结束输入,如图三所示。图三 划分区域显示输入字符4.分析程序4的功能。代码如下:DATASEGMENTROWDW0COLDW0COLORDB1DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAH,15INT10H ;取当前显示方式,PUSHAXMOVAX,0004HINT10H ;读光笔位置,MOVAH,0BHMOVBH,01HMOVBL,00HINT10H ;置彩色调色板,bh=1,选彩色组,bl=0,选彩色组0MOVCX,31:PUSHAXPUSHCXPUSHDXPUSHSIPUSHDI;第一次:入栈(从上往下):di目的变址地址,si原变址地址,dx=,cx=3,ax=000bh;第二次:入栈(从上往下):di目的变址地址,si原变址地址,dx=,cx=2,ax=000bh;第三次:入栈(从上往下):di目的变址地址,si原变址地址,dx=,cx=1,ax=000bhMOVAH,0CHMOVAL,COLORMOVDI,100MOVDX,ROW1:MOVSI,20MOVCX,COL2:INT10H;第一次:写像素,al=1,表示字符为绿色,dx/cx=0/0,表示像素行列为0/0 取第一次loop的第一次;第二次:写像素,al=2,表示字符为红色,dx/cx=0/40,表示像素行列为0/40 取第二次loop的第一次;第三次:写像素,al=3,表示字符为黄色,dx/cx=0/80,表示像素行列为0/80 取第三次loop的第一次INCCX ;cx自加1,列数加1DECSI ;si自减1JNZ2 ;ZF不为1时跳转,si不等于零时跳转,相当于在dx行输出20次所需像素INCDX ;dx自加1,行数加1DECDI ;di自减1JNZ1 ;di不等于0时跳转,相当于共输出100行所需像素POPDIPOPSIPOPDXPOPCXPOPAX ;出栈,di目的变址地址,si原变址地址,dx=,cx=3,ax=000bh mov ah,01h int 21h ;键盘输入并回显,这里是为了控制输出,使输出中断,等待输入字符后才进行下一步INCCOLOR ;COLOR自加ADDCOL,40LOOP1 ;cx=3,所以循环三次后跳出POPAXMOVAH,0HINT10H ;设置显示方式MOVAH,4CHINT21H CODEENDSENDSTART功能:在屏幕上输出三块颜色分别为绿、红、黄的大小为20*100的像素块,且间距为20,如图四所示。a、 b、 c、d、图四 输出颜色区域5. 编写程序5,在屏幕中部画一条垂直的黄色垂线。代码如下:CODESEGMENTASSUMECS:CODESTART:MOV AH, 0 MOV AL, 5 ;320*200彩色图形方式 INT 10H MOV AH, 0BH MOV BH, 1 ;置彩色组 MOV BL, 0 ;选彩色组0 INT 10H MOV CX, 200 ;线的长度 MOV BP, 0AGAIN: PUSH CX MOV AH, 0CH ;图形方式或写像素 MOV AL, 3 ;颜色号,黄色是3 MOV BH, 0 ;页号 MOV DX, BP ;像素行 MOV CX, 160 ;像素列 INT 10H INC BP POP CX LOOP AGAIN MOV AH,4CH INT 21HCODEENDSENDSTART 如图五所示,在屏幕中部输出一条垂直的黄色垂线。图五 输出一条黄色垂线