📄 date and time.asm
字号:
TITLE SHOW THE DATE AND TIME
PAGE 60,132
;-----------------------------------------------------------------
CLEAR MACRO ;清屏
MOV AX,0600H
MOV BH ,07
MOV CX,0
MOV DX,184FH
INT 10H
ENDM
;--------------------------------------------------------------------
CURSOR MACRO COL,ROW ;设置光标
MOV AH,02
MOV BH,00
MOV DL,COL
MOV DH,ROW
INT 10H
ENDM
;--------------------------------------------------------------------
DISPLAY MACRO ADDRESS ;显示
MOV AH,09
LEA DX,ADDRESS
INT 21H
ENDM
;--------------------------------------------------------------------
.MODEL SMALL
.STACK 64
;--------------------------------------------------------------------
.DATA
MESSAGE1 DB 'TODAY IS $'
MESSAGE2 DB 'NOW THE TIME IS $'
MESSAGE3 DB 'BY THE WAY,TODAY IS $'
DATE16 DB 7 DUP(0) ;存放十六进制信息,填充0是为了方便作串处理
TIME16 DB 4 DUP(?) ;存放十六进制信息
DATE10 DB 16 DUP(?) ;存放转换后十进制信息
TIME10 DB 16 DUP(?) ;存放转换后十进制信息
WEEK DB 'Sunday $Monday $Tuesday $Wednesday$Thursday $Friday $Saturday $'
;--------------------------------------------------------------------
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
CLEAR ;清屏
CURSOR 25,11 ;设置光标
CALL GETDATE ;取得日期
CALL GETTIME ;取得时间
DISPLAY MESSAGE1
CALL CHADATE ;转换并显示日期
CURSOR 25,12 ;设置光标(下一行)
DISPLAY MESSAGE2
CALL CHATIME ;转换并显示日期
CURSOR 25,13 ;设置光标(下一行)
DISPLAY MESSAGE3
CALL SHOWWEEK ;处理并显示星期
MOV AH,4CH
INT 21H
MAIN ENDP
GETDATE PROC ;取日期
LEA SI,DATE16 ;十六进制数据储存位置
MOV AH,2AH
INT 21H
MOV [SI],CX ;年
MOV [SI+2],DH ;月,如[si+2]=0AH,此时[si+3]保持为0,方便在转换时采用LODSW操作, ;这样取过来AX=000A,不影响结果,但大大简化程序
MOV [SI+4],DL ;日,同理,[si+5]保持为0
MOV [SI+6],AL ;星期
RET
GETDATE ENDP
GETTIME PROC ;取时间
LEA SI,TIME16 ;十六进制数据储存位置
MOV AH,2CH
INT 21H
MOV [SI],CH ;时
MOV [SI+1],CL ;分
MOV [SI+2],DH ;秒
MOV [SI+3],DL ;毫秒
RET
GETTIME ENDP
CHADATE PROC ;日期转换
LEA SI,DATE16+4 ;先转换"日",转换后存放于小地址,这样可以避免对DI的调整太过混 ;乱,如对原始数据 07D6(年)0A00(月)1E00(日) 会依次转化30,33,
;30,31,36,30,30,32 只需作倒序输出,就是 2006 10 30
LEA DI,DATE10 ;十进制数据储存位置
MOV BX,10
MOV CX,3
STD ;设DF方向这上行
AGAIN1: LODSW
BACK1: SUB DX,DX
DIV BX
OR DL,30H
MOV [DI],DL
INC DI
CMP AX,0
JA BACK1
MOV [DI],AL ;当"日"转换完成后,在其后紧跟着存入一个0,即空格 ;的ASCII码
INC DI
LOOP AGAIN1 ;循环继续进行"月"和"年"的转换
DEC DI ;调整DI回到"年"的首位
DEC DI
LEA SI,DATE10 ;将十进制数据储存位置赋予SI,将其与DI相比较,实 ; 现倒序输出
LOOP1: MOV AH,02
MOV DL,[DI]
INT 21H
DEC DI
CMP DI,SI
JNB LOOP1
RET
CHADATE ENDP
CHATIME PROC ;时间转换
LEA SI,TIME16+3 ;同理,先转换"微秒"
LEA DI,TIME10
MOV BX,10
MOV CX,4
STD
AGAIN2: LODSB ;现在只按字节取数就行
BACK2: SUB AH,AH
DIV BL
OR AH,30H
MOV [DI],AH
INC DI
CMP AL,0
JA BACK2
MOV AL,3AH ;在完成"微秒"的转换后存入3A,即":"的ASCII
MOV [DI],AL
INC DI
LOOP AGAIN2 ;循环
DEC DI
DEC DI ;同样调整DI回到"时"的首位
LEA SI,TIME10 ;同理实现倒序输出
LOOP2: MOV AH,02
MOV DL,[DI]
INT 21H
DEC DI
CMP DI,SI
JNB LOOP2
RET
CHATIME ENDP
SHOWWEEK PROC ;处理星期并显示
MOV AL,[DATE16+6] ;通过表示星期的数据来确定显示WEEK中哪个 ;位置的数据
MOV BL,10
MUL BL
MOV AH,09
LEA DX,WEEK
ADD DL,AL
INT 21H
RET
SHOWWEEK ENDP
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -