📄 新建 文本文档.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 + -