汇编语言课程设计dos下屏保程序设计实现本科论文.doc

上传人:红**** 文档编号:91482314 上传时间:2023-05-27 格式:DOC 页数:18 大小:621.50KB
返回 下载 相关 举报
汇编语言课程设计dos下屏保程序设计实现本科论文.doc_第1页
第1页 / 共18页
汇编语言课程设计dos下屏保程序设计实现本科论文.doc_第2页
第2页 / 共18页
点击查看更多>>
资源描述

《汇编语言课程设计dos下屏保程序设计实现本科论文.doc》由会员分享,可在线阅读,更多相关《汇编语言课程设计dos下屏保程序设计实现本科论文.doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、成绩 中国农业大学 课程设计报告 (2015-2016学年夏季学期)设计题目: DOS下屏保程序设计实现 课程名称: 汇编语言课程设计 任课教师: 班级: 计算机141 学号: 姓名: 目 录一、要求与需求分析11.题目重述:12.需求分析:1二、程序设计分析:11.屏保绘制模块11.1、图形录入:11.2、动画绘制:22.非工作状态计时模块22.1、计时功能:22.2、判断是否处于工作状态23.检测键盘输入模块34.中断设置及内存驻留程序3三、程序流程图31.装载程序:32.定时器中断处理程序:43.键盘中断处理程序:44.屏幕保护程序:5四、核心模块功能介绍51.装载程序(INSTALL)

2、:52.更改后的计时器中断(FUNCTIMER):53.更改后的键盘中断(INT9):64.屏保程序(SCREENSAVER):65.屏保绘制模块(PRINT):66.贴图函数(ONEBITMAP/ZEROBITMAP):67.延时处理函数(ONEBITMAP/ZEROBITMAP):68.清屏宏(CLRSCREEN):6五、程序运行步骤6六、设计过程中遇到的主要技术难点及解决方案71.中断设置及驻留:72.工作状态的判断:73.动画的绘制:74.恢复原本工作状态:7七、个人体会7八、参考文献8九、程序清单8DOS下屏幕保护程序的设计与实现一、 要求与需求分析1. 题目重述:编写一个DOS下的

3、屏幕保护程序(也可以是windows下的屏保)。该程序具有以下功能:在一段时间内(如1分钟)没有任何键键入时,程序自动进入屏保(一个图画一直在不断的移动显示,图案任意),直到按任意键结束。2. 需求分析:在未启动屏幕保护程序的情况下,当长时间不使用电脑的时显示器屏幕的显示换面长时间不变,这将使屏幕发光器件疲劳、变色、甚至烧毁,最终使屏幕某个区域偏色或变暗。因此一个合格的屏幕保护程序应满足条件:1. 图案动态且在屏幕上的分布尽量均匀2. 当停止工作后一段时间内才进入屏保3. 一旦按键后结束屏幕保护程序的绘制并恢复之前工作的内容二、 程序设计分析:针对上述对于需求的分析,可将目标程序分为三个功能模

4、块,即:屏保绘制模块、非工作状态计时模块、检测键盘输入模块。同时为了各个模块正常工作,还需使用DOS功能设置中断及将各功能模块在内存中驻留。1. 屏保绘制模块1.1、 图形录入:ROM BIOS显示例程支持多种文本方式和图形方式。在不同的显示方式下屏幕显示的像素分辨率、字符分辨率、颜色数等都不同。为更细致的展现动画细节,本程序调用INT10的0号子功能,选择320*200分别率图形16色显示模式;并基于此模式将要显示的像素图转化为相应的显存矩阵,每个像素点占用一个字节存储颜色及亮度信息,存储图片共占用27*35 Byte。在图形显示时调用INT10的5号子功能将图片置入显存的相应内存区间。1.

5、2、 动画绘制:本程序在绘制动画时考虑到动画的连贯性,使用了两个显存页。一个显存页作为显示页,另一个显存页作为后台页,绘制图像时仅仅对后台页执行像素操作,显示显存页。动画通过改变图案的绘制位置实现,当图案绘制触及屏幕边缘时改变绘图方向,且绘制图案鹿的方向与动画运动方向同向。动画绘制过程涉及以下变量作为参数:当前绘制页数(后台页)RECENTPAGE、上一次绘制页数(显示页)LASTPAGE、当前绘图的顶点坐标CURSORX, CURSORY;上一次的绘制坐标LASTX,LASTY;横向绘图方向DIRECX;纵向绘图方向DIRECY;常量的水平绘制速度和垂直绘制速度VX,VY。下面将详细介绍动画

6、绘制的过程。1. 通过交换RECENTPAGE与LASTPAGE的值,完成对后台页与显示页的页码的交换;2. 根据DIRECX判断绘图方向,选择调用贴图函数ONEBITMAP或ZEROBITMAP在后台页上以CURSORX, CURSORY为顶点绘制图案。其中ONEBITMAP为每列从左到右向显存录入像素,ZEROBITMAP为每列从右到左向显存录入数据;3. 显示绘制完成的后台页并将调用宏CLRSCREEN把原显示页清屏;4. 保存绘制坐标CURSORX, CURSORY到LASTX,LASTY,判断图片是否绘制到屏幕边缘。如是,改变绘图方向DIRECX、DIRECY;5. 计算下次绘图的坐

7、标,根据方向选择顶点坐标加绘制速度VX,VY或减VX,VY。2. 非工作状态计时模块2.1、 计时功能:由于计算机的8259A可编程中断控制器以18.2HZ的频率产生中断信号,每次8259A产生中断信号时CPU将处理1CH号中断向量所指向的终端处理程序。本程序通过改变1CH号中断处理程序实现计时功能。在每次1CH号中断发生时,若判断运行标志FLAG得屏保绘制程序未运行,将定时计数变量CLKCNT减一,若CLKCNT归零,则调用屏幕保护函数进入屏保绘制过程。2.2、 判断是否处于工作状态在DOS环境下,可认为当无字符输入时为非工作状态。因此本程序通过改变键盘中断处理程序实现非工作状态的计时。具体

8、实现方法为每次有键盘输入时将定时计数变量CLKCNT复位,对非工作状态重新计时并调用原键盘中断处理函数。3. 检测键盘输入模块该模块功能为当屏保绘制时若有按键输入,则结束屏保绘制并返回原工作界面。在具体实现上调用INT16H 的1号子功能读键盘缓冲区字符,若缓存区存在字符,结束屏保的绘制,返回文字显示方式并显示原工作页的缓存。4. 中断设置及内存驻留程序该程序作用为设置中断及把上述所有模块在内存中驻留,即装载程序。调用INT 21H的35H号子功能保存键盘中断的原中断向量到SAVINT9,调用INT 21H的25H号子功能将非计时器中断及键盘中断重置为工作状态计时模块中的相应程序。利用宏操作P

9、ROLEN EQU $-FUNCTIMER计算屏保程序占用内存的字节数,调用INT 21H的31H号子功能完成内存驻留。三、 程序流程图1. 装载程序:2. 定时器中断处理程序:3. 键盘中断处理程序:4. 屏幕保护程序:四、 核心模块功能介绍1. 装载程序(INSTALL):完成修改中断计时器(FUNCTIMER)和键盘(INT9)的中断向量,改变中断屏蔽,实现屏保程序的驻留。2. 更改后的计时器中断(FUNCTIMER):对非工作状态计时;调用屏保程序(SCREENSAVER)。3. 更改后的键盘中断(INT9):若回到工作状态,将计时器变量复位。继承了原键盘中断的其他功能。4. 屏保程序

10、(SCREENSAVER):设置初始值,控制整个屏保绘制过程。5. 屏保绘制模块(PRINT):确定图片像素信息写入显存位置,计算每次贴图的顶点位置,实现动画的产生。6. 贴图函数(ONEBITMAP/ZEROBITMAP):屏保绘制模块(PRINT)的子函数,根据获取的顶点位置进行贴图。ONEBITMAP与ZEROBITMAP的区别为贴图的横向方向不同。7. 延时处理函数(ONEBITMAP/ZEROBITMAP):屏保绘制模块(PRINT)的子函数,起到延时贴图的作用,让动画能流畅显现。8. 清屏宏(CLRSCREEN):清除将要绘制的页码上的像素。五、 程序运行步骤1. 在DOS环境下运

11、行装载程序,将程序驻留在内存中;2. 若在五秒内没有任何键键入时,程序自动进入屏保,绘制一只跳动的小鹿;3. 在屏保绘制状态下任何键键入时返回原工作状态。六、 设计过程中遇到的主要技术难点及解决方案1. 中断设置及驻留:使用宏操作PROLEN EQU $-FUNCTIMER(FUNCTIMER为驻留区的首地址, PROLEN在程序末尾)计算屏保程序占用内存的字节数,调用INT 21H的31H号子功能完成内存驻留。其中屏保程序中所用到的所有数据及变量等一并写入代码段,而非数据段,以实现同步驻留。2. 工作状态的判断:更改键盘中断,使键盘每次发生中断时(即触发按键)都对非工作状态的计时复位。3.

12、动画的绘制:为消除动画设计时的图像闪烁的,本程序使用多页动画技术。多页动画是通过使用页切换技术实现的。页切换改变显示页以绘制出给定动画序列的相邻帧。由于图像通常绘制在不同的页上(不是当前可见页),用户不会看到图像被绘制或擦除,从而产生高质量的动画而没有图像闪烁。4. 恢复原本工作状态:本问题暂未解决。设想中的解决方案是将原本的文本显存页保存起来,动画绘制操作选择其他的页面进行,在结束绘制后调用INT 10H的0号子功能重新显示原文本页。但在实际实验后发现页面仍会被清空。七、 个人体会我在课程学习阶段对中断向量的驻留理解不够深刻,经过这一周对屏幕保护程序的研究,我对中断向量的驻留及图形处理有了较

13、深刻的了解、认识。我在动画绘制函数中遇到了一些特别奇怪的错误,总不能得到正确的图像浪费了很多时间。后来在排查时,发现所有变量前都忘记添加跨越段前缀CS:XX,这让我想到作为计算机系的学生,正因为我们所有的工作容错性都很低,所以更需要加倍得细心,每一个细节都可能会成为限制我们发展上限的潜在敌人。通过这一周的汇编课程设计,我也克服了对汇编程序的恐惧,在合理分块的前提下,哪怕是汇编程序这样低级、灵活的语言,也能一步步实现所有设计的功能;而且正是因为没有太多功能复杂的语句,只要实现进行充分的思考和妥善的设计,程序在逻辑上出错的几率非常小,排错并没有高级语言这么难(当然要建立在熟练掌握每种语句的用法的基

14、础上)。八、 参考文献1. 沈美明, 温冬婵. IBM-PC汇编语言程序设计(第二版)M.北京.清华大学出版社: 20142. 黄向明. 多页动画技术J. 微电脑世界,1996,07:71.九、 程序清单;清屏宏CLRSCREEN MACROLOCAL LOOPR,LOOPCMOV DX,CS:LASTYMOV BX,35LOOPR:PUSH BXMOV AX,27MOV CX,CS:LASTXLOOPC:PUSH AXMOV AH,0CHMOV AL,0MOV BH,CS:LASTPAGEINT 10HINC SIINC CXPOP AXDEC AXCMP AX,0JNZ LOOPCINC

15、DXPOP BXDEC BXCMP BX,0JNZ LOOPRENDMCODES SEGMENT;安装中断及中断驻留函数(入口)INSTALL PROC FAR ASSUME CS:CODESSTART:; 设置定时器中断向量MOV DX,OFFSET FUNCTIMERMOV AX,SEG FUNCTIMERMOV DS,AXMOV AL,1CHMOV AH,25HINT 21H; 保存INT9的键盘中断MOV AL,09HMOV AH,35HINT 21H MOV WORD PTR CS:SAVINT9,BXMOV WORD PTR CS:SAVINT9+2,ES; 设置键盘中断向量MOV

16、 DX,OFFSET INT9MOV AX,SEG INT9MOV DS,AXMOV AL,09HMOV AH,25HINT 21H; 中断屏蔽设定IN AL,21HAND AL,0FDH;11111100BOUT 21H,ALSTI; 中断驻留MOV AH,31HMOV AL,0MOV DX,PROLENINT 21H; 结束安装程序 MOV AH,4CHINT 21HINSTALL ENDP;计时器中断FUNCTIMER PROC FARSTI; 置EOI位为1,允许外部中断MOV AL,20HOUT 20H,ALCMP CS:FLAG,0JNZ EXITDEC CS:CLKCNTJNZ

17、EXITMOV FLAG,1CALL SCREENSAVEREXIT:CLIIRETFUNCTIMER ENDP;更改后的键盘中断INT9 PROC FARSTIMOV CS:CLKCNT,100MOV AL,20HOUT 20H,ALPUSHFPUSHFPOP AXAND AH,11111100BPUSH AXPOPFCALL DWORD PTR CS:SAVINT9IRETINT9 ENDP;屏保程序SCREENSAVER PROC NEARPUSH AXPUSH BXPUSH CXPUSH DX; 初始化MOV CS:CURSORX,0MOV CS:CURSORY,0MOV CS:DIR

18、ECX,0MOV CS:DIRECY,0MOV AL,1MOV AH,05HINT 10HMOV AH,00HMOV AL,0DHINT 10H; 屏保绘制循环NEXTGRA:CALL PRINTMOV AH,01HINT 16HJNZ PRESSEDJMP NEXTGRA;按键后跳出屏保程序PRESSED:MOV AH,00HMOV AL,03HINT 10HMOV AL,0MOV AH,05HINT 10HMOV CS:CLKCNT,100MOV CS:FLAG,0POP DXPOP CXPOP BXPOP AX;终止屏保程序RETSCREENSAVER ENDP;屏保绘制程序PRINT

19、PROC NEARPUSH AXPUSH BXPUSH CXPUSH DX; 设置两页动画,分别为后台和前台MOV AH,CS:LASTPAGEMOV AL,CS:RECENTPAGEMOV CS:RECENTPAGE,AHMOV CS:LASTPAGE,AL; 根据方向选择贴图CMP CS:DIRECX,0JZ BMPCALL ONEBITMAPJMP NNNNBMP:CALL ZEROBITMAPNNNN:; 更换显示页面MOV AL,CS:RECENTPAGEMOV AH,05HINT 10HCLRSCREEN; 将光标位置保存MOV AX,CS:CURSORXMOV CS:LASTX,

20、AXMOV AX,CS:CURSORYMOV CS:LASTY,AXCALL FUNCWAIT; 若图片到达边缘,改变运动方向CMP CS:CURSORX,0JZ CHANGXCMP CS:CURSORX,290JBE CMPYCHANGX:MOV AL,CS:DIRECXXOR AL,1MOV CS:DIRECX,ALCMPY:CMP CS:CURSORY,0JZ CHANGYCMP CS:CURSORY,160JBE OUT1CHANGY:MOV AL,CS:DIRECYXOR AL,1MOV CS:DIRECY,AL; 根据运动方向确定下次贴图坐标OUT1:CMP CS:DIRECX,0

21、JZ SUBXADD CS:CURSORX,VXJMP CULYSUBX:SUB CS:CURSORX,VXCULY:CMP CS:DIRECY,0JZ SUBYADD CS:CURSORY,VYJMP PRIENDSUBY:SUB CS:CURSORY,VYPRIEND:POP DXPOP CXPOP BXPOP AXRETPRINT ENDP;向左贴图ONEBITMAP PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXMOV DX,CS:CURSORYLEA SI,CS:GRAPHMOV BX,35LOOPR1:PUSH BXMOV AX,27MOV CX,CS:

22、CURSORXLOOPC1:PUSH AX; 设置像素MOV AH,0CHMOV AL,CS:SIMOV BH,CS:RECENTPAGEINT 10HINC SIINC CXPOP AXDEC AXCMP AX,0JNZ LOOPC1INC DXPOP BXDEC BXCMP BX,0JNZ LOOPR1POP DXPOP CXPOP BXPOP AXRETONEBITMAP ENDP;向右贴图ZEROBITMAP PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXMOV DX,CS:CURSORYLEA SI,CS:GRAPHMOV BX,35LOOPR0:PUSH

23、 BXMOV AX,27MOV CX,CS:CURSORXADD CX,AXLOOPC0:PUSH AX; 设置像素MOV AH,0CHMOV AL,CS:SIMOV BH,CS:RECENTPAGEINT 10HINC SIDEC CXPOP AXDEC AXCMP AX,0JNZ LOOPC0INC DXPOP BXDEC BXCMP BX,0JNZ LOOPR0POP DXPOP CXPOP BXPOP AXRETZEROBITMAP ENDP;延时处理函数FUNCWAIT PROC NEARPUSH AXPUSH CX; 空循环MOV CX,0FFFFHDELY:MOV AL,0MOV

24、 AH,0SUB AL,AHLOOP DELYPOP CXPOP AXRETFUNCWAIT ENDP;在CODE SEGMENT中定义的数据段SAVINT9 DW ?,?LASTPAGE DB 1;保存上一次绘制的页数RECENTPAGE DB 2;保存当前动画绘制的页数LASTX DW 0;保存上一次绘图的坐标LASTY DW 0FLAG DB 0;用于判断屏保程序是否已运行CURSORX DW 0;保存当前绘图的光标位置XCURSORY DW 0;保存当前绘图的光标位置YDIRECX DB 0;横向绘图方向DIRECY DB 0;纵向绘图方向CLKCNT DB 100;进入屏保的时间;位

25、图像素信息GRAPHDB 0,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,0DB 0,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,0DB 0,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,0DB 0,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,0DB 0,0,0,0,0,0,0,0FH,0,0,0,0FH,0,0,0,0,0,0FH

26、,0,0,0,0,2,0,2,0,0DB 0,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,0DB 0,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,0DB 0,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,0DB 0,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,0DB 0,0,0,0,2,0,2

27、,0,0,0,0,0,0,0,0,0FH,0FH,0,0FH,0FH,0FH,0,0,0,0,0,0DB 0,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,0DB 0,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,0DB 0,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,0DB 0,2,0,2,0,0,0,0,0,2,0,2,0,0,0,0FH,0FH,0FH,0FH

28、,0,0,0,0,0,2,0,0DB 0,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,0DB 0,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,0DB 0,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,0DB 0,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,0DB 0,0,0

29、,0,0,0FH,0,0,0,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0,0,0,0,0,0DB 0,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,0DB 0,0,0,0,0,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0,0,0,0,0,0,0DB 0,0,0,0,0,0,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0,0

30、FH,0FH,0FH,0FH,0,0,0,0,0,0,0DB 0,0,0,0,0,0,0FH,0FH,0FH,0FH,0,0FH,0FH,0FH,0FH,0FH,0,0FH,0FH,0FH,0FH,0FH,0FH,0,0,0,0DB 0,0,0,0,0,0,0FH,0FH,0FH,0FH,0FH,0,0FH,0FH,0,0,0,0,0,0,0,0,0FH,0FH,0,0,0DB 0,0,0,0,0,0,0FH,0FH,0FH,0FH,0,0,0,0,0,0,0,0,0,0,0,0FH,0,0FH,0,0,0DB 0,0,0,0,0,0,0FH,0FH,0FH,0,0,0,0,0,0,0,0,0

31、,0,0,0,0FH,0,0FH,0,0,0DB 0,0,0,0,0,0FH,0FH,0FH,0,0,0,0,0,0,0,0,0,0,0,0,0FH,0,0,0FH,0,0,0DB 0,0,0,0,0FH,0FH,0FH,0,0FH,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0FH,0,0,0DB 0,0,0,0FH,0FH,0FH,0,0FH,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0FH,0,0,0,0DB 0,0,0,0FH,0FH,0,0FH,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0DB 0,0,0,0FH,0,0FH

32、,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0DB 0,0,0FH,0FH,0,0FH,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0DB 0,0,0FH,0,0,0FH,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0DB 0,0,0FH,0,0,0FH,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0DB 0,0,0FH,0FH,0,0FH,0FH,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0VX EQU 5;每次绘制水平方向移动五个像素点VY EQU 2;每次绘制垂直方向移动两个像素点PROLEN EQU $-FUNCTIMERCODES ENDS END START16

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁