📄 clock.asm
字号:
CODE SEGMENT
ASSUME CS:CODE , DS:CODE
BEGIN:
JMP INIT ;跳转至设置中断向量
;中断响应函数
TIME ELAPSED PROC FAR
MOV AX , CS
MOV DS , AX
ADD TICKS , 55
CMP TICKS , 1000
JNL DO DETAIL
IRET
DO DETAIL :
SUB TICKS , 1000
INC SEC2
CMP SEC2 , 3AH
JL PRINT
MOV SEC2 , 30H
INC SEC1
CMP SEC1 , 36H
JL PRINT
MOV SEC1 , 30H
INC MIN2
CMP MIN2 , 3AH
JL PRINT
MOV MIN2 , 30H
INC MIN1
CMP MIN1 , 36H
JL PRINT
MOV MIN1 , 30H
INC HOUR2
CMP HOUR2 , 34H
JL PRINT
CMP HOUR1 , 32H
JE COND1
CMP HOUR2 , 3AH
JL PRINT
MOV HOUR2 , 30H
INC HOUR1
JMP PRINT
COND1:
MOV HOUR2 , 30H
MOV HOUR1 , 30H
PRINT:
MOV AH , 3
MOV BH , 0
INT 10H
MOV POSR , DH
MOV POSC , DL
LEA BP , HOUR1
MOV AH , 2
MOV BH , 0
MOV DH , 0
MOV DL , 70
INT 10H
PRINT1:
MOV AH , 14
MOV AL , DS:[ BP ]
MOV BH , 0
MOV CX , 1
INT 10H
INC BP
INC NUM
CMP NUM , 8
JNE PRINT1
RETURN:
MOV AH , 2
MOV BH , 0
MOV DH , POSR
MOV DL , POSC
INT 10H
MOV NUM , 0
IRET
TIME ELAPSED ENDP
;数据结构
TICKS DW 0 ;时间计数
HOUR1 DB 30H ;时十位
HOUR2 DB 30H ;时个位
DB ':'
MIN1 DB 30H ;分十位
MIN2 DB 30H ;分个位
DB ':'
SEC1 DB 30H ;秒十位
SEC2 DB 30H ;秒个位
NUM DB 0
POSR DB 0
POSC DB 0
LEN EQU WORD PTR ( $ - TIME ELAPSED )/2 ;计算驻留程序的长度
MENU DB 'Please select a time to start:' , 0DH , 0AH
DB '1.System time' , 0DH , 0AH
DB '2.Manual time' , 0DH , 0AH
DB 'Press any other key to Quit' , 0DH , 0AH
DB '$'
BREAK DB 0DH , 0AH , '$'
BUF DB 9
DB ?
DB 8 DUP( 0 )
;设置新的中断向量
INIT:
MOV AX , CS
MOV DS , AX
MOV AH , 9
LEA DX , MENU
INT 21H
MOV AH , 1
INT 21H
CMP AL , 31H
JE GET SYS TIME
CMP AL , 32H
JE SET MANUAL TIME
MOV AH , 4CH
INT 21H
GET SYS TIME:
MOV AH , 0
MOV AL , 2
INT 10H
MOV AH , 2CH
INT 21H
;初始化时间
MOV AH , 0
MOV AL , CH
MOV BL , 10
DIV BL
MOV HOUR1 , AL
ADD HOUR1 , 30H
MOV HOUR2 , AH
ADD HOUR2 , 30H
MOV AH , 0
MOV AL , CL
MOV BL , 10
DIV BL
MOV MIN1 , AL
ADD MIN1 , 30H
MOV MIN2 , AH
ADD MIN2 , 30H
MOV AH , 0
MOV AL , DH
MOV BL , 10
DIV BL
MOV SEC1 , AL
ADD SEC1 , 30H
MOV SEC2 , AH
ADD SEC2 , 30H
JMP SET TIMER
SET MANUAL TIME:
LEA DX , BUF
MOV AH , 10
INT 21H
MOV BP , DX
INC BP
CMP [ BP ] ,BYTE PTR 8
JNZ SET MANUAL TIME
INC BP
MOV AL , [ BP ]
MOV HOUR1 , AL
INC BP
MOV AL , [ BP ]
MOV HOUR2 , AL
ADD BP , 2
MOV AL , [ BP ]
MOV MIN1 , AL
INC BP
MOV AL , [ BP ]
MOV MIN2 , AL
ADD BP , 2
MOV AL , [ BP ]
MOV SEC1 , AL
INC BP
MOV AL , [ BP ]
MOV SEC2 , AL
SET TIMER:
MOV DX , OFFSET TIME ELAPSED
MOV AL , 1CH ;
MOV AH , 25H
INT 21H
MOV AL , 0
MOV DX , LEN
MOV AH , 31H
INT 21H
CODE ENDS
END BEGIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -