汇编报告.docx
- 文档编号:8763979
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:12
- 大小:101.67KB
汇编报告.docx
《汇编报告.docx》由会员分享,可在线阅读,更多相关《汇编报告.docx(12页珍藏版)》请在冰豆网上搜索。
汇编报告
课程设计报告
课程名称汇编语言程序设计
课题名称中断应用程序设计
专业计算机科学与技术
班级计算机0802
学号
姓名
指导教师唐北平李远辉罗敬
2010年9月5日
湖南工程学院
课程设计任务书
课程名称汇编语言程序设计
课题中断应用程序设计
专业班级计算机0802
学生姓名
学号
指导老师唐北平李远辉罗敬
审批唐北平
任务书下达日期2010年9月5日
任务完成日期2010年9月10日
一、设计内容与设计要求
1.设计内容:
通过本周的课程设计,学生能够巩固所学的基础知识,并能够使学生更加熟练运用汇编程序设计语言来掌握综合汇编程序设计的方法和过程,以及为设计其它应用软件提供帮助,进而提高学生的软件设计能力。
1、编制一计算比赛成绩的程序,要求完成以下功能:
(1)9名评委,每个评委给分范围为0~10(整数);
(2)9名评委给分中,去掉一个最高分和一个最低分,剩余7名评委的平均分即为参赛者的得分(精确到小数点二位);
(3)将得分在光标位置处显示出来。
2、编制一程序,要求接收从键盘输入的一个班的学生成绩,并存放于30字的grade数组中,各数据的格式为:
学号,成绩1,成绩2,…,成绩5
然后根据grade中的学生成绩,把学生名次填入rank数据组中,并显示出来,格式为:
学号,名次
3、利用INT1CH(大约每秒中断18.2次)编写一个中断驻留程序,要求在屏幕的右上角显示计算机中当前系统时间,显示格式为
时:
分:
秒:
1/100秒
4、输入一个菱形的两条对角线长,在屏幕上用‘*’号画出一个彩色的菱形。
5、设置图形方式并显示彩条,要求:
选择背景色为蓝色,调色板为0,然后每行显示一种颜色,每四行重复一次,一直到整个屏幕都显示出彩条
2.设计要求:
掌握结构化程序设计的主体思想,以自顶向下逐步求精的方法编制程序解决一些实际的问题,为将来编写软件积累一些典型的案例处理经验。
1.设计正确,方案合理。
2.界面友好,使用方便。
3.程序精炼,结构清晰。
4.设计报告5000字以上,含程序设计说明,用户使用说明,源程序清单及程序框图。
5.上机演示。
6.按学号顺序选课题号,并在规定的时间内独自完成相关课题的C源程序编写、调整和运行。
源程序及编译生成各文件均保存在软盘中;
7.按本任务书的要求,按附录的要求编写《课程设计报告》(Word文档格式)。
并用A4的复印纸打印并装订;
二、进度安排
第1周
星期28:
00-11:
30
星期38:
00-11:
30
星期48:
00-11:
30
附:
课程设计报告装订顺序:
封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。
正文的格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
正文的内容:
一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。
正文总字数要求在5000字以上(不含程序原代码)。
目录
一.封面………………………………………………………1
二.设计内容与设计要求……………………………………3
1.设计内容………………………………………………3
2.设计要求………………………………………………3
三.进度安排…………………………………………………4
四.正文………………………………………………………6
1.课题的主要功能与特点…………………………………6
2.课题的功能模块划分……………………………………7
3.主要功能的实现…………………………………………7
4.程序调试…………………………………………………9
5.总结……………………………………………………10
五.评分………………………………………………………12
六.附件………………………………………………………13
一.课题的主要功能和特点
本课题主要是要完成一个中断驻留程序,要求在屏幕的右上角上显示当前系统时间,时间格式为时:
分:
秒。
完成这个程序的关键就是实现中断驻留功能。
所谓中断就是当某个事情发生时,CPU暂停正在执行的程序而转去处理临时发生的事情,处理完后再返回到被中断程序的断点处,继续往下执行。
中断也有优先级,CPU对多个发出中断请求的外部设备进行优先判断,然后中断优先级最高的那个外设。
驻留程序是一种特殊应用程序,它在装入内存运行后,其部分代码仍然驻留在内存,当该段代码被激活时,它又进入运行状态。
常用的驻留程序是作为某个中断处理程序的一部分,其激活条件就是系统产生了此中断的中断请求。
DOS是一个单用户的操作系统,它的核心程序是不允许重入的,说的具体一点,如果我们要编一个递归调用的程序,我们会把参数放在堆栈里,而不是用设置变量的方法,这样在下一层程序返回时,不会有临时变量被改变的危险,而DOS在处理中断INT21H时使用的临时数据是放在内部数据区内的,如果在一个INT21H过程中再发生另一个INT21H,在第二个INT21H执行完以后回到第一个INT21H时,原来保存的临时数据就不是原来的样子了,而是第二个INT21H执行完后留下的‘垃圾’,编一个内存驻留程序,随时弹出一个窗口执行INT21H功能,要想不死机,就必须先解决DOS的重入问题。
解决重入问题有两种方法,第一种是在进入INT21H前人为保存DOS的内部数据结构到自己的缓冲区,在执行完后恢复,这种方法依赖于DOS的内部资料,而且不同的DOS版本的数据结构、数据位置是不一样的,使用起来有相当的难度,而且对新版的操作系统的兼容程度是未知的。
常用的办法是在要激活驻留程序前,先检测DOS的状态,如果DOS是空闲的,就可以马上激活,如果DOS忙,就等到DOS空闲后再激活。
本文就是讨论检测DOS状态的方法。
实际上,DOS本身已经或多或少的考虑了这个问题,它本身有个InDOS标志,在执行DOS功能时,它会把标志+1,退出时-1,如果检测InDOS不是0,就说明DOS的某些功能在执行中。
DOS功能INT21H的34H子功能即是得到InDOS标志的地址,在这个标志前一个字节是DOS紧急错误标志。
在DOS忙判断上有两个特殊情况,一是DOS在紧急错误时会减少InDOS标志,所以检测到InDOS为0时还要确定错误标志为0,进入DOS才是安全的,二是有些DOS功能本身就允许重入,它们是一些不用到内部数据区的输入命令等,如等待命令输入时DOS执行的是输入子功能,这时的InDOS为1,但实际上是允许进入DOS的,在这中情况下,DOS会不停的发INT28H中断,原来的INT28H功能是不做任何事马上返回。
用户可以在INT28H中挂上自己的程序而不必担心DOS重入。
完成该课题的系统时间的功能,需要不断的中断以同步显示系统时间,这里我们需要利用INT1CH,平均每秒中断18.2次,以这样的频率同步显示系统时间足以满足人们的视觉效果。
完成系统时间同步的前提,还需要读取系统时间和显示系统时间,其具体实现,下面一一解释。
二.课题的功能模块划分
大体来说,该课题的的功能模块很简单,就是在定义好数据之后,完成读取系统时间和显示系统时间两大模块。
但是具体来看,本课题包括获取原中断类型,保存原中断类型,设置新的中断类型,执行中断处理程序,应用堆栈保护现场,读取系统时间,然后分别将时间的BCD码转换为字符,在制定内存位置写入时间并显示时间,最后恢复现场,中断返回。
这样的条理很清晰,在编写该程序中,我应用了一个子函数具体实现中断的保存与设置还有现场保护和系统时间的写入与输出。
这样以来,程序的可读性更强,条理更清晰。
其实单就功能而言,该课题只有一个功能,那就是同步显示系统时间在右上角上,做到这一步其实也不难,具体分细,可以按照其主体功能实现方法来分成多个模块。
在规划好本课题的具体模块之后,程序可谓一气呵成。
在分析功能及构思主体结构之后,就该具体分析各个模块的实现了。
具体功能模块图如下:
该课题,我采用调用子程序的思想来完成,主体功能都通过子程序模块完成,中断模块,读取系统时间模块,显示系统模块,现场保护模块及现场恢复模块。
通过调用子程序的方法,使本程序更加具有条理性,其中现场保护是为了使寄存器里有用的数据保存起来,让寄存器进行其他运算,现场恢复是使之前保护起来的有用数据恢复,读取系统时间并使屏幕显示的时间与系统时间同步变化,这就不得不使用中断模块,运用INT1CH,可以平均每秒中断18.2次,足以满足视觉上的同步。
另外还有一些细节,比如将显示时间置于右上角,设置字体颜色等。
三.主要功能的实现
这个程序主要是要实现获取系统时间,和现实系统时间。
定好好数据之后,在DOS环境下,用2C号取系统时间的功能,将时赋值给CH,将分赋值给CL,将秒赋值给DH,将1/100赋值给DL,具体实现如下:
MOVAH,2CH
INT21H
MOVHOUR,CH
MOVMINUTE,CL
MOVSECOND,DH
在DOS环境下,使用25号功能键设置中断向量,DS:
DX=中断向量,AL=中断类型号,接下来完成驻留内存。
MOVAX,251CH
INT21H
MOVAH,1
INT21H
MOVAX,3100H
设置显示时间在屏幕上的位置,
MOVDX,(PRG_LEN+15)/16+16
INT21H
然后进行现场保护,接下来便用一个子函数INTIC来具体实现系统时间显示,将从系统中读取的时,分,秒分别送入内存T到T7,然后块装入指令把SI指向的存储单元读入累加器,其具体实现如下:
C1:
MOVAL,HOUR
CBW
MOVDL,0AH
DIVDL
ORAX,3030H
MOVWORDPTR[T],AX;将小时送入到[T]
MOVAL,MINUTE
CBW
DIVDL
ORAX,3030H
MOVWORDPTR[T+3],AX;将分钟送入到[T+3]和[T+4]
MOVAL,SECOND
CBW
DIVDL
ORAX,3030H
MOVWORDPTR[T+6],AX;将秒钟送入到[T+6]和[T+7]
MOVCX,8
MOVAX,0B800H
MOVES,AX
LEASI,[T]
MOVDI,144
C3:
LODSB;块装入指令把SI指向的存储单元读入累加器
STOSW;从AX读取的字送入到ES:
DI
LOOPC3
CEND:
IRET
INT1CENDP
以上是该课题的主要功能实现,该课题完成的总流程图如下:
从图中可以看出该课题的流程不是很复杂,首先获取原中断类型1CH,然后保存原中断类型,设置新的中断类型,执行处理程序,接着利用堆栈保护现场对有用寄存器中数据进栈,然后读取系统时间,分别将时间BCD码转换为字符,然后在指定位置显示从系统读取的时间,最后出栈恢复现场和中断返回。
四.程序调试
虽然程序的具体思维和实现已经掌握,但是在调试程序的过程中遇到了不少的麻烦,这里就得考验我的耐心与细心了,还另一方面考验了我对书本知识的具体掌握情况,下面具体举些例子来分享我所犯下的错误。
刚开始写的程序根本无法运行,总会有手误之类的错误,将上下同一个变量写成不同的字母,导致运行错误,这样错误还很多,经过耐心的逐个检查,弄了不少时间才把这样的错误给消灭完,可见细心很重要。
在一次编译过程中出现了下图这样的错误提示信息,看起来似乎很多,刚开始我也看不懂这样的错误提示,对一些术语认识也不够,在进行多方检查与校对之后,发现其实错误的只有一个,那就是有一个变量没有定义,看看下图,错误地址全部集中在A2006,很简单一个错误,却耗费了我很多时间。
之前还有一次编译中,我截下了下面这个图,运行还是没有错误,能够运行,但是在DOS窗口出现之后,立马跳出一个提示窗口说遇到无效指令,仔细琢磨,首先这个程序能够运行,肯定没有语法错误,有可能是寄存器里的数据发生紊乱才造成这样的情况。
在问过同学之后也没有找出错误,这下可把我急坏了,我便对各个寄存器里的数据一步一步的分析,最后发现寄存器的使用过程中,一些需要用的数据被覆盖了,我想到解决这一要求的解决方法,那就是使用对各个寄存器进行堆栈以保护现场。
在经过多番努力之后终于得到了想要的运行结果:
在调试过程中,遇到了不少麻烦,也收获了不少,认识编译环境中错误提示信息很重要,今后一定要多运行程序,逐步认识错误提示信息的含义,以提高调试程序的效率,还要对各种编程技巧熟练掌握,这次,像保护现场这样的技巧,我就能够熟练掌握了。
五.总结
为期一周的80X86汇编语言课程设计就结束了,这次课设给了我很大的启发和锻炼,本次汇编是应用平时学习的汇编命令编写一个比较简单的中断驻留程序,很大程度上考验了我们基础知识的掌握和具体动手写代码的能力,在做课设的过程中发现了自己很多基础知识并不牢固,通过复习使我更深刻的理解的汇编的具体知识,而且还使我提高了具体解决问题的能力,也磨练了我沉稳的心境,当在敲打繁琐的代码过程中很容易产生厌烦心理。
在编写代码的过程中,最重要的是要有整体思维,构造程序的结构是完成一个好的程序的重中之重,一旦有了这个整体思维,写起代码来便得心应手,初步完成的程序很凌乱,但是在和做同一课题的同学讨论之后,通过子程序的方法使程序更加具有调理性,增强了程序的可读性。
运用DOS功能调用,和BIOS调用能够使程序更加丰富多彩,这次我用了一些没有在课堂上学到的调用,使自己熟悉了这些调用,当然还有相当大一部分这样的调用自己是不熟悉的,这也只有靠在今后的学习中多看多用多写了。
这次课设使我加深了对汇编命令的认识,汇编命令很繁琐,需要在实践中记忆并掌握这些代码,如果说让我死记硬背这些命令,一定很容易弄混淆的,这也进一步说明在学习汇编的过程中间,经常练习写程序这个环节很重要。
还更加熟悉了汇编语言程序设计的基本技术,也学会了利用子程序思想使程序更具条理性,可读性。
重点理解了中断的含义与在具体实践过程中应用中断调用的能力。
另外,我还深深认识到了具体实践的重要性,整天学习书本知识不仅容易产生厌烦感,而且还很难认识到自己的不足,在书本中整天泡着便会产生以为把所有汇编命令熟悉之后就能编好程序的错觉,其实学习理论知识就是为具体实践服务的,通过实践来巩固书本理论知识不失为一个学习的好方法。
这次课设还使我对进一步学习汇编语言的热情有所提高,当程序运行成功的那一刹那,那种喜悦之情是溢于言表的。
古人说要不耻下问是很有道理的,有时候一个人的思维很有局限,很难发现一些错误所在,在一筹莫展时试图听听其他人的意见是很有帮助的,但是前提是自己在一定深思熟虑之后确实很难找到答案的情况下。
汇编语言是可以直接和硬件打交道的,运用这样的语言写的代码,运行效率更高,这也为今后学习单片机技术打下坚实的基础,我希望在未来某一天自己能运用汇编只是做一项自主专利的单片机模型。
还有细心也是一个非常需要注意的问题,在敲打代码过程中能够细心一点,可以节省很多时间,比如就在这次课设过程中,由于手误导致的错误可谓层出不穷。
有时候在思绪非常清晰的情况下,代码生成速度很快,敲打速度跟不上,于是就产生了厌烦心理,频频出错,这种情况很不好,在今后的学习中一定要戒躁,学会如何控制自己的心绪。
其实学习中也能提到到很多哲理,能够很好的起到修身养性的作用,关键是看一个人的心态问题,巧学秒学心态最重要。
总的来说,这次课设使我受益匪浅,不仅复习并掌握了书本知识,还提高了自己动手写代码的能力,更加深刻的理解了实践是检验真理的唯一标准这句至理名言,在今后的学习中,对于学习软件代码这块,一定要多动手写代码,多看好的程序,学习其中的优点,同时也要找出其中的不足。
将其他好的程序的独到之处应用到自己写的代码中去,久而久之,提高自己编程的能力。
另外编好的程序一定要多上机调试,不要看着好像正确就置之不理了,其实有时候很多地方自己是很难找到错误之处的,只有具体上机调试才能及时发现问题,解决问题。
计算机科学与技术系课程设计评分表
课题名称:
中断应用程序设计
项目
评价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日期:
(注:
1.此页附在课程设计报告之后;2.综合成绩按优、良、中、及格和不及格五级评定。
)
附件
CODESEGMENT
ORG100H
ASSUMECS:
CODE,DS:
CODE
HOURDB0
MINUTEDB0
SECONDDB0
COUNTDB18
TDB"00:
00:
00"
START:
MOVAX,CODE
MOVDS,AX
MOVAH,2CH
INT21H
MOVHOUR,CH
MOVMINUTE,CL
MOVSECOND,DH
LEADX,INT1C
MOVAX,251CH
INT21H
MOVAH,1
INT21H
MOVAX,3100H;驻留内存
MOVDX,(PRG_LEN+15)/16+16
INT21H
INT1CPROCFAR
DECCS:
COUNT
JZC2
JMPCEND
C2:
PUSHDS
PUSHES
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
PUSHCS
POPDS
MOVCOUNT,18
INCSECOND
CMPSECOND,60
JBC1
MOVSECOND,0
INCMINUTE
CMPMINUTE,60
JBC1
MOVMINUTE,0
INCHOUR
CMPHOUR,24
JBC1
MOVHOUR,0
C1:
MOVAL,HOUR
CBW
MOVDL,0AH
DIVDL
ORAX,3030H
MOVWORDPTR[T],AX;将小时送入到[T]
MOVAL,MINUTE
CBW
DIVDL
ORAX,3030H
MOVWORDPTR[T+3],AX;将分钟送入到[T+3]和[T+4]
MOVAL,SECOND
CBW
DIVDL
ORAX,3030H
MOVWORDPTR[T+6],AX;将秒钟送入到[T+6]和[T+7]
MOVCX,8
MOVAX,0B800H
MOVES,AX
LEASI,[T]
MOVDI,144
C3:
LODSB;块装入指令把SI指向的存储单元读入累加器
STOSW;从AX读取的字送入到ES:
DI
LOOPC3
POPDI
POPSI
POPDX
POPCX
POPBX
POPAX
POPES
POPDS
CEND:
IRET
INT1CENDP
PRG_LENEQU$-START
CODEENDSENDSTART
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 报告