版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
成绩中国农业大学课程设计报告(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): 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下屏幕保护程序的设计与实现一、要求与需求分析题目重述:编写一个DOS下的屏幕保护程序(也可以是windows下的屏保)。该程序具有以下功能:在一段时间内(如1分钟)没有任何键键入时,程序自动进入屏保(一个图画一直在不断的移动显示,图案任意),直到按任意键结束。需求分析:在未启动屏幕保护程序的情况下,当长时间不使用电脑的时显示器屏幕的显示换面长时间不变,这将使屏幕发光器件疲劳、变色、甚至烧毁,最终使屏幕某个区域偏色或变暗。因此一个合格的屏幕保护程序应满足条件:图案动态且在屏幕上的分布尽量均匀当停止工作后一段时间内才进入屏保一旦按键后结束屏幕保护程序的绘制并恢复之前工作的内容二、程序设计分析:针对上述对于需求的分析,可将目标程序分为三个功能模块,即:屏保绘制模块、非工作状态计时模块、检测键盘输入模块。同时为了各个模块正常工作,还需使用 DOS功能设置中断及将各功能模块在内存中驻留。屏保绘制模块1.1、 图形录入:ROMBIOS显示例程支持多种文本方式和图形方式。在不同的显示方式下屏幕显示的像素分辨率、字符分辨率、颜色数等都不同。为更细致的展现动画细节,本程序调用 INT10的0号子功能,选择 320*200分别率图形16色显示模式;并基于此模式将要显示的像素图转化为相应的显存矩阵,每个像素点占用一个字节存储颜色及亮度信息,存储图片共占用 27*35Byte。在图形显示时调用 INT10的5号子功能将图片置入显存的相应内存区间。11.2、 动画绘制:本程序在绘制动画时考虑到动画的连贯性,使用了两个显存页。一个显存页作为显示页,另一个显存页作为后台页,绘制图像时仅仅对后台页执行像素操作,显示显存页。动画通过改变图案的绘制位置实现,当图案绘制触及屏幕边缘时改变绘图方向,且绘制图案鹿的方向与动画运动方向同向。动画绘制过程涉及以下变量作为参数:当前绘制页数(后台页)RECENTPAGE、上一次绘制页数(显示页)LASTPAGE、当前绘图的顶点坐标CURSORX,CURSORY;上一次的绘制坐标LASTX,LASTY;横向绘图方向DIRECX;纵向绘图方向DIRECY;常量的水平绘制速度和垂直绘制速度VX,VY。下面将详细介绍动画绘制的过程。通过交换RECENTPAGE与LASTPAGE的值,完成对后台页与显示页的页码的交换;2. 根据DIRECX判断绘图方向,选择调用贴图函数ONEBITMAP或ZEROBITMAP在后台页上以CURSORX,CURSORY为顶点绘制图案。其中ONEBITMAP为每列从左到右向显存录入像素,ZEROBITMAP为每列从右到左向显存录入数据;显示绘制完成的后台页并将调用宏CLRSCREEN把原显示页清屏;保存绘制坐标CURSORX,CURSORY到LASTX,LASTY,判断图片是否绘制到屏幕边缘。如是,改变绘图方向DIRECX、DIRECY;5. 计算下次绘图的坐标,根据方向选择顶点坐标加绘制速度 VX,VY或减VX,VY。非工作状态计时模块2.1、 计时功能:由于计算机的8259A可编程中断控制器以 18.2HZ的频率产生中断信号,每次 8259A产生中断信号时 CPU将处理1CH号中断向量所指向的终端处理程序。本程序通过改变 1CH号中断处理程序实现计时功能。在每次1CH号中断发生时,若判断运行标志 FLAG得屏保绘制程序未运行,将定时计数变量CLKCNT减一,若CLKCNT归零,则调用屏幕保护函数进入屏保绘制过程。2.2、 判断是否处于工作状态在DOS环境下,可认为当无字符输入时为非工作状态。因此本程序通过改变键盘中断处理程序实现非工作状态的计时。具体实现方法为每次有键盘输入时将定时计数变量CLKCNT复位,对非工作状态重新计时并调用原键盘中断处理函数。2检测键盘输入模块该模块功能为当屏保绘制时若有按键输入,则结束屏保绘制并返回原工作界面。在具体实现上调用INT16H的1号子功能读键盘缓冲区字符,若缓存区存在字符,结束屏保的绘制,返回文字显示方式并显示原工作页的缓存。中断设置及内存驻留程序该程序作用为设置中断及把上述所有模块在内存中驻留,即装载程序。调用 INT21H的35H号子功能保存键盘中断的原中断向量到 SAVINT9,调用INT21H的25H号子功能将非计时器中断及键盘中断重置为工作状态计时模块中的相应程序。利用宏操作 PROLENEQU$-FUNCTIMER计算屏保程序占用内存的字节数,调用INT21H的31H号子功能完成内存驻留。三、程序流程图装载程序:3定时器中断处理程序:键盘中断处理程序:4屏幕保护程序:四、核心模块功能介绍1.装载程序(INSTALL):完成修改中断计时器(FUNCTIMER)和键盘(INT9)的中断向量,改变中断屏蔽,实现屏保程序的驻留。2.更改后的计时器中断(FUNCTIMER):对非工作状态计时;调用屏保程序 (SCREENSAVER)。5更改后的键盘中断(INT9):若回到工作状态,将计时器变量复位。继承了原键盘中断的其他功能。4.屏保程序(SCREENSAVER):设置初始值,控制整个屏保绘制过程。5.屏保绘制模块(PRINT):确定图片像素信息写入显存位置,计算每次贴图的顶点位置,实现动画的产生。6.贴图函数(ONEBITMAP/ZEROBITMAP):屏保绘制模块 (PRINT)的子函数,根据获取的顶点位置进行贴图。 ONEBITMAP 与ZEROBITMAP的区别为贴图的横向方向不同。7.延时处理函数(ONEBITMAP/ZEROBITMAP):屏保绘制模块(PRINT)的子函数,起到延时贴图的作用,让动画能流畅显现。8.清屏宏(CLRSCREEN):清除将要绘制的页码上的像素。五、程序运行步骤在DOS环境下运行装载程序,将程序驻留在内存中;若在五秒内没有任何键键入时,程序自动进入屏保,绘制一只跳动的小鹿;在屏保绘制状态下任何键键入时返回原工作状态。6六、设计过程中遇到的主要技术难点及解决方案中断设置及驻留:使用宏操作PROLENEQU$-FUNCTIMER(FUNCTIMER为驻留区的首地址,PROLEN在程序末尾)计算屏保程序占用内存的字节数,调用INT21H的31H号子功能完成内存驻留。其中屏保程序中所用到的所有数据及变量等一并写入代码段,而非数据段,以实现同步驻留。工作状态的判断:更改键盘中断,使键盘每次发生中断时(即触发按键)都对非工作状态的计时复位。动画的绘制:为消除动画设计时的图像闪烁的,本程序使用多页动画技术。多页动画是通过使用页切换技术实现的。页切换改变显示页以绘制出给定动画序列的相邻帧。由于图像通常绘制在不同的页上(不是当前可见页),用户不会看到图像被绘制或擦除,从而产生高质量的动画而没有图像闪烁。恢复原本工作状态:本问题暂未解决。设想中的解决方案是将原本的文本显存页保存起来,动画绘制操作选择其他的页面进行,在结束绘制后调用 INT10H的0号子功能重新显示原文本页。但在实际实验后发现页面仍会被清空。七、个人体会我在课程学习阶段对中断向量的驻留理解不够深刻,经过这一周对屏幕保护程序的研究,我对中断向量的驻留及图形处理有了较深刻的了解、认识。我在动画绘制函数中遇到了一些特别奇怪的错误,总不能得到正确的图像浪费了很多时间。后来在排查时,发现所有变量前都忘记添加跨越段前缀 CS:XX,这让我想到作为计算机系的学生,正因为我们所有的工作容错性都很低,所以更需要加倍得细心,每一个细节都可能会成为限制我们发展上限的潜在敌人。通过这一周的汇编课程设计,我也克服了对汇编程序的恐惧,在合理分块的前提下,哪怕是汇编程序这样低级、灵活的语言,也能一步步实现所有设计的功能;而且正是因为没有太多功能复杂的语句,只要实现进行充分的思考和妥善的设计,程序在逻辑上出错的7几率非常小,排错并没有高级语言这么难(当然要建立在熟练掌握每种语句的用法的基础上)。八、参考文献[1].沈美明,温冬婵.IBM-PC汇编语言程序设计(第二版)[M].北京.清华大学出版社:2014[2].黄向明.多页动画技术[J].微电脑世界,1996,07:71.九、程序清单;清屏宏CLRSCREENMACROLOCALLOOPR,LOOPCMOVDX,CS:LASTYMOVBX,35LOOPR:PUSHBXMOVAX,27MOVCX,CS:LASTXLOOPC:PUSHAXMOVAH,0CHMOVAL,0MOVBH,CS:LASTPAGEINT10HINCSIINCCXPOPAXDECAXCMPAX,0JNZLOOPCINCDXPOPBXDECBXCMPBX,0JNZLOOPRENDMCODESSEGMENT8;安装中断及中断驻留函数(入口)INSTALLPROCFARASSUMECS:CODESSTART:设置定时器中断向量MOVDX,OFFSETFUNCTIMERMOVAX,SEGFUNCTIMERMOVDS,AXMOVAL,1CHMOVAH,25HINT21H保存INT9的键盘中断MOVAL,09HMOVAH,35HINT21HMOVWORDPTRCS:SAVINT9,BXMOVWORDPTRCS:SAVINT9+2,ES设置键盘中断向量MOVDX,OFFSETINT9MOVAX,SEGINT9MOVDS,AXMOVAL,09HMOVAH,25HINT21H中断屏蔽设定INAL,21HANDAL,0FDH;11111100BOUT21H,ALSTI中断驻留MOVAH,31HMOVAL,0MOVDX,PROLENINT21H结束安装程序MOVAH,4CHINT21HINSTALLENDP;计时器中断FUNCTIMERPROCFARSTI置EOI位为1,允许外部中断MOVAL,20HOUT20H,AL9CMPCS:FLAG,0JNZEXITDECCS:CLKCNTJNZEXITMOVFLAG,1CALLSCREENSAVEREXIT:CLIIRETFUNCTIMERENDP;更改后的键盘中断INT9PROCFARSTIMOVCS:CLKCNT,100MOVAL,20HOUT20H,ALPUSHFPUSHFPOPAXANDAH,11111100BPUSHAXPOPFCALLDWORDPTRCS:SA VINT9IRETINT9ENDP;屏保程序SCREENSAVERPROCNEARPUSHAXPUSHBXPUSHCXPUSHDX初始化MOVCS:CURSORX,0MOVCS:CURSORY,0MOVCS:DIRECX,0MOVCS:DIRECY,0MOVAL,1MOVAH,05HINT10HMOVAH,00HMOVAL,0DHINT10H屏保绘制循环NEXTGRA:10CALLPRINTMOVAH,01HINT16HJNZPRESSEDJMPNEXTGRA;按键后跳出屏保程序PRESSED:MOVAH,00HMOVAL,03HINT10HMOVAL,0MOVAH,05HINT10HMOVCS:CLKCNT,100MOVCS:FLAG,0POPDXPOPCXPOPBXPOPAX;终止屏保程序RETSCREENSAVERENDP;屏保绘制程序PRINTPROCNEARPUSHAXPUSHBXPUSHCXPUSHDX设置两页动画,分别为后台和前台MOVAH,CS:LASTPAGEMOVAL,CS:RECENTPAGEMOVCS:RECENTPAGE,AHMOVCS:LASTPAGE,AL根据方向选择贴图CMPCS:DIRECX,0JZBMPCALLONEBITMAPJMPNNNNBMP:CALLZEROBITMAPNNNN:更换显示页面MOVAL,CS:RECENTPAGEMOVAH,05H11INT10HCLRSCREEN将光标位置保存MOVAX,CS:CURSORXMOVCS:LASTX,AXMOVAX,CS:CURSORYMOVCS:LASTY,AXCALLFUNCWAIT若图片到达边缘,改变运动方向CMPCS:CURSORX,0JZCHANGXCMPCS:CURSORX,290JBECMPYCHANGX:MOVAL,CS:DIRECXXORAL,1MOVCS:DIRECX,ALCMPY:CMPCS:CURSORY,0JZCHANGYCMPCS:CURSORY,160JBEOUT1CHANGY:MOVAL,CS:DIRECYXORAL,1MOVCS:DIRECY,AL根据运动方向确定下次贴图坐标OUT1:CMPCS:DIRECX,0JZSUBXADDCS:CURSORX,VXJMPCULYSUBX:SUBCS:CURSORX,VXCULY:CMPCS:DIRECY,0JZSUBYADDCS:CURSORY,VYJMPPRIENDSUBY:SUBCS:CURSORY,VYPRIEND:POPDXPOPCXPOPBX12POPAXRETPRINTENDP;向左贴图ONEBITMAPPROCNEARPUSHAXPUSHBXPUSHCXPUSHDXMOVDX,CS:CURSORYLEASI,CS:GRAPHMOVBX,35LOOPR1:PUSHBXMOVAX,27MOVCX,CS:CURSORXLOOPC1:PUSHAX设置像素MOVAH,0CHMOVAL,CS:[SI]MOVBH,CS:RECENTPAGEINT10HINCSIINCCXPOPAXDECAXCMPAX,0JNZLOOPC1INCDXPOPBXDECBXCMPBX,0JNZLOOPR1POPDXPOPCXPOPBXPOPAXRETONEBITMAPENDP;向右贴图13ZEROBITMAPPROCNEARPUSHAXPUSHBXPUSHCXPUSHDXMOVDX,CS:CURSORYLEASI,CS:GRAPHMOVBX,35LOOPR0:PUSHBXMOVAX,27MOVCX,CS:CURSORXADDCX,AXLOOPC0:PUSHAX设置像素MOVAH,0CHMOVAL,CS:[SI]MOVBH,CS:RECENTPAGEINT10HINCSIDECCXPOPAXDECAXCMPAX,0JNZLOOPC0INCDXPOPBXDECBXCMPBX,0JNZLOOPR0POPDXPOPCXPOPBXPOPAXRETZEROBITMAPENDP;延时处理函数FUNCWAITPROCNEARPUSHAXPUSHCX空循环14MOVCX,0FFFFHDELY:MOVAL,0MOVAH,0SUBAL,AHLOOPDELYPOPCXPOPAXRETFUNCWAITENDP;在CODESEGMENT中定义的数据段SAVINT9DW?,?LASTPAGEDB1;保存上一次绘制的页数RECENTPAGEDB2;保存当前动画绘制的页数LASTXDW0;保存上一次绘图的坐标LASTYDW0FLAGDB0;用于判断屏保程序是否已运行CURSORXDW0;保存当前绘图的光标位置XCURSORYDW0;保存当前绘图的光标位置YDIRECXDB0;横向绘图方向DIRECYDB0;纵向绘图方向CLKCNTDB100;进入屏保的时间;位图像素信息GRAPH DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,0DB0,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,015DB0,0,0,0,0,0,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0FH,0F
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (新教材)2026人教版三年级下册数学 3.2 周长 教学课件
- 2025 网络基础中量子通信与金融核心网络的防篡改传输课件
- 锡锑液流电池项目可行性研究报告
- 虚拟货币购买合同模板
- 2026年及未来5年市场数据中国汽车钛合金行业市场全景监测及投资战略咨询报告
- 刑法的基本概念原则和适用范围
- 2025 高中信息技术数据与计算之计算思维在河流水质数据监测分析中的应用课件
- 2025银屑病生物制剂达标治疗共识
- 审计报告练习试卷及答案
- 2025 高中信息技术数据与计算之数据在电商用户细分市场精准营销中的应用课件
- 马工程西方经济学(精要本第三版)教案
- 香港公司劳动合同协议
- 【初中 语文】第15课《青春之光》课件-2024-2025学年统编版语文七年级下册
- 2024年海南省烟草专卖局招聘考试真题
- GenAI教育在不同场景下的应用案例分析与演进路径
- 大连重工:中企华评报字(2024)第5436号资产评估报告
- 档案馆数字档案馆建设方案
- GB/T 44815-2024激光器和激光相关设备激光束偏振特性测量方法
- 《房颤抗凝新进展》课件
- 口腔颌面部肿瘤-血管瘤与脉管畸形的诊疗
- 康复质控中心建设思路和工作计划
评论
0/150
提交评论