当前位置:文档之家› 显示时间日期

显示时间日期

课程设计说明书课程设计题目显示系统日期时间的程序开发1.课程设计的目的和内容内容:要求完成一个显示系统当前日期和时间的程序,即通过按下键盘上某个按键就可以显示系统的日期和时间或者终止程序。

(比如:在出现的提示信息后输入小写字母“d”,显示系统当前日期;输入小写字母“t”,显示系统当前时间;输入小写字母“q”,结束程序。

)此程序涉及到对DOS和BIOS的常用功能的调用,要求学生掌握使用汇编语言对I/O中断的使用。

目的:(1)使学生能够较全面地巩固和应用课堂中所学的基本理论和程序设计方法,能够较熟练地完成汇编语言程序的设计和调试。

(2)培养学生综合运用所学知识独立完成汇编程序课题的能力。

(3)培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。

(4)提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。

(5)培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。

(6)对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。

2.开发环境:(1)软件环境:DOS系统。

(2)硬件环境:普通PC机。

3.功能分析(1)总体设计功能工作原理:在DOS环境下完成,先利用BIOS功能调用中显示器驱动程序的00H类型调用,设置显示器的显示模式为80*25彩色。

在屏幕中央显示提示信息(提示用户输入“d”或“t”或“q”)。

然后对用户输入的字母进行判断,利用分支程序分别调用不同的子程序。

两个子程序的功能分别是显示当前日期(用2AH的DOS功能调用来取日期),显示当前时间(用2CH的DOS功能调用来取时间)。

必须用到的DOS功能调用:取当前系统日期:功能号为2AH,返回值送入CX,DX寄存器中。

取当前系统时间:功能号为2CH,返回值送入CX,DX寄存器中。

1.部分程序设计及功能(1)文本显示在显示彩色文本时,属性字节能够选择前景(显示的字节)和背景的颜色;每个字符可以选择16种颜色中的一种,背景有8种颜色可以选择;在程序代码中,我设置了显示绿色,代码部分如下:LOP:PUSH CX;;;;;;;;;;;;;;;;;;;;;;;;;;MOV AL,[DI]ADD AL,30HMOV BL,02H(2)时间日期转化数制在定义堆栈寄存器,按循环要求读取系统日期项,由于读取的日期项是二进制代码,因此需调用DIVNUM PROC子程序转换为BCD码,其中部分代码如下:DIVNUM PROC NEARPUSH CXAGAIN: MOV BL,0AHDIV BLMOV [DI],AHMOV AH,0INC DILOOP AGAINDEC DIPOP CXRETDIVNUM ENDP(3)光标设置利用INT 10H的功能1是光标显现或者关闭,这个功能也控制光标行的开始和结束,也就是控制光标的大小;INT 10H的功能2设置光标位置,光标位置的行号设在DH寄存器中,列号设在DL中;BH中必须包含被输出的页号,对单色显示器来说,页号总是0;INT 10H功能3是读光标位置,页号也必须在BH中指定,此功能把光标位置的行号回送给DH,列号回送给DL;程序中的代码部分如下:MOV BH,0MOV CX,1MOV AH,9INT 10HMOV BH,0MOV AH,3INT 10HINC DLMOV AH,2INT 10H(2)详细设计功能本程序通过调用不同的子程序来实现系统功能,以下为各主要子程序的详细设计。

1.日期子程序系统通过条用时间子程序来实现获取并显示当前时间的功能。

此程序主要涉及三个重点:(1)DOS和BIOS的常用功能的调用。

(2)掌握使用汇编语言对I/O中断的使用。

(3)ACS码与BCD码数制上的转化。

子程序的程序流程图如下图3-1 日期子程序的流程当键盘输入字母“D”时所调用执行的子程序;首先定义堆栈寄存器,按循环要求读取系统日期项,由于读取的日期项是二进制代码,因此需调用DIVNUM PROC子程序转换为BCD码,然后接着调用LISNUM PROC予以显示;执行完DIVNUM PROC子程序后调用DIS1 PROC显示一个分隔符”-”,完成一个日期项的显示,然后再循环去读取其他日期项;最后返回主程序执行主程序。

子程序的关键代码:MOV DX,OFFSET BUF2MOV AH,9INT 21HMOV AH,2AHINT 21HMOV YEAR,CXMOV MON,DHMOV DAY,DLMOV DI,OFFSET BUFMOV AX,YEARMOV CX,4CALL DIVNUMCALL LISNUMCALL DIS1MOV AL,MONMOV AH,0MOV CL,2CALL DIVNUMCALL LISNUMCALL DIS1MOV AL,DAYMOV AH,0MOV CL,2CALL DIVNUMCALL LISNUMCALL ENTERJMP START2.时间子程序该时间子程序与日期子程序的主要功能以及主要实现方法都十分相识,同样涉及到汇编语言中DOS和BIOS的常用功能的调用,汇编语言对I/O中断的使用以及ACS码与BCD码数制上的转化。

系统主程序通过调用该子程序实现要求的功能。

程序的流程图如图3-2。

图3-2 时间子程序流程图当键盘输入字母“T”时所调用执行的子程序;首先定义堆栈寄存器,按循环要求读取系统时间项,由于读取的日期项是二进制代码,因此需调用DIVNUM PROC子程序转换为BCD码,然后调用LISNUM PROC予以显示;执行完DIVNUM PROC子程序后调用DIS2 PROC显示一个分隔符”:”,完成一个日期项的显示,然后再循环去读取其他日期项;最后返回主程序执行主程序。

其执行过程与执行日期子程序相似。

子程序关键代码:MOV DX,OFFSET BUF3MOV AH,9INT 21HMOV AH,2CHINT 21HMOV HOUR,CHMOV MIN,CLMOV SEC,DHMOV DI,OFFSET BUFMOV AL,HOURMOV AH,0MOV CX,2CALL DIVNUMCALL LISNUMCALL DIS2MOV AL,MINMOV AH,0MOV CX,2CALL DIVNUMCALL LISNUMCALL DIS2MOV AL,SECMOV AH,0MOV CX,2CALL DIVNUMCALL LISNUMCALL ENTERJMP START3.DIVNUM 子程序在定义堆栈寄存器,按循环要求读取系统日期和时间项,由于读取的日期项是二进制代码,因此需调用DIVNUM PROC子程序转换为BCD码。

在系统运行的过程中,通过时间子程序和日期子程序对DIVNUM 子程序的调用来实现ACS码和BCD码的数制转化。

4.LISNUM 子程序时间子程序和日期子程序对LISNUM子程序的调用来实现显示输出日期或者时间的数字。

5.DIS1子程序DIS1子程序在程序中用来将显示的年月日用“-”隔开,如显示“20100823”时加入分隔号,即可显示为“2010-08-23”。

该子程序在显示日期时调用即可。

程序关键代码:MOV DL,'-'MOV AH,2HINT 21HRET6.DIS2子程序功能类似DIS1子程序,将显示的小时分钟秒钟用“:”隔开,如显示“214013”时加入分隔号,即可显示为“21:40:13”。

该子程序在显示时间时调用即可。

程序相关代码:MOV DL,':'MOV AH,2HINT 21HRET7. ENTER子程序该子程序用来显示输出字符。

程序关键代码:PUSH DXPUSH AXMOV DL,0AHMOV AH,2HINT 21HMOV DL,0DHMOV AH,2HINT 21HPOP AXPOP DXRET8.EXIT子程序带返回码终止程序。

四:序的调试与运行结果说明1.调试程序:(1)编译源文件,命名为shengsi.asm 。

(2)采用命令格式,masm shengsi.asm将生成一个OBJ文件,检查源程序中的错误,如有改正。

(3)键入连接命令:link shengsi.obj,将会生成一个exe可执行文件。

(4)键入shengsi.exe回车,即可显示结果。

该过程见图4-1。

程序编译成功程序连接成功图4-1 程序调试过程2.实验结果分析通过以上的结果显示可以看出结果成功完成本次课程设计的目的和任务,本次课程设计严格按照课程设计任务的要求:运行可执行程序shengsi.exe,在出现的提示信息中输入大写字母“D”,可显示系统当前日期;输入大写字母“T”,可显示系统当前时间;输入大写字母“Q”,可结束程序;若不是相关字符,则从头执行程序。

实现过程如图4-2。

正确运行程序运行结果:显示当前时间和日期图4-2 程序显示过程3. DEBUG调试在验证程序正确显示后,为了分析各寄存器值的变化以及单步执行指令,使用了DEBUG命令进行调试。

调试过程如图4-3。

DEBUG调试过程图4-3 DEBUG调试过程五:课程设计总结这次汇编课程设计为我们提供了与众不同的学习方法和学习机会,让我们从传统的被动授学转变为主动求学;从死记硬背的模式中脱离出来,转变为在实践中学习,增强了领悟、创新和推断的能力。

掌握自学的方法,形成工程理论整体模式,使工作、学习、生活都步入系统化流程;思考方式成熟,逻辑性规范、明确。

这些方法的提高是终身受益的,我认为这难得的一周,让我真正懂得了生活和学习的基本规律。

通过这次课程设计,我们对汇编各个函数以及语句有了进一步的了解,对各个语句的功能有了更深刻的认识和体会,平时上课的理论知识只是停留在理论的层面,只有通过了这样的试验才能更好的体会到,做到了理论和实际的相结合,使理论知识真正运用到了实践中去。

在课程设计过程中,同组人员之间相互合作,共同研究使我更加坚信了团体的力量。

在团体的共同协作和努力下,任何的难题都可以被解决。

在这次课程设计中,对调用子程序、程序循环、DOS及BIOS功能调用等知识的理解更为加深,在运用的时候更为熟悉了;还有在运用堆栈的时候我总是出错,但通过这次课程设计,我对堆栈了解加深了。

紧张忙碌的课程设计虽然在历经一个周的时间后结束了,完成了课程设计的任务,但是从中发现的问题也是值得去深思的。

我想经过这一个周的课程设计所发现的问题对我们会有很大的启示,在以后的学习中也会大有帮助。

在以后的学习中我会不断的改进学习方法,在实践中学习,不断提高自我,完美自我,全面提高自己。

六:参考文献[1]王元珍,曹忠升,韩宗芬编著.汇编语言程序设计[M].湖北:华中科技大学出版社,2005年4月.[2]王成端,李晓波编著.汇编语言程序设计[M].北京:高等教育出版社,2003年8月.[3]孙琦,郑硕编著.汇编语言程序设计复习与考试指导(第二版)[M].北京:高等教育出版社,2006年7月.[4] 沈美明,温冬婵.IBM—PC汇编语言程序设计(第2版)[M]. 北京:清华大学出版社,2001年8月.[6]詹仕华等编.汇编语言程序设计[M].北京:中国电力出版社. 2008年2月.[7]詹仕华等编.汇编语言程序设计习题解答及课程实验、设计辅导[M].北京:中国电力出版社. 2008年2月.[8]杨路明等编.汇编语言程序设计[M]. 长沙:中南大学出版社,2005年8月.七:源程序清单以下为程序的主要代码://***************定义堆栈段***************//STACK SEGMENT STACKDW 200 DUP(?) //定义200个字的空间STACK ENDS//***************定义数据段***************//DATA SEGMENTYEAR DW ? //定义年MON DB ? //定义月DAY DB ? //定义日HOUR DB ? //定义小时MIN DB ? //定义分钟SEC DB ? //定义秒钟BUF DB 8 DUP(?) //定义8字节缓存存放日期和时间数据BUF1 DB 'WELCOME TO THE SHOWTIME PROGRAM !PLEASE INPUT HERE(D FOR DATE,T FOR TIME,Q TO QUIT): $'//显示提示:键入D显示日期,键入T显示时间,键入Q退出程序BUF2 DB 'THE DATE OF TODAY IS : $'BUF3 DB 'THE TIME RIGHT NOW IS: $'BUF4 DB 'BYE!THANKYOU!$'DATA ENDS//***************以下皆为定义代码段***************//CODE SEGMENTASSUME CS:CODE,DS:DATA//***************主程序***************//START: MOV AX,DATAMOV DS,AXMOV BH,1;;;;;;;;;;;;;;;;;;;;; //设置页号MOV DH,0 //行号MOV DL,0 //行号MOV AH,2 //BIOS中断10的2号功能调用INT 10H;;;;;;;;;;;;;;;;;;;;;; //使用BIOS 的10H中断的2号功能调用来置光标位置MOV DX,OFFSET BUF1MOV AH,09H //显示字符串INT 21HMOV AH,01HINT 21HCALL ENTER //调用回车和换行子程序CMP AL,44H //传送D的ASCII码值JZ DATE //判断是否输入字符“D”CMP AL,54H //传送T的ASCII码值JZ TIME //判断是否输入字符“T”CMP AL,51H/ /传送Q的ASCII码值JZ GOON //判断是否输入字符“Q”JMP STARTGOON: JMP EXIT //如果输入字符“Q”则退出//***************日期函数***************//DATE: MOV DX,OFFSET BUF2MOV AH,9INT 21HMOV AH,2AHINT 21H //系统调用,取系统时间MOV YEAR,CXMOV MON,DHMOV DAY,DLMOV DI,OFFSET BUFMOV AX,YEARMOV CX,4CALL DIVNUM //对年进行数值转换并存储于八个缓存中等待输出CALL LISNUM //输出缓存中的数,如“2010”CALL DIS1 //显示“-”将年和月分隔MOV AL,MONMOV AH,0MOV CL,2CALL DIVNUM //对月进行数值转换并存储于八个缓存中等待输出CALL LISNUM //输出缓存中的数,如“6”CALL DIS1 //显示“-”将月和日分隔MOV AL,DAYMOV AH,0MOV CL,2CALL DIVNUM //对日进行数值转换并存储于八个缓存中等待输出CALL LISNUM //输出缓存中的数,如“12”CALL ENTERJMP START//***************时间函数***************//TIME: MOV DX,OFFSET BUF3MOV AH,9INT 21HMOV AH,2CHINT 21HMOV HOUR,CHMOV MIN,CLMOV SEC,DHMOV DI,OFFSET BUFMOV AL,HOURMOV AH,0MOV CX,2CALL DIVNUM //对小时进行数值转换并存储于缓存中等待输出CALL LISNUM //输出缓存中的小时数CALL DIS2 //显示“:”将小时和分钟分隔MOV AL,MINMOV AH,0MOV CX,2CALL DIVNUM //对分钟进行数值转换并存储于缓存中等待输出CALL LISNUM //输出缓存中的分钟时间CALL DIS2 //显示“:”将分钟和秒钟分隔MOV AL,SECMOV AH,0MOV CX,2CALL DIVNUM //对秒钟进行数值转换并存储于缓存中等待输出CALL LISNUM //输出缓存中的秒钟时间CALL ENTERJMP START//***************带返回码终止程序***************//EXIT: MOV DX,OFFSET BUF4MOV AH,9INT 21HMOV BL,10;;;;;;;;;;;;;;;;;; // 存储循环次数DELAY: MOV CX,33144CALL WAITF //调延时子程序,每次调用耗时33144*15.08us=0.5s DEC BLJNZ DELAY;;;;;;;;;;;;;;;;;; // 循环10次,则延时5sMOV AH,4CHINT 21H//***************数制转化函数***************//DIVNUM PROC NEAR//将ACS码转化为BCD码PUSH CXAGAIN: MOV BL,0AHDIV BLMOV [DI],AH //取出值的十进制的每一位MOV AH,0INC DILOOP AGAINDEC DIPOP CXRETDIVNUM ENDP//***************显示缓存中数值函数***************//LISNUM PROC NEAR //按照一定的显示特性将缓存中数值显示出来LOP: ;MOV DL,[DI];ADD DL,30H;MOV AH,2;INT 21HPUSH CX;;;;;;;;;;;;;;;;;;;;;;;;;;MOV AL,[DI]ADD AL,30HMOV BL,02HMOV BH,0MOV CX,1MOV AH,9INT 10H //显示墨绿色字符MOV BH,0MOV AH,3INT 10H //取光标属性INC DLMOV AH,2INT 10H //置光标属性POP CX;;;;;;;;;;;;;;;;;;;DEC DILOOP LOPINC DIRETLISNUM ENDP//***************使用"-"分隔日期函数***************//DIS1 PROC NEARMOV DL,'-'MOV AH,2HINT 21HRETDIS1 ENDP//***************使用":"分隔时间函数***************//DIS2 PROC NEARMOV DL,':'MOV AH,2HINT 21HRETDIS2 ENDP//***************显示回车换行函数***************//ENTER PROC NEARPUSH DXPUSH AXMOV DL,0AHMOV AH,2HINT 21HMOV DL,0DHMOV AH,2HINT 21HPOP AXPOP DXRETENTER ENDP//***************延时函数***************//WAITF PROC NEAR;;;;;;;;;;;;;;;;PUSH AXWAITF1: IN AL,61HAND AL,10HCMP AL,AH //监控PB4的状态值,状态值每15.08us变化一次JE WAITF1MOV AH,ALLOOP WAITF1POP AXRETWAITF ENDP;;;;;;;;;;;;;;;;;;;;;CODE ENDSEND START。

相关主题