还原DOS系统下的烟花程序(DOS汇编源码)

该博客介绍了如何在DOS系统下实现一款烟花程序,通过拦截系统中断和内存驻留技术使程序在后台运行。程序分为初始化和烟花效果两部分,使用汇编语言编写,能在屏幕上生成随机烟花效果。文章提供了详细的代码实现,并给出了编译和运行程序的步骤,包括MASM编译、LINK链接及exe2bin转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一个DOS程序只支持在WINDOSXP系统和DOS系统下运行

烟花程序介绍

本程序通过拦截系统中断和内存驻留技术让程序看起来像是在后台运行。在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文件)
MASM命令link命令;link f.obj (后面的选项直接按回车,此时会生成f.exe文件)
LINK命令
exe2bin命令:exe2bin f.exe f.com (这个只能在windowxp系统下运行,此时会生成f.com文件)
EXE2BIN命令
编译器和源码(提取码:AASS)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值