烟花程序介绍
本程序通过拦截系统中断和内存驻留技术让程序看起来像是在后台运行。在DOS系统下运行时,会从屏幕底部随机位置生成一朵烟花弹,然后随机上升到一定高度后爆炸出烟花效果,为枯燥乏味(黑底白字)的DOS系统添加一丝色彩。
程序代码分为了两部分,第一部分为初始化程序,主要用来截获、修改中断和程序驻留内存。第二部分为烟花效果程序。
汇编代码如下(由于注释比较详细,这里就不再解释代码了)
code segment
org 100h;com文件需要在开头预留100h字节的空间
assume cs:code , ds:code
main:
jmp start;要跳开数据部分,不能执行
welcome db '+----------------------------------+' ,0ah ,0dh
db '+Fireworks +' ,0ah ,0dh
db '+ write by caicaiwoshishui +' ,0ah ,0dh
db '+----------------------------------+' ,0ah ,0dh ,'$'
dataPosition dw 8 dup(0);备份数据的位置
dataBackup dw 8 dup(0);备份数据
flyHeight db ?;向上飞行高度
IsBoom db ?;烟花是否爆炸
old_int dd ?;保存被截获的中断
timer dw ?;烟花程序执行间隔(单位:55ms)
timer2 dw ?;烟花爆炸后停留时间(单位:55ms)
TSR proc far
;保护现场
push ax
push bx
push cx
push dx
push si
push di
push bp
push sp
push es
push ds
sti
call disp
cli
;返回现场
pop ds
pop es
pop sp
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
jmp cs:old_int
TSR endp
disp proc near
push ax
push cx
push dx
push es
push bx
push di
;控制烟花的移动速度//每55mm*3移动一次
show:inc timer
mov ax,3
cmp ax,timer
jne timeJump
mov ax,0
mov timer,ax
mov ax,0b800h
mov es,ax
;判断烟花是否爆炸1=爆炸 0=未爆炸
mov al,IsBoom
cmp al,1
je initFireworks
;移动烟花
;---------------------------------------------------------------------------------------
mov al,flyHeight
cmp al,0
je FireworksBoom
dec al
mov flyHeight,al
;移动烟花(还原被烟花覆盖的数据)
mov di,0
;还原
mov ax,word ptr dataBackup[di]
mov bx,word ptr dataPosition[di]
;mov bx,dx
mov es:[bx],ax
;备份
sub bx,160
mov ax,es:[bx]
mov word ptr dataBackup[di],ax
mov word ptr dataPosition[di],bx
mov es:[bx],072ah
jmp timeJump
;---------------------------------------------------------------------------------------
;烟花爆炸(爆炸生成8片花瓣)
;---------------------------------------------------------------------------------------
FireworksBoom:mov al,1
mov IsBoom,al
;还原
mov di,0
mov ax,word ptr dataBackup[di]
mov dx,word ptr dataPosition[di]
mov bx,dx
mov es:[bx],ax
;爆炸
sub bx,6
mov word ptr dataPosition[di],bx
mov ax,es:[bx]
mov word ptr dataBackup[di],ax
mov es:[bx],012ah;------------------------------------------------------
add bx,12
inc di
inc di
mov word ptr dataPosition[di],bx
mov ax,es:[bx]
mov word ptr dataBackup[di],ax
mov es:[bx],022ah;------------------------------------------------------
sub bx,160
inc di
inc di
mov word ptr dataPosition[di],bx
mov ax,es:[bx]
mov word ptr dataBackup[di],ax
mov es:[bx],032ah;------------------------------------------------------
sub bx,12
inc di
inc di
mov word ptr dataPosition[di],bx
mov ax,es:[bx]
mov word ptr dataBackup[di],ax
mov es:[bx],042ah;------------------------------------------------------
sub bx,160
add bx,4
inc di
inc di
mov word ptr dataPosition[di],bx
mov ax,es:[bx]
mov word ptr dataBackup[di],ax
mov es:[bx],052ah;------------------------------------------------------
add bx,4
inc di
inc di
mov word ptr dataPosition[di],bx
mov ax,es:[bx]
mov word ptr dataBackup[di],ax
mov es:[bx],062ah;------------------------------------------------------
add bx,480
inc di
inc di
mov word ptr dataPosition[di],bx
mov ax,es:[bx]
mov word ptr dataBackup[di],ax
mov es:[bx],072ah;------------------------------------------------------
sub bx,4
inc di
inc di
mov word ptr dataPosition[di],bx
mov ax,es:[bx]
mov word ptr dataBackup[di],ax
mov es:[bx],022ah;------------------------------------------------------
jmp timeJump
;---------------烟花爆炸结束------------------------------------------------------------------------
;重新生成一朵烟花;1.先清除上一次爆炸的烟花 2.用随机数生成下一朵烟花的初始位置和飞行高度参数 3.备份烟花处的数据并显示烟花
;---------------------------------------------------------------------------------------
initFireworks:mov ax,timer2
inc ax
mov timer2,ax
cmp ax,5
jne timeJump
mov ax,0
mov timer2,ax
mov IsBoom,al
mov cx,8
mov di,0
loop1:mov ax,word ptr dataBackup[di]
mov bx,word ptr dataPosition[di]
;mov bx,dx
mov es:[bx],ax
inc di
inc di
loop loop1
mov ax,0
out 43h,al
in al,40h
in al,40h
push dx
mov ah,0
mov dl,60
div dl
mov al,ah
mov ah,0
pop dx
;call rnnd;+3840
add ax,10;往右边移动十格
mov ah,2
mul ah
add ax,3840
push ax
mov ax,0
out 43h,al
in al,40h
in al,40h
push dx
mov ah,0
mov dl,16
div dl
mov al,ah
mov ah,0
pop dx
inc al
inc al
inc al
inc al
;call rnnd2;
mov flyHeight,al
;备份烟花处的数据并显示烟花
mov ax,0b800h
mov es,ax
mov di,0
pop ax
mov bx,ax
mov ax,word ptr es:[bx]
mov word ptr dataBackup[di],ax
mov word ptr dataPosition[di],bx
mov es:[bx],072ah
;--------------------重新生成一朵烟花结束-------------------------------------------------------------------
timeJump: pop di
pop bx
pop es
pop dx
pop cx
pop ax
ret
disp endp
start:
mov dx ,offset welcome
mov ah ,09h;
int 21h;显示欢迎语 DS:DX=字符串 '$'结束字符串
;初始化数据
mov ax,0b800h
mov es,ax
mov bx,3850
mov ax,6
mov flyHeight,al
mov ax,0
mov timer2,ax
mov IsBoom,al
mov ax,word ptr es:[bx]
mov word ptr dataBackup[di],ax
mov word ptr dataPosition[di],bx
;call disp
mov ax ,351Ch
int 21h;读取中断向量 返回值ES:BX=中断向量
mov word ptr old_int , bx
mov word ptr old_int[2] , es
mov dx , offset TSR
push cs
pop ds
mov ax ,251Ch
int 21h;设置中断向量 DS:DX=中断向量
mov dx , offset start
int 27h;驻留程序
code ends
end main
环境要求
系统:WindowsXp 32位
编译约定
源码文件名: f.asm。后面用到的f.asm都代表源码文件。
编译命令
masm命令:masm f.asm(此时会生成t.obj文件)
link命令;link f.obj (后面的选项直接按回车,此时会生成f.exe文件)
exe2bin命令:exe2bin f.exe f.com (这个只能在windowxp系统下运行,此时会生成f.com文件)
编译器和源码(提取码:AASS)