d_seg segment
row_u db 0 ;行上方的边界->r
row_d db 25 ;行下方的边界->l
col_l db 0 ;列左边的边界->u
col_r db 80 ;列右边的边界->d
end_flag db 0 ;1为结束,0为继续
walkdirect db 'r';当前前进的方向,初始向右
d_seg ends
;
code segment
assume cs:code,ds:d_seg
start:
;**
;*
;主程序段代码
main proc far
push ds
xor ax,ax
push ax
;
mov ax,d_seg
mov ds,ax
;
call clear; 清屏
;
mov dx,0 ;光标置0行0列
mov bh,0
mov ah,2
int 10h
;
call drawdirect ;输出图形
;按任意键退出
mAgain:
mov ah,7
int 21h
cmp al,'q'
je mExit
jmp mAgain
mExit:
call clear
ret
main endp
;-----
;**
;*
;绘图方向的控制
drawdirect proc near
d_continue:
;跟col_l比较,如果col_l>=dl,则walkdirect='u'
cmp walkdirect,'l' ;是否是左边
jnz no_left ;不是
coll_next:
call char_disp ;输出字符
dec dl ;往左移一列
cmp col_l,dl ;比较是否该转方向
jl coll_next ;不用转,继续输出
inc dl ;往右回退一列
inc col_l ;左边界加一
inc col_l
mov walkdirect,'u' ;转方向为向上
jmp dcmp ;退出
;
no_left:
;跟col_r比较,如果col_r<=dl,则walkdirect='d'
cmp walkdirect,'r' ;是否是右边
jnz no_right ;不是
colr_next:
call char_disp ;输出字符
inc dl ;往右移一列
cmp col_r,dl ;比较是否该转方向
jg colr_next ;不用转,继续输出
dec dl ;往左回退一列
dec col_r ;右边界减一
dec col_r
mov walkdirect,'d' ;转方向为向下
jmp dcmp ;退出
;
no_right:
;跟row_u比较,如果row_u>=dh,则walkdircet='r'
cmp walkdirect,'u' ;是否向上走
jnz no_up ;不是
rowu_next:
call char_disp ;输出字符
dec dh ;往上移一行
cmp row_u,dh ;比较是否该转方向了
jl rowu_next ;不用转,继续输出
inc dh ;往下回退一行
inc row_u ;上边界加一
;inc row_u
mov walkdirect,'r' ;转方向为向右
jmp dcmp ;退出
;
no_up:
;跟row_d比较,如果row_d<=dh,则walkdirect='l'
rowd_next:
call char_disp
inc dh ;往下移一行
cmp row_d,dh ;比较是否该转方向了
jg rowd_next ;不用转,继续输出
dec dh ;往上回退一行
dec row_d ;下边界减一
;dec row_d
mov walkdirect,'l' ;转方向为向左
dcmp:
push ax ;保存al
mov al,row_u
inc al ;上边界试加一
cmp al,row_d ;上边界是否和下边界重合
pop ax ;恢复al
jge d_Exit ;如果将要重合,退出
push ax ;保存al
mov al,col_l
inc al ;左边界试加一
cmp al,col_r ;如果将要重合,退出
pop ax ;恢复al
jge d_Exit ;如果将要重合,退出
jmp d_continue ;接着输出
d_Exit:
ret
drawdirect endp
;--------
;**
;*
char_disp proc near
push cx ;保存cx
;
mov ah,2
mov bh,0 ;0页显示
int 10h ;置光标位置
;
mov al,2 ;置入笑脸ASCII码
mov bl,07 ;黑底白字符
mov cx,1 ;输出字符1次
mov ah,9
int 10h ;输出笑脸
pop cx
ret
char_disp endp
;--------
;**
;*
clear proc near
mov ax,0600h ;全屏幕空白
mov bh,7 ;正常显示
sub cx,cx ;起点(0,0)
mov dx,184fh ;终点(24,79)
int 10h
ret
clear endp
;--------
code ends
end start
row_u db 0 ;行上方的边界->r
row_d db 25 ;行下方的边界->l
col_l db 0 ;列左边的边界->u
col_r db 80 ;列右边的边界->d
end_flag db 0 ;1为结束,0为继续
walkdirect db 'r';当前前进的方向,初始向右
d_seg ends
;
code segment
assume cs:code,ds:d_seg
start:
;**
;*
;主程序段代码
main proc far
push ds
xor ax,ax
push ax
;
mov ax,d_seg
mov ds,ax
;
call clear; 清屏
;
mov dx,0 ;光标置0行0列
mov bh,0
mov ah,2
int 10h
;
call drawdirect ;输出图形
;按任意键退出
mAgain:
mov ah,7
int 21h
cmp al,'q'
je mExit
jmp mAgain
mExit:
call clear
ret
main endp
;-----
;**
;*
;绘图方向的控制
drawdirect proc near
d_continue:
;跟col_l比较,如果col_l>=dl,则walkdirect='u'
cmp walkdirect,'l' ;是否是左边
jnz no_left ;不是
coll_next:
call char_disp ;输出字符
dec dl ;往左移一列
cmp col_l,dl ;比较是否该转方向
jl coll_next ;不用转,继续输出
inc dl ;往右回退一列
inc col_l ;左边界加一
inc col_l
mov walkdirect,'u' ;转方向为向上
jmp dcmp ;退出
;
no_left:
;跟col_r比较,如果col_r<=dl,则walkdirect='d'
cmp walkdirect,'r' ;是否是右边
jnz no_right ;不是
colr_next:
call char_disp ;输出字符
inc dl ;往右移一列
cmp col_r,dl ;比较是否该转方向
jg colr_next ;不用转,继续输出
dec dl ;往左回退一列
dec col_r ;右边界减一
dec col_r
mov walkdirect,'d' ;转方向为向下
jmp dcmp ;退出
;
no_right:
;跟row_u比较,如果row_u>=dh,则walkdircet='r'
cmp walkdirect,'u' ;是否向上走
jnz no_up ;不是
rowu_next:
call char_disp ;输出字符
dec dh ;往上移一行
cmp row_u,dh ;比较是否该转方向了
jl rowu_next ;不用转,继续输出
inc dh ;往下回退一行
inc row_u ;上边界加一
;inc row_u
mov walkdirect,'r' ;转方向为向右
jmp dcmp ;退出
;
no_up:
;跟row_d比较,如果row_d<=dh,则walkdirect='l'
rowd_next:
call char_disp
inc dh ;往下移一行
cmp row_d,dh ;比较是否该转方向了
jg rowd_next ;不用转,继续输出
dec dh ;往上回退一行
dec row_d ;下边界减一
;dec row_d
mov walkdirect,'l' ;转方向为向左
dcmp:
push ax ;保存al
mov al,row_u
inc al ;上边界试加一
cmp al,row_d ;上边界是否和下边界重合
pop ax ;恢复al
jge d_Exit ;如果将要重合,退出
push ax ;保存al
mov al,col_l
inc al ;左边界试加一
cmp al,col_r ;如果将要重合,退出
pop ax ;恢复al
jge d_Exit ;如果将要重合,退出
jmp d_continue ;接着输出
d_Exit:
ret
drawdirect endp
;--------
;**
;*
char_disp proc near
push cx ;保存cx
;
mov ah,2
mov bh,0 ;0页显示
int 10h ;置光标位置
;
mov al,2 ;置入笑脸ASCII码
mov bl,07 ;黑底白字符
mov cx,1 ;输出字符1次
mov ah,9
int 10h ;输出笑脸
pop cx
ret
char_disp endp
;--------
;**
;*
clear proc near
mov ax,0600h ;全屏幕空白
mov bh,7 ;正常显示
sub cx,cx ;起点(0,0)
mov dx,184fh ;终点(24,79)
int 10h
ret
clear endp
;--------
code ends
end start