汇编网首页登录博客注册
youthangel的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
文章收藏

[2013-01-20 14:47] 动态画出一个棵七彩圣诞树

;#mode=dos
;先给树编码,在解码显示
assume cs:code,ds:data,ss:stack
stack segment
dw 32 dup(0)
stack ends
data segment
db "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCD"
data ends

tree segment
DB  00,18h,00,00,24h,00,00,42h,00,00,81h,00,01,00,80h,02
DB  00,40h,04,00,20h,0Fh,0E7h,0F0h,00,42h,00,00,81h,00,01,00
DB  80h,02,00,40h,04,00,20h,08,00,10h,10h,00,08,20h,00,04
DB  40h,00,02,0FFh,0E7h,0FFh,00,24h,00,00,24h,00,00,24h,00,00
DB  24h,00,00,24h,00,00,24h,00,00,3Ch,00
dw 8 dup(0)
tree ends

code segment
start:
mov ax,stack
mov ss,ax
mov sp,64

call showstrinig

mov ax,tree
mov ds,ax
mov bx,0
mov dh,0
mov dl,9
call showtree


mov ah,0
int 16h
mov ax,4c00h
int 21h

;-----------------------------------
;算出每个数的二进制表示,放入data中
;参数:数al,存放位置ds:si
;-----------------------------------
row:
push ax
push bx
push cx
push dx
push si

mov bl,2
mov dh,0

mov cx,8
again:
mov ah,0
div bl;商在al中,余数在ah中
mov dl,ah
push dx;余数入栈
loop again

mov cx,8
outstack:
pop ax
mov [si],al
inc si
loop outstack

pop si
pop dx
pop cx
pop bx
pop ax
ret

;--------------------------------
;从ds:si处取出八个数据显示
;参数:ds:si,显示位置dl,dh(列行)
;--------------------------------
showstr:
push ax
push bx
push cx
push dx
push es
push di
push si

mov ax,0b800h
mov es,ax

mov al,dh;行
mov bl,160
mul bl
add dl,dl;列
add dl,dl;这里相当与乘4
mov dh,0
add ax,dx
mov di,ax


mov cx,8
showpiex:
push cx
mov cl,[si]
jcxz zero
mov ax,bp
mov es:[di],ax
call sleep
add bp,1101h

zero:
inc si
add di,4;这里也要加4,每个输出直接间隔两个
pop cx
loop showpiex

pop si
pop di
pop es
pop dx
pop cx
pop bx
pop ax
ret

;---------------------------------------
;显示圣诞树
;---------------------------------------

;-------------------------
;画图
;参数:ds:bx指向图形数据,显示的列行(dl,dh)
;返回:无
;-------------------------
showtree:

push ds
push bx
push dx
push si

mov si,75;保存2进制数据
mov cx,25
s2:
mov al,[bx]
call row;计算半行
call showstr;显现半行

mov al,[bx+1]
add dl,8
call row;计算半行
call showstr;显现半行

mov al,[bx+2]
add dl,8
call row;计算半行
call showstr;显现半行

add bx,3
sub dl,16
add dh,1
loop s2

pop si
pop dx
pop bx
pop ds
ret
;---------------------------------------
;显示字符
;---------------------------------------
showstrinig:
push ax
push bx
push cx
push si
push di
push ds
push es
push bp

mov ax,data
mov ds,ax
mov si,0;偶数字符
mov di,1;奇数字符
mov ax,0b800h
mov es,ax
mov bx,0;从上到下地址
mov bp,24*160+4;从下到上

mov cx,20
mov ah,2
show:
mov al,[si]
mov es:[bx],ax
mov al,[di]
mov es:[bp],ax

add si,2
add di,2
add bx,8
add bp,8
loop show

mov ax,0b800h
mov ds,ax

mov si,0
mov di,24*160+4
mov cx,24
copy:
mov bx,0
push cx
mov cx,20
copy1:
mov ax,[bx+si]
mov [bx+si+160],ax
mov ax,[bx+di]
mov [bx+di-160],ax
add bx,8
loop copy1
call sleep
add si,160
sub di,160
pop cx
loop copy

pop bp
pop es
pop ds
pop di
pop si
pop cx
pop bx
pop ax
ret

;--------------------------------------------
;延时子程序:具体时间于处理机的处理能力有关
;--------------------------------------------
sleep:
push bx
push cx
mov cx,02fffh
minus:
push cx
mov bx,0ffffh
mov cx,bx
self:
loop self
pop cx
loop minus
pop cx
pop bx
ret

code ends
end start
评论次数(0)  |  浏览次数(918)  |  类型(冥思苦想) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码