资源描述
东南大学信息学院微机时钟实验
微机实验报告
实验九
实验名称:时钟实验
院系:信息科学和工程学院
学号:
姓名:
实验时间:2016.5
一、 实验目的
1. 熟悉系统功能调用INT 21H的有关功能
2. 编写时钟程序
二、 实验任务
1.执行时钟程序时,屏幕上显示提示符“:”,由键盘输入当前时、分、秒值,即XX:XX:XX√,随即显示时间并不停计时。
三、 实验代码
DATA SEGMENT ;定义数据段
NUM DB 9 ;输入时间的最大长度,包含回车
DB ? ;实际输入时间长度
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 ;将ASCII码转换为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 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 ERR1 ;检查输入时间是否正确,若不正确,返回START
AND AL,[BX]
MOV [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 START
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
CMP 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 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,OFFSET 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 AL,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 ;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 G1
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的主频不同,机器周期也会有一定的误差。
展开阅读全文