Count dw 0 ;保存字符个数
Pointer dw 0 ;保存字符首地址
Line db 0 ;保存行号
Column db 0 ;保存列号
Data ends
Codes segment
Assume cs:codes,ds:data,es:data,ss:stacks
Start: mov ax,data
Mov ds,ax
Mov es,ax
;设置为80×25彩色文本方式
mov ah,0
mov al,3
int 10h
call clear ;清屏幕
mov ah,0
lea bp,string
mov cx,strlen
mov dx,0101h
mov bh,0
mov bl,9eh
mov al,0
mov ah,13h
int 10h
mov ah,7
int 21h
Lea si,robot2 ;数据段首地址送DI
Mov dx,1480h ;显示的起始行号和列号
Mov bh,0
Call moves1
Lea di,robot1 ;数据段首地址送DI
Mov dx,1400h ;显示的起始行号和列号
Mov bh,0
Call moves ;调用MOVES子程序
call delay ;清屏幕
call clear
Lea si,robot4 ;数据段首地址送DI
Mov dx,1440h ;显示的起始行号和列号
Mov bh,0
Call moves1
Lea di,robot3 ;数据段首地址送DI
Mov dx,1400h ;显示的起始行号和列号
Mov bh,0
Call moves ;调用MOVES子程序
Mov ah,4ch ;主程序结束返回DOS
Int 21h
Moves1 proc ;机器人移动子程序
Pushr ax,bx,cx,dx ;保存寄存器内容
Push si
Xor ch,ch
Mov cl,[si] ;字符个数送CX
Inc si
;指向第一个显示符
Mov count,cx ;保存字符个数
Mov pointer,si ;保存字符首地址
Mov line,dh ;保存行号
Mov column,dl ;保存列号
Next1: add dh,[si+2] ;根据偏移值计算下
Add dl,[si+3] ;计算列号
;判断是否到屏幕最右端
mov ah,2
Int 10h ;设置光标位置
Mov al,[si] ;取字符
Mov bl,[si+1] ;取字符属性
Push cx ;保存计数值
;设置写彩色字符
mov ah,9
mov cx,1
int 10h
Pop cx ;恢复计数值
Add si,4 ;指向下一个显示字
Loop next1 ;机器人没画完转
Pop si
Popr ax,bx,cx,dx
Ret
Moves1 endp
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,50;判断是否到屏幕最右端
Jb write ;否,继续画
Cmp dh,10;判断是否到屏幕最右端
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
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
mov dh,line
inc column ;inc向左走,dec向右走
mov dl,column
ret
erase endp
delay proc ;延时子程序
pushr ax,bx,cx,dx
mov dx,4000h
go: mov cx,4000h
repeat: loop repeat
dec dx
jne go
popr ax,bx,cx,dx
ret
delay endp
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
codes ends
end start