⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档.txt

📁 设计一个在屏幕上显示的动画程序
💻 TXT
字号:
5.2显示一座房子
5.2.1先画一座房子,放在代码段中
    house  db   2fh,06h,0,0; 房子顶部
       db   2fh,06h,-1,1

       db   5fh,06h,-1,1;
       db   5fh,06h,0,1 
       db   5fh,06h,0,1  
       db   5fh,06h,0,1
       db   5fh,06h,0,1
       db   5fh,06h,0,1 
       db   5fh,06h,0,1  
       db   5fh,06h,0,1
       db   5fh,06h,0,1
       db   5fh,06h,0,1 
       db   5fh,06h,0,1  
       db   5fh,06h,0,1
       db   5fh,06h,0,1
 
       db   5ch,06h,1,1
       db   5ch,06h,1,1

       db   0bah,06h,2,-1;四面墙
       db   0bah,06h,1,0
       db   0bah,06h,1,0
       db   0bah,06h,1,0
       db   0bah,06h,1,0
       db   0bah,06h,1,0
    
       db   0cdh,06h,0,-1
       db   0cdh,06h,0,-1
       db   0cdh,06h,0,-1
       db   0cdh,06h,0,-1
       db   0cdh,06h,0,-1
       db   0cdh,06h,0,-1
       db   0cdh,06h,0,-1
       db   0cdh,06h,0,-1
       db   0cdh,06h,0,-1
       db   0cdh,06h,0,-1
       db   0cdh,06h,0,-1
       db   0cdh,06h,0,-1
       db   0cdh,06h,0,-1
       db   0cdh,06h,0,-1
       db   0cdh,06h,0,-1

       db   0bah,06h,0,0
       db   0bah,06h,-1,0
       db   0bah,06h,-1,0
       db   0bah,06h,-1,0
       db   0bah,06h,-1,0
       db   0bah,06h,-1,0
     
       db   0cdh,06h,-1,-1
       db   0cdh,06h,0,1 
       db   0cdh,06h,0,1  
       db   0cdh,06h,0,1
       db   0cdh,06h,0,1
       db   0cdh,06h,0,1
       db   0cdh,06h,0,1 
       db   0cdh,06h,0,1
       db   0cdh,06h,0,1 
       db   0cdh,06h,0,1 
       db   0cdh,06h,0,1
       db   0cdh,06h,0,1
       db   0cdh,06h,0,1
       db   0cdh,06h,0,1 
       db   0cdh,06h,0,1
5.2.2编写一段程序,使房子固定于屏幕的右上角
               lea di,house
               mov   dx,033ch;033ch指的是房子的位置
     begain:   add   dh,[di+2]
               add   dl,[di+3]
               mov   ah,2
               int  10h                           
               mov  al,[di]
               mov  bl,[di+1]
               mov  ah,9
               mov  cx,1
               int  10h5
               add  di,4
               dec  ci
               cmp  ci,0
               jg  begain

5.3 编写一个移动的机器人
5.3.1定义一个机器人,置于代码段中
      Robot		db	7                      ;机器人由7个符号组成
			Db	5ch,8eh,0,0      ;左手,字符属性,行偏移,列偏移
			Db	08h,06h,0,1      ;胸部,字符属性,行偏移,列偏移
			Db	2fh,8eh,0,1      ;右手,字符属性,行偏移,列偏移
			Db	0dbh,0ah,1,-1    ;腹部,字符属性,行偏移,列偏移
			Db	13h,7h,1,0       ;两腿,字符属性,行偏移,列偏移
			Db	02h,84h,-3,0     ;面部,字符属性,行偏移,列偏移
			Db	9dh,94h,-1,0     ;天线,字符属性,行偏移,列偏移

5.3.2编写程序,使机器人从左向右移动
           Lea		di,robot   ;数据段首地址送DI
			Mov		dx,1606h   ;显示机器人移动的行号和列号
			Mov		bh,0       
            Call            moves      ;调用MOVES子程序
            Call            clear      ;清屏幕
            Mov             ah,4ch     ;主程序结束返回DOS
			Int		21h
5.3.3移动子程序
       Moves		proc    ;机器人移动子程序
			        Pushr	ax,bx,cx,dx        ;保存寄存器内容
			        Push		di          
			        Xor		ch,ch
			        Mov		cl,[di]     ;字符个数送CX
			        Inc		di          ;指向第一个显示符号
			        Mov		count,cx    ;保存字符个数
			        Mov		pointer,di  ;保存字符首地址
			        Mov		line,dh     ;保存行号
			        Mov		column,dl   ;保存列号
         Next:       add     dh,[di+2]   ;根据偏移值计算下一个符号的号
			        Add		dl,[di+3]   ;计算列号
			        Cmp		dl,80       ;判断是否到屏幕最右端
			        Jb		write       ;否,继续画
			        Pop		di
			        Popr		ax,bx,cx,dx
			        Ret
         Write:      mov             ah,2         
			        Int		10h          ;设置光标位置
			        Mov		al,[di]      ;取字符
			        Mov		bl,[di+1]    ;取字符属性
			        Push		cx           ;保存计数值
			;设置写彩色字符
                    mov      ah,9         
                    mov      cx,1
                    int       10h
			         Pop		cx          ;恢复计数值
			         Add		di,4         ;指向下一个显示字符
			         Loop	   next          ;机器人没画完转next
                   Call            delay        ;延时子程序
                   Call            Erase        ;清除机器人子程序
			        Jmp		short next
       Moves		endp

5.3.4擦除子程序			
      Erase		 proc
			    Mov		cx,count      ;字符个数送CX
			    Mov		di,pointer    ;字符首地址送DI
			    Mov		dh,line       ;行号送DH
			    Mov		dl,column     ;列号送DL
		l:	    add		   dh,[di+2]     ;根据相对偏移计算行号
               mov     ah,2          ;设置光标位置
               add      dl,[di+3]
               int       10h      
			    mov		al,[di]        ;取字符     
			    mov		bl,0           ;字符属性为黑底黑字
			    push		cx            
			    mov     	ah,9           ;写字符
              mov       cx,1           
              int        10h
			    pop		cx
			    add		   di,4           ;指向下一个字符
			    loop		l              ;未清除完转L
			    mov		cx,count       ;为重画机器人做准备
			    mov		di,pointer
              cmp      dl,3eh          ;当机器人走到3e位置时转向房子前进
              jbe        b
              cmp       dl,4ah         ;当前进的列到4ah时停止前进,并固定
              jae        d
              dec        line
              mov		dh,line 
              inc        column
              mov       dl,column  
              jmp       d  
		b:	   inc		   column       
			   mov		   dl,column
              mov       dh,line
              jmp       d
       d:		ret
         erase		endp
5.3.5写延时子程序
     delay		proc   ;延时子程序
			    pushr	ax,bx,cx,dx
                mov     dx,2000
           go:  mov     cx,5000
        epeat:	loop		repeat
			    dec		dx
			    jne		go
			    popr    ax,bx,cx,dx
			    ret
         delay		endp
5.3.6写清屏幕子程序
      clear			proc  ;清屏幕子程序
			pushr	   ax,bx,cx,dx
			mov		bh,7
			mov		dx,184fh
			mov     	ax,0600h
           mov      cx,0
           int        10h
			popr		ax,bx,cx,dx
			ret
       clear	   endp
5.4编写一段程序,使机器人固定在台阶上
5.4.1定义机器人代码段
     与原机器人代码段相同,定义为Robot1
5.4.2使机器人固定在台阶上
     stop            proc
              lea di,Robot1
              mov   dx,0c44h;0c44h指的是机器人固定的位置
     begain1:  add   dh,[di+2]
              add   dl,[di+3]
              mov   ah,2
              int  10h                           
              mov  al,[di]
              mov  bl,[di+1]
              mov  ah,9
              mov  cx,1
              int  10h
              add  di,4
              dec  aa
              cmp  aa,0
              jg  begain1
              ret
      stop         endp
5.5写一段程序,让字母从右向左移动
5.5.1写welcome代码段,于定义代码段中
     welcome         db      25
                        Db      01h,84h,0,0
                        Db      57h,01h,0,1
                        Db      65h,02h,0,1
                        Db      6ch,03h,0,1
                        Db      6fh,04h,0,1
                        Db      6dh,05h,0,1
                        Db      65h,06h,0,1
                        Db      01h,0h,0,1
                        Db      54h,07h,0,1
                        Db      6fh,08h,0,1
                        Db      01h,0h,0,1
                        Db      53h,09h,0,1
                        Db      77h,0ah,0,1
                        Db      65h,0bh,0,1
5.5.2写一段子程序,使字母移动
         letter          proc
                        lea      di,welcome
                        mov     dx,072eh  ;
                        mov     bh,0
                        call      moves1
                        call      clear
                        ret
         letter         endp
         Moves1		proc    ;字母移动子程序
			        Pushr	ax,bx,cx,dx        ;保存寄存器内容
			        Push		di          
			        Xor		ch,ch
			        Mov		cl,[di]      ;字符个数送CX
			        Inc		di          ;指向第一个显示符号
			        Mov		count,cx    ;保存字符个数
			        Mov		pointer,di    ;保存字符首地址
			        Mov		line,dh      ;保存行号
			        Mov		column,dl   ;保存列号
         Nex1t:    add      dh,[di+2]    ;根据偏移值计算下一个符号的号
			        Add		dl,[di+3]    ;计算列号
			        Cmp		dl,80       ;判断是否到屏幕最右端
			        Jb		   write1       ;否,继续画
			        Pop		di
			        Popr		ax,bx,cx,dx
			        Ret
         Write1:    mov      ah,2         
			        Int		   10h         ;设置光标位置
			        Mov		al,[di]       ;取字符
			        Mov		bl,[di+1]     ;取字符属性
			        Push		cx          ;保存计数值
			;设置写彩色字符
                    mov      ah,9         
                    mov      cx,1
                    int       10h
			         Pop		 cx          ;恢复计数值
			         Add		 di,4         ;指向下一个显示字符
			         Loop	     next1        ;字母没画完转next
                   Call      delay        ;延时子程序
                   Call      Erase1       ;清除机器人子程序
			        Jmp		short next1
           Moves1		endp
       Erase1		proc
			         Mov		cx,count    
			         Mov		di,pointer    
			         Mov		dh,line       
			         Mov		dl,column    
           a:		  add		dh,[di+2]     
                    mov     ah,2          
                   add      dl,[di+3]
                    int      10h      
			         mov		al,[di]        
			         mov		bl,0           
			         push		cx            
			         mov     ah,9        
                    mov     cx,1           
                   int       10h
			        pop		cx
			        add		di,4           
			        loop		a            
			        mov		cx,count       
			        mov		di,pointer 
                   mov		dh,line       
			        dec		column       
			        mov		dl,column
             		 ret
          erase1		endp

6.  问题讨论与分析
6.1位置问题
	       因为不知道具体的行和列的位置,在确定房子、机器人、字母的起始位置时       都遇到很大的困难,容易覆盖了其它物体,特别是在确定机器人行走并改变方向时列的位置,要反复试验,使机器人在行走到该列时改变方向可以正好向房子的方向行走,而且是斜向上行走,还要判断当机器人行走到台阶的位置时,可以调用stop子程序,让机器人固定在这个位置上。
6.2跳转指令的使用
	       在Erase子程序中,即在让机器人转向行走时,要注意跳转指令的合理利用, 在判断好转向的列数后,要注意比较语句的巧妙运用的,尽量使程序更为简短。
6.3延时处理
	       在处理机器人固定在台阶上和字母飘出来那段程序的衔接时,要注意时间的
控制,要让机器人固定的同时,welcome子程序接着运行,这也需要我们反复调试反复运行,才能确定数值。   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -