资源描述
实验九
一、实验目的
1.熟悉系统功能调用INT 21H的有关功能
2.编写时钟程序
二、实验任务
1.执行时钟程序时,屏幕上显示提示符“:”,由键盘输入当前时、分、秒值,即XX:XX:XX,随即显示时间并不停地计时。
2.当有键盘按下时,立即停止计时,返回DOS。
三、源程序
DATA SEGMENT
BUFFER DB 11
DB ?
DB 10 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
OUTCLK: MOV AX,DATA
MOV DS,AX
MOV DL,':'
MOV AH,2
INT 21H
MOV DX,OFFSET BUFFER
MOV AH,0AH ;输入字符串
INT 21H
MOV BX,OFFSET BUFFER+2
MOV AL,[BX] ; 时针,ASCII码转非压缩BCD
CMP AL, 03AH
JAE ERROR1
CMP AL, 02FH
JBE ERROR1
AND AL,0FH
MOV [BX],AL
INC BX
MOV AL,[BX]
AND AL,0FH
MOV [BX],AL
INC BX
INC BX
MOV AL,[BX] ; 分针
AND AL,0FH
MOV [BX],AL
INC BX
MOV AL,[BX]
AND AL,0FH
MOV [BX],AL
INC BX
INC BX
MOV AL,[BX] ;秒针
AND AL,0FH
MOV [BX],AL
INC BX
MOV AL,[BX]
AND AL,0FH
MOV [BX],AL
MOV BX,OFFSET BUFFER+2
CALL TOBCD ; 时针,两位非压缩BCD转换成两位压缩BCD
MOV CH, AL
ADD BX,3
CALL TOBCD
MOV DH, AL ; 分针,两位非压缩BCD转换成两位压缩BCD
MOV DH,AL
ADD BX,3
CALL TOBCD ; 秒针,两位非压缩BCD转换成两位压缩BCD
MOV DL,AL
CMP CH, 24H
JAE ERROR
CMP DH, 60H
JA ERROR
CMP DL, 60H
JA ERROR
ERROR1: MOV AH,4CH
INT 21H
AGAIN: CALL DELAY
MOV AL,DL ; 秒针加1
ADD AL,1
DAA
MOV DL,AL
CMP AL,60H
JA ERROR
JNE DISPY
MOV DL,0
MOV AL,DH
ADD AL,1 ; 分针
DAA
MOV DH,AL
CMP AL,60H
JA ERROR
JNE DISPY
MOV DH,0
MOV AL,CH
ADD AL,1
DAA ; 时针
MOV CH,AL
CMP AL,24H
JAE ERROR
JNE DISPY
MOV CH,0
ERROR: MOV DL, 0
MOV DH, 0
MOV CH, 0
DISPY: MOV BX,OFFSET BUFFER
MOV AL,0DH
MOV [BX],AL
INC BX
MOV AL,0
MOV [BX],AL
INC BX
MOV AL,CH
CALL TRAN
INC BX
MOV AL,':'
MOV [BX],AL
INC BX
MOV AL,DH
CALL TRAN
INC BX
MOV AL,':'
MOV [BX],AL
INC BX
MOV AL,DL
CALL TRAN
INC BX
MOV AL,'$'
MOV [BX],AL
PUSH BX
PUSH CX
PUSH DX
MOV DX,OFFSET BUFFER
MOV AH,9
INT 21H
MOV AH,06H
MOV DL,0FFH
INT 21H
POP DX
POP CX
POP BX
JNE GO
JMP AGAIN
GO: MOV AH,4CH
INT 21H
TOBCD PROC ; 两位非压缩BCD转换成压缩
MOV AL,[BX]
MOV CL,4
SHL AL,CL
OR AL,[BX+1]
RET
TOBCD ENDP
TRAN PROC ; BCD转ASCII
MOV CL,AL
SHR AL,1
SHR AL,1
SHR AL,1
SHR AL,1
OR AL,30H
MOV [BX],AL
INC BX
MOV AL,CL
AND AL,0FH
OR AL,30H
MOV [BX],AL
RET
TRAN ENDP
DELAY PROC
PUSH CX
PUSH AX
MOV AX,0FFFFH
FIR: MOV CX,02FFFH
GOON: DEC CX
JNE GOON
DEC AX
JNE FIR
POP AX
POP CX
RET
DELAY ENDP
CODE ENDS
END OUTCLK
四、思考题
时钟程序中存在误差吗?若有误差,其来源在何处?如何进行误差矫正?
答:存在,来源自实验循环的次数,来自“MOV AX,0FFFFH FIR: MOV CX,02FFFH”,如要进行矫正,只需调整AX与CX使之乘积与计算机运行速度相匹配即可。
展开阅读全文