📄 clock.asm
字号:
DATA SEGMENT
INT08_SEG DW ?
INT08_OFF DW ?
COUNT DB 18
THEAD DB 9
DB ?
TIME DB '00:00:00'
TEND DB '$'
MESSAGE DB 'PLEASE INPUT THE BEGIN TIME:',0AH,'$'
DATA ENDS
STACK SEGMENT STACK
DB 50 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
CLI
LEA DX,MESSAGE
MOV AH,9
INT 21H ;初始信息输出
LEA DX,THEAD
MOV AH,0AH
INT 21H ;时间输入
;调用函数
CALL SAVE
CALL CHANGE
CALL INIT
STI
BEGIN:
MOV AH,0
INT 16H
CMP AL,1BH ;判断是否为ESC键
JNZ BEGIN
PEND:
CALL RESUME
;返回操作系统
MOV AH,4CH
INT 21H ;主程序结束
;========================新的中断服务程序====================================
NEW_INT PROC
PUSH DS
PUSH ES
MOV AX,DATA
MOV DS,AX
MOV AL,COUNT
DEC AL
MOV COUNT,AL
CMP AL,0
JNE S1
MOV AL,18 ;更新COUNT值
MOV COUNT,AL
LEA DI,TEND
DEC DI
MOV AL,[DI]
INC AL
MOV [DI],AL
CMP AL,3AH
JNE DISPTIME
MOV AL,30H ;else的情况,清空
MOV [DI],AL
DEC DI
MOV AL,[DI]
INC AL
MOV [DI],AL
CMP AL,36H ;比较是否为6
JNE DISPTIME
MOV AL,30H
MOV [DI],AL
;分钟值
DEC DI
DEC DI
MOV AL,[DI]
INC AL
MOV [DI],AL
CMP AL,3AH
JNE DISPTIME
MOV AL,30H ;else
MOV [DI],AL
DEC DI
MOV AL,[DI]
INC AL
MOV [DI],AL
CMP AL,36H
JNE DISPTIME
MOV AL,30H
MOV [DI],AL
;时钟值
DEC DI
DEC DI
MOV AL,[DI]
INC AL
MOV [DI],AL
CMP AL,3AH
JNE T1
MOV AL,30H
MOV [DI],AL
DEC DI
MOV AL,[DI]
INC AL
MOV [DI],AL
JMP DISPTIME
T1: CMP AL,34H ;判断是否为24
JNE DISPTIME
DEC DI
MOV AL,[DI]
CMP AL,32H
JNE DISPTIME
MOV AL,30H
MOV [DI],AL
INC DI
MOV [DI],AL
DISPTIME: CALL DISP
S1:
MOV AL,20H
OUT 20H,AL
POP ES
POP DS
IRET
NEW_INT ENDP
;============================系统定时器初始化==================================
INIT PROC
MOV AL,36H
OUT 43H,AL
MOV AX,0 ;置计数初值
OUT 40H,AL
MOV AL,AH
OUT 40H,AL
RET
INIT ENDP
;=============================读取系统08号中断向量=============================
SAVE PROC
MOV AX,3508H
INT 21H
MOV INT08_OFF,BX
MOV INT08_SEG,ES
RET
SAVE ENDP
;==============================写入用户08型中断向量============================
CHANGE PROC
PUSH DS
MOV AX,SEG NEW_INT
MOV DS,AX
MOV DX,OFFSET NEW_INT
MOV AX,2508H
INT 21H
POP DS
RET
CHANGE ENDP
;==============================恢复中断和8253的设置============================
RESUME PROC
MOV AL,0
OUT 40H,AL
OUT 40H,AL
MOV DX,INT08_OFF
MOV DS,INT08_SEG
MOV AX,2508H
INT 21H
RET
RESUME ENDP
;=============================显示过程==========================================
DISP PROC
PUSH DS
PUSH ES
MOV AX, DATA
MOV DS,AX
MOV ES,AX
LEA BP,TIME
MOV DH, 12 ; 置光标位置
MOV DL, 32
MOV AH, 9
MOV AL, 1
MOV BH, 0
MOV BL, 1EH
MOV CX, 8
MOV AH, 13H
INT 10H
POP ES
POP DS
RET
DISP ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -