汇编语言课程设计dos下屏保程序设计实现本科论文Word文档下载推荐.docx
- 文档编号:20377023
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:21
- 大小:55.94KB
汇编语言课程设计dos下屏保程序设计实现本科论文Word文档下载推荐.docx
《汇编语言课程设计dos下屏保程序设计实现本科论文Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《汇编语言课程设计dos下屏保程序设计实现本科论文Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
四、核心模块功能介绍5
1.装载程序(INSTALL):
2.更改后的计时器中断(FUNCTIMER):
3.更改后的键盘中断(INT9):
6
4.屏保程序(SCREENSAVER):
5.屏保绘制模块(PRINT):
6.贴图函数(ONEBITMAP/ZEROBITMAP):
7.延时处理函数(ONEBITMAP/ZEROBITMAP):
8.清屏宏(CLRSCREEN):
五、程序运行步骤6
六、设计过程中遇到的主要技术难点及解决方案7
1.中断设置及驻留:
7
2.工作状态的判断:
3.动画的绘制:
4.恢复原本工作状态:
七、个人体会7
八、参考文献8
九、程序清单8
DOS下屏幕保护程序的设计与实现
一、要求与需求分析
编写一个DOS下的屏幕保护程序(也可以是windows下的屏保)。
该程序具有以下功能:
在一段时间内(如1分钟)没有任何键键入时,程序自动进入屏保(一个图画一直在不断的移动显示,图案任意),直到按任意键结束。
在未启动屏幕保护程序的情况下,当长时间不使用电脑的时显示器屏幕的显示换面长时间不变,这将使屏幕发光器件疲劳、变色、甚至烧毁,最终使屏幕某个区域偏色或变暗。
因此一个合格的屏幕保护程序应满足条件:
1.图案动态且在屏幕上的分布尽量均匀
2.当停止工作后一段时间内才进入屏保
3.一旦按键后结束屏幕保护程序的绘制并恢复之前工作的内容
针对上述对于需求的分析,可将目标程序分为三个功能模块,即:
屏保绘制模块、非工作状态计时模块、检测键盘输入模块。
同时为了各个模块正常工作,还需使用DOS功能设置中断及将各功能模块在内存中驻留。
1.屏保绘制模块
ROMBIOS显示例程支持多种文本方式和图形方式。
在不同的显示方式下屏幕显示的像素分辨率、字符分辨率、颜色数等都不同。
为更细致的展现动画细节,本程序调用INT10的0号子功能,选择320*200分别率图形16色显示模式;
并基于此模式将要显示的像素图转化为相应的显存矩阵,每个像素点占用一个字节存储颜色及亮度信息,存储图片共占用27*35Byte。
在图形显示时调用INT10的5号子功能将图片置入显存的相应内存区间。
本程序在绘制动画时考虑到动画的连贯性,使用了两个显存页。
一个显存页作为显示页,另一个显存页作为后台页,绘制图像时仅仅对后台页执行像素操作,显示显存页。
动画通过改变图案的绘制位置实现,当图案绘制触及屏幕边缘时改变绘图方向,且绘制图案鹿的方向与动画运动方向同向。
动画绘制过程涉及以下变量作为参数:
当前绘制页数(后台页)RECENTPAGE、上一次绘制页数(显示页)LASTPAGE、当前绘图的顶点坐标CURSORX,CURSORY;
上一次的绘制坐标LASTX,LASTY;
横向绘图方向DIRECX;
纵向绘图方向DIRECY;
常量的水平绘制速度和垂直绘制速度VX,VY。
下面将详细介绍动画绘制的过程。
1.通过交换RECENTPAGE与LASTPAGE的值,完成对后台页与显示页的页码的交换;
2.根据DIRECX判断绘图方向,选择调用贴图函数ONEBITMAP或ZEROBITMAP在后台页上以CURSORX,CURSORY为顶点绘制图案。
其中ONEBITMAP为每列从左到右向显存录入像素,ZEROBITMAP为每列从右到左向显存录入数据;
3.显示绘制完成的后台页并将调用宏CLRSCREEN把原显示页清屏;
4.保存绘制坐标CURSORX,CURSORY到LASTX,LASTY,判断图片是否绘制到屏幕边缘。
如是,改变绘图方向DIRECX、DIRECY;
5.计算下次绘图的坐标,根据方向选择顶点坐标加绘制速度VX,VY或减VX,VY。
2.非工作状态计时模块
由于计算机的8259A可编程中断控制器以18.2HZ的频率产生中断信号,每次8259A产生中断信号时CPU将处理1CH号中断向量所指向的终端处理程序。
本程序通过改变1CH号中断处理程序实现计时功能。
在每次1CH号中断发生时,若判断运行标志FLAG得屏保绘制程序未运行,将定时计数变量CLKCNT减一,若CLKCNT归零,则调用屏幕保护函数进入屏保绘制过程。
2.2、判断是否处于工作状态
在DOS环境下,可认为当无字符输入时为非工作状态。
因此本程序通过改变键盘中断处理程序实现非工作状态的计时。
具体实现方法为每次有键盘输入时将定时计数变量CLKCNT复位,对非工作状态重新计时并调用原键盘中断处理函数。
3.检测键盘输入模块
该模块功能为当屏保绘制时若有按键输入,则结束屏保绘制并返回原工作界面。
在具体实现上调用INT16H的1号子功能读键盘缓冲区字符,若缓存区存在字符,结束屏保的绘制,返回文字显示方式并显示原工作页的缓存。
4.中断设置及内存驻留程序
该程序作用为设置中断及把上述所有模块在内存中驻留,即装载程序。
调用INT21H的35H号子功能保存键盘中断的原中断向量到SAVINT9,调用INT21H的25H号子功能将非计时器中断及键盘中断重置为工作状态计时模块中的相应程序。
利用宏操作PROLENEQU$-FUNCTIMER计算屏保程序占用内存的字节数,调用INT21H的31H号子功能完成内存驻留。
三、程序流程图
四、核心模块功能介绍
完成修改中断计时器(FUNCTIMER)和键盘(INT9)的中断向量,改变中断屏蔽,实现屏保程序的驻留。
对非工作状态计时;
调用屏保程序(SCREENSAVER)。
若回到工作状态,将计时器变量复位。
继承了原键盘中断的其他功能。
设置初始值,控制整个屏保绘制过程。
确定图片像素信息写入显存位置,计算每次贴图的顶点位置,实现动画的产生。
屏保绘制模块(PRINT)的子函数,根据获取的顶点位置进行贴图。
ONEBITMAP与ZEROBITMAP的区别为贴图的横向方向不同。
屏保绘制模块(PRINT)的子函数,起到延时贴图的作用,让动画能流畅显现。
清除将要绘制的页码上的像素。
五、程序运行步骤
1.在DOS环境下运行装载程序,将程序驻留在内存中;
2.若在五秒内没有任何键键入时,程序自动进入屏保,绘制一只跳动的小鹿;
3.在屏保绘制状态下任何键键入时返回原工作状态。
六、设计过程中遇到的主要技术难点及解决方案
使用宏操作PROLENEQU$-FUNCTIMER(FUNCTIMER为驻留区的首地址,PROLEN在程序末尾)计算屏保程序占用内存的字节数,调用INT21H的31H号子功能完成内存驻留。
其中屏保程序中所用到的所有数据及变量等一并写入代码段,而非数据段,以实现同步驻留。
更改键盘中断,使键盘每次发生中断时(即触发按键)都对非工作状态的计时复位。
为消除动画设计时的图像闪烁的,本程序使用多页动画技术。
多页动画是通过使用页切换技术实现的。
页切换改变显示页以绘制出给定动画序列的相邻帧。
由于图像通常绘制在不同的页上(不是当前可见页),用户不会看到图像被绘制或擦除,从而产生高质量的动画而没有图像闪烁。
本问题暂未解决。
设想中的解决方案是将原本的文本显存页保存起来,动画绘制操作选择其他的页面进行,在结束绘制后调用INT10H的0号子功能重新显示原文本页。
但在实际实验后发现页面仍会被清空。
七、个人体会
我在课程学习阶段对中断向量的驻留理解不够深刻,经过这一周对屏幕保护程序的研究,我对中断向量的驻留及图形处理有了较深刻的了解、认识。
我在动画绘制函数中遇到了一些特别奇怪的错误,总不能得到正确的图像浪费了很多时间。
后来在排查时,发现所有变量前都忘记添加跨越段前缀CS:
XX,这让我想到作为计算机系的学生,正因为我们所有的工作容错性都很低,所以更需要加倍得细心,每一个细节都可能会成为限制我们发展上限的潜在敌人。
通过这一周的汇编课程设计,我也克服了对汇编程序的恐惧,在合理分块的前提下,哪怕是汇编程序这样低级、灵活的语言,也能一步步实现所有设计的功能;
而且正是因为没有太多功能复杂的语句,只要实现进行充分的思考和妥善的设计,程序在逻辑上出错的几率非常小,排错并没有高级语言这么难(当然要建立在熟练掌握每种语句的用法的基础上)。
八、参考文献
[1].沈美明,温冬婵.IBM-PC汇编语言程序设计(第二版)[M].北京.清华大学出版社:
2014
[2].黄向明.多页动画技术[J].微电脑世界,1996,07:
71.
九、程序清单
;
清屏宏
CLRSCREENMACRO
LOCALLOOPR,LOOPC
MOVDX,CS:
LASTY
MOVBX,35
LOOPR:
PUSHBX
MOVAX,27
MOVCX,CS:
LASTX
LOOPC:
PUSHAX
MOVAH,0CH
MOVAL,0
MOVBH,CS:
LASTPAGE
INT10H
INCSI
INCCX
POPAX
DECAX
CMPAX,0
JNZLOOPC
INCDX
POPBX
DECBX
CMPBX,0
JNZLOOPR
ENDM
CODESSEGMENT
安装中断及中断驻留函数(入口)
INSTALLPROCFAR
ASSUMECS:
CODES
START:
设置定时器中断向量
MOVDX,OFFSETFUNCTIMER
MOVAX,SEGFUNCTIMER
MOVDS,AX
MOVAL,1CH
MOVAH,25H
INT21H
保存INT9的键盘中断
MOVAL,09H
MOVAH,35H
INT21H
MOVWORDPTRCS:
SAVINT9,BX
SAVINT9+2,ES
设置键盘中断向量
MOVDX,OFFSETINT9
MOVAX,SEGINT9
中断屏蔽设定
INAL,21H
ANDAL,0FDH;
11111100B
OUT21H,AL
STI
中断驻留
MOVAH,31H
MOVDX,PROLEN
结束安装程序
MOVAH,4CH
INSTALLENDP
计时器中断
FUNCTIMERPROCFAR
置EOI位为1,允许外部中断
MOVAL,20H
OUT20H,AL
CMPCS:
FLAG,0
JNZEXIT
DECCS:
CLKCNT
MOVFLAG,1
CALLSCREENSAVER
EXIT:
CLI
IRET
FUNCTIMERENDP
更改后的键盘中断
INT9PROCFAR
MOVCS:
CLKCNT,100
PUSHF
ANDAH,11111100B
POPF
CALLDWORDPTRCS:
SAVINT9
INT9ENDP
屏保程序
SCREENSAVERPROCNEAR
PUSHCX
PUSHDX
初始化
CURSORX,0
CURSORY,0
DIRECX,0
DIRECY,0
MOVAL,1
MOVAH,05H
MOVAH,00H
MOVAL,0DH
屏保绘制循环
NEXTGRA:
CALLPRINT
MOVAH,01H
INT16H
JNZPRESSED
JMPNEXTGRA
按键后跳出屏保程序
PRESSED:
MOVAL,03H
POPDX
POPCX
终止屏保程序
RET
SCREENSAVERENDP
屏保绘制程序
PRINTPROCNEAR
设置两页动画,分别为后台和前台
MOVAH,CS:
MOVAL,CS:
RECENTPAGE
RECENTPAGE,AH
LASTPAGE,AL
根据方向选择贴图
JZBMP
CALLONEBITMAP
JMPNNNN
BMP:
CALLZEROBITMAP
NNNN:
更换显示页面
CLRSCREEN
将光标位置保存
MOVAX,CS:
CURSORX
LASTX,AX
CURSORY
LASTY,AX
CALLFUNCWAIT
若图片到达边缘,改变运动方向
JZCHANGX
CURSORX,290
JBECMPY
CHANGX:
DIRECX
XORAL,1
DIRECX,AL
CMPY:
JZCHANGY
CURSORY,160
JBEOUT1
CHANGY:
DIRECY
DIRECY,AL
根据运动方向确定下次贴图坐标
OUT1:
JZSUBX
ADDCS:
CURSORX,VX
JMPCULY
SUBX:
SUBCS:
CULY:
JZSUBY
CURSORY,VY
JMPPRIEND
SUBY:
PRIEND:
PRINTENDP
向左贴图
ONEBITMAPPROCNEAR
LEASI,CS:
GRAPH
LOOPR1:
LOOPC1:
设置像素
[SI]
INCCX
JNZLOOPC1
JNZLOOPR1
ONEBITMAPENDP
向右贴图
ZEROBITMAPPROCNEAR
LOOPR0:
ADDCX,AX
LOOPC0:
DECCX
JNZLOOPC0
JNZLOOPR0
ZEROBITMAPENDP
延时处理函数
FUNCWAITPROCNEAR
空循环
MOVCX,0FFFFH
DELY:
MOVAH,0
SUBAL,AH
LOOPDELY
FUNCWAITENDP
在CODESEGMENT中定义的数据段
SAVINT9DW?
?
LASTPAGEDB1;
保存上一次绘制的页数
RECENTPAGEDB2;
保存当前动画绘制的页数
LASTXDW0;
保存上一次绘图的坐标
LASTYDW0
FLAGDB0;
用于判断屏保程序是否已运行
CURSORXDW0;
保存当前绘图的光标位置X
CURSORYDW0;
保存当前绘图的光标位置Y
DIRECXDB0;
横向绘图方向
DIRECYDB0;
纵向绘图方向
CLKCNTDB100;
进入屏保的时间
;
位图像素信息
GRAPHDB0,0,2,0,0,0,0,0,0,0,0FH,0,0FH,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DB0,2,0,2,0,0,0,0,0,0,0FH,0,0FH,0,0,0,0FH,0,0,0,0,0,0,0,0,0,0
DB0,0,2,0,0,0,0,0,0,0,0,0FH,0,0,0,0,0FH,0,0FH,0,0,0,0,0,0,0,0
DB0,0,0,0,0,0,0,0FH,0,0,0,0FH,0,0,0,0,0,0FH,0,0,0,0,0,2,0,0,0
DB0,0,0,0,0,0,0,0FH,0,0,0,0FH,0,0,0,0,0,0FH,0,0,0,0,2,0,2,0,0
DB0,0,0,0,0,0,0,0,0FH,0,0,0,0,0FH,0FH,0FH,0,0,0FH,0FH,0,0,0,0,0,0,0
DB0,0,0,0,0,0,0,0,0,0FH,0,0,0,0,0,0,0FH,0FH,0,0,0,0,0,0,0,0,0
DB0,0,0,0,0,2,0,0,0,0,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0,0,0,0,0,0,0,0
DB0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0FH,0FH,0,0FH,0FH,0FH,0,0,0,0,0,0
DB0,0,0,0,0,2,0,0,0,0,0,0,0,0,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0,0,0,0,0
DB0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0FH,0FH,0FH,0FH,0FH,0FH,0,0,0,0,0,0
DB0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0FH,0FH,0FH,0,0,0,0,0,0,0,0,0
DB0,2,0,2,0,0,0,0,0,2,0,2,0,0,0,0FH,0FH,0FH,0FH,0,0,0,0,0,2,0,0
DB0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0FH,0FH,0FH,0FH,0,0,0,0,2,0,2,0
DB0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0FH,0FH,0FH,0FH,0FH,0,0,0,0,2,0,0
DB0,0,0,0,0,0,0,0,0,0,0,0,0,0,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0,0,0,0,0,0
DB0,0,0,0,0,0FH,0,0,0,0,0,0,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0,0,0,0,0,0
DB0,0,0,0,0,0FH,0,0,0,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0,0,0,0,0,0
DB0,0,0,0,0,0FH,0FH,0,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0,0,0,0,0,0
DB0,0,0,0,0,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0,0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 课程设计 dos 屏保 程序设计 实现 本科 论文
![提示](https://static.bdocx.com/images/bang_tan.gif)