课题名称测试任意程序运行时间一、设计内容与设计要求1.课程设计目的:《汇编语言程式设计》是计算机专业的重要的专业基础课,通过本课程设计使学生进一步巩固课堂所学,全面熟悉、掌握8086宏汇编语言程式设计的基本方法和技巧,进一步提高编写程式、阅读分析程式及上机操作、调试程式的能力。2.课题题目1)测量任意程式的运行时间2)读入一个文本文件并以DEBUG中的D命令格式显示。3)文件加密程式4)编写一个时钟程式5)画网格线6)画脉冲波图形7)用“*”画菱形框8)计算比赛成绩3.设计要求:1)在一周内学生须上机16小时以上,程式调试完后,须由指导老师在机器上检查运行结果,经教师认可后的源程式可通过打印机输出。2)分组及安排A.每组同学必须完成所指定的题目,每个同学须自己完成设计,应有不同的思路。B.按学号分组,第一组为1、9、17、25、33号同学,第二组为2、10、18、26、34号,第三组为3、11、19、27、35号,依次类推,其中第一组做第一题,第二组做第二题,依次类推。3)按规定格式完成课程设计报告,将其打印稿(A4纸)上交给老师存档。4)不得抄袭他人程式、课程设计报告,每个人应体现自己的个性设计,成绩的考核按上机表现、答辩成绩及课程设计说明书来综合评定。成绩分为优、良、中、及格、不及格五级分评定。二、进度安排第2周星期三14时:00分——18时:00分星期日8时:00分——12时:00分第3周星期一14时:00分——18时:00分星期三8时:00分——12时:00分星期三14时:00分——18时:00分星期五8时:00分——12时:00分目录一、题目----------------------------------------------------------------------------------------------2二、程序总体设计方案、思路---------------------------------------------------------------------2三、程序设计框图------------------------------------------------------------------------------------2四、源程序清单---------------------------------------------------------------------------------------3五、程序调试结果及分析-------------------------------------------------------------------------10六、设计总结------------------------------------------------------------------错误!未定义书签。2一、题目测量任意程式的运行时间要求:该程式驻留记忆体思路:DOS操作系统中,程式的调入运行及程式的终止均是通过相应的软中断来实现的。若取得相应软中断,记录下程式开始调入运行的时间及程式终止的时间,则可测量出该程式运行的时间。提示要点:与之相关的软中断分别为:程式开始执行:4BH号系统功能调用(INT21H)程式结束:INT20HINT27H00H、3lH、4CH号系统功能调用(INT21H)。二、程式总体设计方案、思路1、总体设计DOS系统中所有程式的开始和结束都会调用特定中断的相应功能,我们要测试某一程式运行时间,只要分别记录程式开始的系统时间以及结束时的系统时间。再将二者求差值,就可以算出该程式运行时间了。2、设计思路我们可以取得程式开始和结束时调用的相应的中断,在中断执行之前加入记录时间的功能并让被修改的中断程式驻留在记忆体当中,记录完之后再调回到原中断,既不影响中断调用又达到了记录的目的。在取得21号中断的时候先要对AH中的数字进行判断,再决定执行开始的计时还是结束的计时。开始计时和结束计时分别为两个子程式BEGIN和FINISH,BEGIN将即时时间存入变量中,FINISH先获取当前时间,再把变量里的开始时间相应寄存器,求两者的差值,这个过程中的借位判断较为复杂。求完差值之后就利用INT21H的2号功能输出HH:MM:SS:MS。三、程式设计框图3四、源程序清单;MainProgram:CODESEGMENTMESSDB'THEPROGRAMRUNNINGTIMEIS:$'TIME1DW0TIME2DW0SAVE1DD?SAVE2DD?SAVE3DD?MAINPROCFARASSUMECS:CODE,DS:CODESTART:PUSHCSPOPDSMOVAX,3521H;取出(21号类型的)中断向量INT21HMOVWORDPTRSAVE1,BXMOVWORDPTRSAVE1+2,ESPUSHDSMOVDX,OFFSETINT_21HMOVAX,SEGINT_21HMOVDS,AXMOVAL,21H;设置中断向量,返回被测程序MOVAH,25HINT21HPOPDS4MOVAL,27H;取出中断向量27号中断也是程序结束中断,保存在ES:BX中MOVAH,35HINT21HMOVWORDPTRSAVE2,BXMOVWORDPTRSAVE2+2,ESPUSHDSMOVDX,SEGINT_27HMOVDS,AXMOVDX,OFFSETINT_27HMOVAL,27H;设置27号中断向量MOVAH,25HINT21HPOPDSMOVAL,20H;取出中断向量,20号中断向量也是程序结束中断MOVAH,35HINT21HMOVWORDPTRSAVE3,BXMOVWORDPTRSAVE3+3,ESPUSHDSMOVAX,SEGINT_20HMOVDS,AXMOVDX,OFFSETINT_20HMOVAL,20H;设置中断向量,返回被测程序MOVAH,25HINT21HPOPDS5MOVDX,PGM_LEN/16+20;偏移地址;movdx,PGM_LEN;shldx,4;adddx,20MOVAX,3100H;结束并驻留程序INT21HMAINENDP;main子程序结束;Sub_ProgramandFunctionModule:INT_20HPROCNEAR;20H好中断服务程序CALLFINISH;计算程序结束时间JMPDWORDPTRCS:SAVE3INT_20HENDPINT_27HPROCNEAR;27H好中断服务程序CALLFINISHJMPDWORDPTRCS:SAVE2INT_27HENDPINT_21HPROCNEAR;21H好中断服务程序,将AH的内容与以下几个数字比较得到中断类型CMPAH,4BHJELP1CMPAH,00HJLELP2CMPAH,31HJELP2CMPAH,4CH6JELP2JMPLP3LP1:CALLBEGINJMPLP3LP2:CALLFINISHLP3:JMPDWORDPTRCS:SAVE1INT_21HENDP;StartRecordTimeSub_Program:BEGINPROCNEAR;记录程序开始执行的时间PUSHCXPUSHDXPUSHAXMOVAH,2CHINT21HMOVCS:TIME1,CX;时间记录1MOVCS:TIME2,DX;时间记录2POPAXPOPDXPOPCXRET;返回被测程序BEGINENDP;CalculatandExportFormattedTimeSub_Program:FINISHPROCNEARPUSHAXPUSHBXPUSHCXPUSHDX7CALLTIME_SUB;调用时间计算子程序MOVDX,OFFSETMESS;输出提示信息MOVAX,SEGMESSMOVDS,AXMOVAH,09HINT21HMOVAX,CS:TIME1ANDAX,0FF00HXCHGAH,ALCALLVIEWMOVDL,':'MOVAH,02HINT21HMOVAX,CS:TIME1ANDAX,00FFHCALLVIEWMOVDL,':'MOVAH,02HINT21HMOVAX,CS:TIME2ANDAX,0FF00HXCHGAH,AL;清楚AHCALLVIEW;调用显示程序MOVDL,'.'MOVAH,02H8INT21HMOVAX,CS:TIME2ANDAX,00FFHCALLVIEWPOPDXPOPCXPOPBXPOPAXRETFINISHENDP;DisplayTimeSub_Program:显示程序VIEWPROCNEARPUSHCXPUSHDXMOVCL,10DIVCLPUSHAXMOVDL,ALADDDL,30HMOVAH,2INT21HPOPAXMOVDL,AHADDDL,30HMOVAH,2INT21HPOPDXPOPCXRET9VIEWENDP;CalculatTimeSub_Program:计算时间差TIME_SUBPROCNEARMOVAH,2CHINT21HMOVBX,CS:TIME2CMPDL,BLJGELOP1DECDHADDDL,100LOP1:SUBDL,BLCMPDH,BHJGELOP2DECCLADDDH,60LOP2:SUBDH,BHMOVBX,CS:TIME1CMPCL,BLJGELOP3DECCHADDCL,60LOP3:SUBCL,BLSUBCH,BHMOVCS:TIME1,CXMOVCS:TIME2,DXRETTIME_SUBENDPPGM_LENEQU$-MESS10CODEENDSENDSTART五、程式调试结果及分析下图是运行了驻留程式之后再打开DOS系统中DEBUG功能对其进行测试。在运行了驻留程式马上会出现一个时间,这是驻留程式本身结束提取系统时间减去0,也就是本机时间。下图是打开delay程序并随意操作或者挂起一段时间后退出,发现输出了delay运行的总时间0小时0分4秒7毫秒(包括delay的挂起时间)。