汇编课程设计报告.doc_第1页
汇编课程设计报告.doc_第2页
汇编课程设计报告.doc_第3页
汇编课程设计报告.doc_第4页
汇编课程设计报告.doc_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编课程设计报告1 题目及要求题目:DOS下的屏幕保护程序要求:在一段时间内(如1分钟)没有任何键键入时,程序自动进入屏保(一个图画一直在不断的移动显示,图案任意),直到按任意键结束。2 程序设计分析设计要求DOS下在一定时间无键盘输入后自动进入屏保,按任意键退出。一 程序需要一个装载模块,设置相应的中断向量并驻留中断程序二 在中断子程序中需要设置变量timer来判断是否已经达到等待时间,若是,进入屏保。否则,继续等待。三 中断子程序中需要设置标志变量flagg,判断是否是第一层定时器中断,若是,进入屏保。否则,不进入。四 画图模块画出的是螺旋运动的不断变化的图案,所以需要设置方向标志dire来决定图案运动的方向 , 设置边界标志left ,right , top , bottom来判定图案是否到达边界,若是,需要改变方向,并改变上述标志的值。设置count 来判定一个螺旋周期的结束。设置tag来记录显示图案的类型。五 需要一个改变光标的模块,同时改变标志变量dire , left ,right , top , bottom , count的值。六 需要一个延迟模块,做时间延迟。七 在画图模块中还要不断检测是否有键盘输入,若有,退出屏保,若无,继续屏保。3 程序流程图4 核心模块功能介绍(详细代码见程序清单)一 设置光标模块;-cursor:ret;-功能介绍:这个模块在整个程序中相当的重要,整个图案的运行轨迹就是由它决定的。在该模块的入口处,根据此时方向标志变量的值,跳转去执行相应的操作,包括改变光标的值,改变方向标志dire的值,改变边界left , right , top , bottom 的值。二 显示图案模块;-show:ret;-功能介绍:根据tag中记录的字符类型,在设定好的光标位置显示相应的图案,经过一段时间延迟后,在该位置显示一个空字符,功能是擦除该图案,准备下一个字符的显示输出。三 延迟模块;-waitf:ret;-功能介绍:被其它模块调用,做时间延迟。四 画图模块;-print:ret;-功能介绍:包括清屏,置标志变量flagg,不断地显示字符,同时检测是否有键盘输入。若有键盘输入,复位各个标志变量,退出屏保。5 程序运行步骤一 进入装载模块,设置中断向量并驻留中断程序,然后返回DOS界面。二 在DOS界面下,若在设定的时间内没有任何键盘输入,定时器中断产生,进入屏保。若有键盘输入,计数器清0,从新开始计时。三 在屏保状态下,若无键盘输入,循环显示屏保动画。若有键盘输入,退出屏保,返回(二)6 设计过程中遇到的主要技术难点及解决方案一 响应键盘中断的同时,屏蔽同级中断问题描述:为了能检测到键盘中断,必须发出EOI命令,可是发出EOI命令意味着也能响应同级的定时器中断,所以在每隔一段时间后,定时器中断被不断地嵌套响应,结果是DOS界面被卡死。解决方案:设置一个标志变量,当进入屏保状态时就将它置1,退出屏保状态时置0,并在定时器中断入口处加一条判定指令,只有该标志变量为0时才能进入屏保。二 动态显示图案问题描述:我设计的动态图案是绕着屏幕做螺旋运动,于是要考虑,图案朝哪个方向运行,运行到什么地方要改变方向,怎么改变方向等问题解决方案:为图案的运动方向设置一个标志变量dire ,记录下一步要往哪个方向运动。并且在到达边界时改变该标志的值。设置边界值left , right , top , bottom , 来记录当前边界值,当图案运动到边界时,改变运动方向。程序中要动态地修改这四个边界值。三 动画何时停止,进入下一个显示周期问题描述:螺旋运动要在恰当的位置停止,并重新开始新一轮地螺旋运动。否则边界值将出现负数的情况,导致程序出错。解决方案:设置标志变量count ,当该标志达到设定的值时,开始新一轮的螺旋运动。7 个人体会虽然这只是一个很小很简单的程序,可是写下来后,感受还是挺多的。写完这个程序,发现自己对于中断的概念理解得不够透彻。代码写出来后,没有检测到任何错误,自己也看不出有任何的错误。可是一运行就是得不到想要的结果。要么是无法进入中断,要么是无法退出中断,要么是无法检测到键盘的输入,要么干脆直接死机。各种莫名其妙的问题,就是找不到问题的根源。后来,干脆把代码写成最精简的模式,为的是便于找出错误到底出在什么地方。我发现如果把检测键盘输入的那部分代码注释掉,程序就可以正常运行,不会出一些莫名其妙的问题。不过,这样一来,也就无法达到按任意键退出屏保的要求了。所以注释掉检测键盘输入的代码并不是解决问题的方法。那到底问题出在哪了呢?为什么加了键盘检测就会出问题?这个问题一直萦绕在我写程序的过程中,在网上找了很多资料,可是也都没有解决方法。一直到后来,和班里的一个同学一起讨论才发现,问题其实是出在EOI命令上。定时器的中断优先级比键盘要高,所以为了能响应来自键盘的中断,在检测键盘有无输入的代码前加入了这样一条指令:mov al , 20h out 20h , al 加上这条指令后,正在执行的中断程序就可以去响应同级或是低级的中断,而响应同级中断这一点却是一直被我忽略的!能响应同级中断意味着定时器中断将被无限地嵌套下去!每一个定时器中断程序在执行的过程中,只要时间达到设定要求(比如说5秒),就响应同级中断,嵌套一层定时器中断,而第二层定时器中断在到达一定时间后,又继续嵌套定时器中断,这个过程一直下去,DOS界面自然被卡死了。问题找到后,只要设置一个标志变量,当进入屏保状态时就将它置1,退出屏保状态时置0,并在定时器中断入口处加一条判定指令,只有该标志变量为0时才能进入屏保。这样一来,就不会出现无限嵌套的情况了。将代码一改,运行一下,果然正确地进入了屏保,并在按下任意键后退出,一段时间没有输入后又自动进入屏保。这个课程设计让我认识到自己对于中断这个概念的理解还是不够透彻的,也让我更深切地体会到了用汇编来写程序一定要对底层硬件有一定的了解,否则一段看似完全正确的代码却有可能永远运行不出我们想要的结果。8 参考文献IBM-PC汇编语言程序设计(第2版)9 程序清单;-;0807050224 邱嘉和 试验082;-assume cs:code,ds:datacode segmentstart: data segment timer db 0 ;记录进入中断的等待时间 flagg db 0 ;初始为0,进入中断后置1,避免在EOI之后同级中断再次发生 left db 0 ;left,right,top,bottom是图案运动时的外边框位置, right db 79 ;程序中动态地修改这些值 top db 0 bottom db 24 dire db 1 ;运动方向,初始值是1。1:向下 2:向上 3:向右 4:向左 count db 0 ;计数器,当count为4时,重头开始转圈 tag db 1 ;记录显示图案的类型 data ends;-;进入装载程序,设置中断向量并驻留程序jmp far ptr install;-;中断程序入口int1c: sti ;开中断 mov ax,data mov ds,ax mov al,timer inc al ;timer加1,若达到设置的等待时间,进入画图程序 mov timer,al cmp al,90 ;等待时间为5秒 jna continue mov al,flagg ;若flagg为0,进入画图程序 cmp al,0 ;若flagg为1,说明已经有一个同级的中断在运行, jnz continue ;不再进入画图 call print ;画图 continue: iret;-;改变光标位置,使光标蛇型运动cursor: mov ax,data mov ds,ax cmp dire,1 jz incdh ;若方向标志dire为1,跳转:incdh,使dh加1。下同 cmp dire,2 jz decdh cmp dire,3 jz incdl cmp dire,4 jz decdl jmp exitincdh: ;使光标向下走 inc dh cmp dh,bottom jnz exit mov dire,3 ;光标到达底部,改变方向标志dire,使其向右 sub bottom,4 ;同时bottom减4,使图形能蛇型运动 add left,4 add count,1 ;该计数器用于控制画图的终结 jmp exitdecdh: ;使光标向上走 dec dh cmp dh,top jnz exit mov dire,4 ;光标到达顶部,改变方向标志dire,使其向左 add top,4 ;同时top减4,使图形能蛇型运动 jmp exitincdl: ;使光标向右走 inc dl cmp dl,right jnz exit mov dire,2 ;光标到达右部,改变方向标志dire,使其向上 sub right,4 ;同时right减4,使图形能蛇型运动 jmp exitdecdl: ;使光标向左走 dec dl cmp dl,left jnz exit mov dire,1 ;光标到达左部,改变方向标志dire,使其向下 jmp exitexit: ret;-;显示图案,一次显示一个,并根据tag来决定图案的类型show: mov ax,data mov ds,ax call cursor ;置光标位置 mov bh,0mov ah,2int 10hmov al,tag ; 根据tag记录的类型输出 mov bl,00000111bmov cx,1mov ah,9int 10h ;在光标位置显示字符和属性call waitf ;时间延迟mov al,00h ;在光标位置显示空字符,即擦除上面显示的字符mov cx,1mov ah,0ahint 10hret;-;延时子程序,作用:时间延迟waitf: push axpush cxmov cx,65500wait1:in al,61hand al,10hcmp al,ahje wait1mov ah,alloop wait1pop cxpop axret;-;画图程序,不断显示字符,并检测是否有键盘输入。若有,退出中断print: mov ax,datamov ds,axmov ah,6 ;清理屏幕mov al,0mov bh,7 mov ch,0mov cl,0mov dh,24mov dl,79int 10h mov al,20h out 20h,al ;EOI mov al,1 ;置flagg,使同级中断(即定时器中断)不能产生, mov flagg,al ;只去响应键盘中断 mov dx,0 ;图案初始位置(0,0)next:call cursor ;设置光标位置 cmp tag,6 ;字符类型循环变换,ASCII码 jnz nexx mov tag,0 nexx: add tag,1 cmp count,4 ;若count为4,图案完成一个周期的运动, jnz nex ;复位各个标志,重新显示动态图案 mov dx,0 mov dire,1 mov count,0 mov left,0 mov right,79 mov top,0 mov bottom,24 nex: call show ;显示图案、mov ah,1h ;检测键盘输入int 16hjnz keypressedjmp nextkeypressed: mov al,0 ;检测到有键盘输入,复位各个标志 mov flagg,al mov al,0 mov timer,al mov dx,0 mov dire,1 mov count,0 mov left,0 mov right,79 mov top,0 mov bottom,24

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论