;#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
- [cutebe] 相当牛,这个苦思冥想也值了。^_^ 11/30 00:00
- [parse] 如果忽略消息循环,那么操作系统加载的程序很快就执行完了,就像DOS程序一闪而过,所以CPU会空闲下来 06/30 09:04
- [游客] 楼主好厉害,挺一下! 01/19 08:43
- [游客] 很不错。 01/04 18:36
- [chinatree] 潜力贴留名,沙发。 11/08 12:58
- [youthangel] 恩,这次对了 10/30 18:56
- [fpamc] mov bx,18 在这条指令的上边是不是要加一条sub dx,dx? 10/30 10:03
- [fpamc] 对的 10/27 11:19
- [fpamc] 对的 10/27 09:00
- [fpamc] 哦,对不起,看错了。实验13也有一个7ch中断 10/27 08:52
- [游客] 现在急需一个汇编大作业。。。。。。可以么。。。。。如果今天之内看见留言 就加 1765496715 12/28 16:52
- [youthangel] 这算是对我学习的鼓励吗?谢谢!咱们这样交流就可以了 10/11 15:48
- [fpamc] 多日观察,你的学习积极性挺高的。可以来我们群了。群号:75916434 10/11 10:58