1、 东南大学信息学院微机时钟实验 微机实验报告 实验九 实验名称:时钟实验 院系:信息科学和工程学院 学号: 姓名: 实验时间:2016.5 一、 实验目的 1. 熟悉系统功能调用INT 21H的有关功能 2. 编写时钟程序 二、 实验任务 1.执行时钟程序时,屏幕上显示提示符“:”,由键盘输入当前时、分、秒值,即XX:XX:XX√,随即显示时间并不停计时。 三、 实验代码 DATA SEGMENT ;定义数据段 NUM DB 9 ;输入时间的最大长度,包含回车 DB ? ;实际输
2、入时间长度 DB 9 DUP(?) ;开辟的长度 DATA ENDS STACK1 SEGMENT STACK ;定义栈段 DB 200 DUP(0) STACK1 ENDS CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX MOV DL,':' MOV AH,2 INT 21H ;显示冒号,表明输入开始 MOV DX,OFFSET NUM MOV AH,0AH ;将ASC
3、II码转换为16进制数 INT 21H MOV BX,OFFSET NUM+2 CALL ERR1 ;检查输入时间是否正确,若不正确,返回START AND AL,0FH MOV [BX],AL INC BX CALL ERR1 ;检查输入时间是否正确,若不正确,返回START AND AL,0FH MOV [BX],AL INC BX CALL ERR2 ;检查时分之间是否以:相隔,若不是,返回START INC BX CALL ER
4、R1 ;检查输入时间是否正确,若不正确,返回START AND AL,0FH MOV [BX],AL INC BX CALL ERR1 ;检查输入时间是否正确,若不正确,返回START AND AL,0FH MOV [BX],AL INC BX CALL ERR2 ;检查分秒之间是否以:相隔,若不是,返回START INC BX CALL ERR1 ;检查输入时间是否正确,若不正确,返回START AND AL,[BX] MOV
5、[BX],AL INC BX CALL ERR1 ;检查输入时间是否正确,若不正确,返回START AND AL,0FH MOV [BX],AL MOV BX,OFFSET NUM+2 CALL TOBCD ;调用转换BCD函数 MOV CH,AL CMP CH,24H ;若输入小时数大于等于24,重输 JAE START ADD BX,3 CALL TOBCD MOV DH,AL CMP DH,60H ;若输入大于等于60,重输 JAE ST
6、ART ADD BX,3 CALL TOBCD MOV DL,AL CMP DL,60H JAE START ;若输入秒数大于等于60,重输 AGAIN: CALL DELAY ;调用延时函数 MOV AL,DL ADD AL,1 DAA MOV DL,AL CMP AL,60H JNE DISPY ;比较秒数是否达到60,若没有,跳转DISPY MOV DL,0 MOV AL,DH ADD AL,1 DAA MOV DH,AL C
7、MP AL,60H ;比较分数是否达到60,若没有,跳转DISPY JNE DISPY MOV DH,0 MOV AL,CH ADD AL,1 DAA MOV CH,AL CMP AL,24H ;比较小时数是否达到24,若没有,跳转DISPY JNE DISPY MOV CH,0 DISPY: MOV BX,OFFSET NUM MOV AL,0DH MOV [BX],AL INC BX MOV AL,0AH MOV [BX],AL INC BX MOV
8、AL,CH CALL TOASC ;调用ASCII码转换函数 INC BX MOV AL,':' MOV [BX],AL INC BX MOV AL,DH CALL TOASC ;调用ASCII码转换函数 INC BX MOV AL,':' MOV [BX],AL INC BX MOV AL,DL CALL TOASC ;调用ASCII码转换函数 INC BX MOV AL,'$' MOV [BX],AL PUSH BX PUSH CX PUSH DX MOV DX,OFF
9、SET NUM MOV AH,9 INT 21H ;显示字符串 MOV AH,06H MOV DL,0FFH INT 21H ;判断是否有按键按下,如果有,转至GO,即调用DOS中断 POP DX POP CX POP BX JNZ GO JMP AGAIN GO: MOV AH,4CH INT 21H ;调用DOS中断 TOBCD PROC MOV AL,[BX] SHL AL,1 SHL AL,1 SHL AL,1 SHL A
10、L,1 OR AL,[BX+1] RET TOBCD ENDP ;转换为BCD码 err1 PROC ;定义错误1:输入时间不是数字 MOV AL,[BX] CMP AL,39H JA START CMP AL,30H JB START RET ERR1 ENDP ERR2 PROC ;定义错误2:时分秒没有用:表示 MOV AL,[BX] CMP AL,3AH JNE START RET err2 ENDP TOASC PROC
11、 ;ASCII码转换程序 MOV CL,AL SHR AL,1 SHR AL,1 SHR AL,1 SHR AL,1 ;AL右移四位 OR AL,30H MOV [BX],AL INC BX MOV AL,CL AND AL,0FH OR AL,30H MOV [BX],AL RET TOASC ENDP DELAY PROC ;延时程序 PUSH CX PUSH AX MOV AX,0FFFFH MOV CX,08FFFH G1: DEC AX JNZ G
12、1 DEC CX JNZ G1 POP AX POP CX RET DELAY ENDP CODE ENDS END START 四、 实验结果 键入正确的时间,程序将进行计时 e.g.1 若没有键入正确的时间(超出时间表示范围或出现其他非法字符时),指针将会跳转至开头重新输入 e.g.2 e.g.3 五、 分析问题并解释原因 问题1:延迟时间很难掌握 问题2:在判断输入字符时,能判断“?”却不能判断“!” 原因:只考虑了大于数字ASCII码部分,没有考虑小于数字ASCII码的部分 六、 思考题 时钟实验中存在时间误差吗?若有误差,其来源于何处?如何进行误差校正? 答:存在误差。出栈入栈指令占用时钟周期,不同的CPU的主频不同,机器周期也会有一定的误差。
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818