📄 clock.asm
字号:
DATA SEGMENT
year DW ?
month DB ?
day DB ?
week DB ?
hour DB ?
minute DB ?
second DB ?
ms10 DB ?
ten DW 10
;numToChar use
numToChar_Byte DB ?
numToChar1_Num DB ?
numToChar2_Num DW ?
numToChar_Char DB 16 DUP(?),'$'
;charToNum use
charToNum_MinCharNum DB ?
charToNum_MaxCharNum DB ?
charToNum_Char DB 100,?,100 DUP(?)
charToNum1_Num DB ?
charToNum2_Num DW ?
charToNum_Success DB ?
;clearLine use
clearLine_Line DB ?
;setMouse use
setMouse_Line DB ?
user DB ?
String1 DB "Now , The System Time is",0Dh,0aH,'$'
StringEnter DB 0Dh,0aH,'$'
StringEnter3 DB 0Dh,0aH,0Dh,0aH,0Dh,0aH,'$'
String_XieGang DB "/$"
StringERROR DB "ERROR$"
Dot DB ":$"
String2 DB "Are you want to change the time? (Y/N) $"
StringYear DB "Please init YEAR (1980-2099)",0Dh,0aH,'$'
StringMonth DB "Please init MONTH (1-12)",0Dh,0aH,'$'
StringDay DB "Please init DAY (1-31)",0Dh,0ah,'$'
StringHour DB "Please init Hour (0-23)",0Dh,0ah,'$'
StringMinute DB "Please init Minute (0-59)",0dh,0ah,'$'
StringSecond DB "Please init Second (0-59)",0dh,0ah,'$'
String0_01Sscond DB "Please init per_Second (0-99)",0dh,0ah,'$'
DATA ENDS
STACK SEGMENT
;此处输入堆栈段代码
STACK ENDS
CODE SEGMENT
main proc far
ASSUME CS:CODE,DS:DATA,SS:STACK
Start:
push DS
MOV AX,0
push AX
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
again:
MOV AL,0 ;清屏
MOV clearLine_Line,AL
call clearLine
MOV DX,offset String1 ;输出提示
MOV AH,9h
INT 21h
call getDate ;获取时间
call printDate ;输出时间
MOV DX,offset StringEnter ;输出回车
MOV AH,9h
INT 21h
try:
MOV AL,3 ;局部清屏
MOV clearLine_Line,AL
call clearLine
MOV DX,offset String2 ;输出提示
MOV AH,9h
INT 21h
MOV AH,1h ;接受输入
INT 21h
MOV user,AL
MOV DX,offset StringEnter ;输出回车
MOV AH,9h
INT 21h
CMP user,'y'
;you init y
JNE main_p1
call changeTime
call setDate
call setTime
JMP again
main_p1:
CMP user,'n'
JNE try
ret
main endp
getDate proc near
;get the date
MOV AH,2ah
INT 21h
MOV year,CX
MOV month,DH
MOV day,DL
MOV week,AL
MOV AH,2ch
INT 21h
MOV hour,CH
MOV minute,CL
MOV second,DH
MOV ms10,DL
ret
getDate endp
;打印数据
printDate proc near
;print yrer
MOV numToChar_Byte,2
MOV AX,year
MOV numToChar2_Num,AX
call numToChar
MOV DX,offset numToChar_Char
MOV AH,9h
INT 21h
MOV DX,offset String_XieGang
MOV AH,9H
INT 21h
;print month
MOV numToChar_Byte,1
MOV AH,month
MOV numToChar1_Num,AH
call numToChar
MOV DX,offset numToChar_Char
MOV AH,9h
INT 21h
MOV DX,offset String_XieGang
MOV AH,9H
INT 21h
;print day
MOV numToChar_Byte,1
MOV AH,day
MOV numToChar1_Num,AH
call numToChar
MOV DX,offset numToChar_Char
MOV AH,9h
INT 21h
MOV DX,offset StringEnter
MOV AH,9h
INT 21h
;print hour
MOV numToChar_Byte,1
MOV AH,hour
MOV numToChar1_Num,AH
call numToChar
MOV DX,offset numToChar_Char
MOV AH,9h
INT 21h
MOV DX,offset Dot
MOV AH,9H
INT 21h
;print minute
MOV numToChar_Byte,1
MOV AH,minute
MOV numToChar1_Num,AH
call numToChar
MOV DX,offset numToChar_Char
MOV AH,9h
INT 21h
MOV DX,offset Dot
MOV AH,9H
INT 21h
;print second
MOV numToChar_Byte,1
MOV AH,second
MOV numToChar1_Num,AH
call numToChar
MOV DX,offset numToChar_Char
MOV AH,9h
INT 21h
MOV DX,offset Dot
MOV AH,9H
INT 21h
;print ms10
MOV numToChar_Byte,1
MOV AH,ms10
MOV numToChar1_Num,AH
call numToChar
MOV DX,offset numToChar_Char
MOV AH,9h
INT 21h
ret
printDate endp
;num to char
numToChar proc near
MOV BL,numToChar_Byte
CMP BL,1
JNE numToChar_p1
MOV AL,numToChar1_Num
MOV AH,0
JMP numToChar_p2
numToChar_p1:
MOV AX,numToChar2_Num
numToChar_p2:
MOV BL,10
MOV CX,0
numToChar_p3: ;除10压栈
CMP AX,0
JE numToChar_p4
DIV BL
PUSH AX
MOV AH,0
INC CX
JMP numToChar_p3
numToChar_p4: ;出栈
MOV BX,0
numToChar_p5:
POP AX
ADD AH,30h
MOV numToChar_Char[BX],AH
INC BX
loop numToChar_p5
MOV numToChar_Char[BX],'$' ;加'$'结束
ret
numToChar endp
changeTime proc near
;change year
P_year:
MOV AL,4
MOV clearLine_Line,AL
call clearLine
MOV DX,offset StringYear ;输出提示
MOV AH,9h
INT 21h
MOV DX,offset charToNum_Char ;输入year
MOV AH,0ah
INT 21h
MOV BX,1 ;加'$'
MOV BL,charToNum_Char[BX]
ADD BX,2
MOV AL,'$'
MOV charToNum_Char[BX],AL
MOV AX,year ;数据转换,检查
MOV charToNum2_Num,AX
MOV charToNum_MinCharNum,4
MOV charToNum_MaxCharNum,4
call charToNum
CMP charToNum_Success,0
JE P_year
MOV AX,charToNum2_Num
CMP AX,2099
JG P_year
CMP AX,1980
JL P_year
MOV year,AX
MOV DX,offset StringEnter
MOV AH,9h
INT 21h
;change month
P_month:
MOV AL,6
MOV clearLine_Line,AL
call clearLine
MOV DX,offset StringMonth ;输出提示
MOV AH,9h
INT 21h
MOV DX,offset charToNum_Char ;输入month
MOV AH,0ah
INT 21h
MOV BX,1 ;加'$'
MOV BL,charToNum_Char[BX]
ADD BX,2
MOV AL,'$'
MOV charToNum_Char[BX],AL
MOV AL,month ;数据转换,检查
MOV charToNum1_Num,AL
MOV charToNum_MinCharNum,1
MOV charToNum_MaxCharNum,2
call charToNum
CMP charToNum_Success,0
JE P_month
MOV AL,charToNum1_Num
CMP AL,12
JG P_month
CMP AL,1
JL P_month
MOV month,AL
MOV DX,offset StringEnter
MOV AH,9h
INT 21h
;change day
P_day:
MOV AL,8
MOV clearLine_Line,AL
call clearLine
MOV DX,offset StringDay ;输出提示
MOV AH,9h
INT 21h
MOV DX,offset charToNum_Char ;输入day
MOV AH,0ah
INT 21h
MOV BX,1 ;加'$'
MOV BL,charToNum_Char[BX]
ADD BX,2
MOV AL,'$'
MOV charToNum_Char[BX],AL
MOV AL,day ;数据转换,检查
MOV charToNum1_Num,AL
MOV charToNum_MinCharNum,1
MOV charToNum_MaxCharNum,2
call charToNum
CMP charToNum_Success,0
JE P_day
MOV AL,charToNum1_Num
CMP AL,31
JG P_day
CMP AL,1
JL P_day
MOV day,AL
MOV DX,offset StringEnter
MOV AH,9h
INT 21h
;change hour
P_hour:
MOV AL,10
MOV clearLine_Line,AL
call clearLine
MOV DX,offset StringHour ;输出提示
MOV AH,9h
INT 21h
MOV DX,offset charToNum_Char ;输入hour
MOV AH,0ah
INT 21h
MOV BX,1 ;加'$'
MOV BL,charToNum_Char[BX]
ADD BX,2
MOV AL,'$'
MOV charToNum_Char[BX],AL
MOV AL,hour ;数据转换,检查
MOV charToNum1_Num,AL
MOV charToNum_MinCharNum,1
MOV charToNum_MaxCharNum,2
call charToNum
CMP charToNum_Success,0
JE P_hour
MOV AL,charToNum1_Num
CMP AL,23
JG P_hour
CMP AL,0
JL P_hour
MOV hour,AL
MOV DX,offset StringEnter
MOV AH,9h
INT 21h
;change minute
P_minute:
MOV AL,12
MOV clearLine_Line,AL
call clearLine
MOV DX,offset StringMinute ;输出提示
MOV AH,9h
INT 21h
MOV DX,offset charToNum_Char ;输入minute
MOV AH,0ah
INT 21h
MOV BX,1 ;加'$'
MOV BL,charToNum_Char[BX]
ADD BX,2
MOV AL,'$'
MOV charToNum_Char[BX],AL
MOV AL,minute ;数据转换,检查
MOV charToNum1_Num,AL
MOV charToNum_MinCharNum,1
MOV charToNum_MaxCharNum,2
call charToNum
CMP charToNum_Success,0
JE P_minute
MOV AL,charToNum1_Num
CMP AL,59
JG P_minute
CMP AL,0
JL P_minute
MOV minute,AL
MOV DX,offset StringEnter
MOV AH,9h
INT 21h
;change second
P_second:
MOV AL,14
MOV clearLine_Line,AL
call clearLine
MOV DX,offset StringSecond ;输出提示
MOV AH,9h
INT 21h
MOV DX,offset charToNum_Char ;输入second
MOV AH,0ah
INT 21h
MOV BX,1 ;加'$'
MOV BL,charToNum_Char[BX]
ADD BX,2
MOV AL,'$'
MOV charToNum_Char[BX],AL
MOV AL,minute ;数据转换,检查
MOV charToNum1_Num,AL
MOV charToNum_MinCharNum,1
MOV charToNum_MaxCharNum,2
call charToNum
CMP charToNum_Success,0
JE P_second
MOV AL,charToNum1_Num
CMP AL,59
JG P_second
CMP AL,0
JL P_second
MOV second,AL
MOV DX,offset StringEnter
MOV AH,9h
INT 21h
;change ms10
MOV ms10,50
ret
changeTime endP
charToNum proc near
MOV AL,0 ;默认为不成功
MOV charToNum_Success,AL
MOV BX,1
MOV AL,charToNum_Char[BX] ;AL为charToNum_Char的字符个数
CMP AL,0
JNE charToNum_p1
MOV AH,1 ;直接按回车,返回成功
MOV charToNum_Success,AH
JMP charToNum_finish
charToNum_p1:
CMP AL,charToNum_MinCharNum
JL charToNum_finish ;小于charToNum_MinCharNum个字的
CMP AL,charToNum_MaxCharNum
JG charToNum_finish ;大于charToNum_MaxCharNum个字的
MOV BX,1
MOV CL,charToNum_Char[BX]
MOV CH,0
MOV BX,2
charToNum_p2: ;检查是否为非数字
MOV DL,charToNum_Char[BX]
CMP DL,30h
JL charToNum_finish
CMP DL,39h
JG charToNum_finish
INC BX
loop charToNum_p2
MOV BX,2 ;乘10累加
MOV DX,0 ;DX记录结果
charToNum_p3: ;DX*10
MOV AX,10
MUL DX
MOV DX,AX
MOV CL,charToNum_Char[BX]
SUB CL,30h
MOV CH,0
ADD DX,CX
INC BX ;转到下一个字符
MOV AL,'$'
CMP AL,charToNum_Char[BX]
JE charToNum_p4
JMP charToNum_p3
charToNum_p4:
MOV Al,1 ;标记成功
MOV charToNum_Success,AL
MOV charToNum1_Num,DL
MOV charToNum2_Num,DX
charToNum_finish:
ret
charToNum endp
setDate proc near
MOV CX,year
MOV DH,month
MOV DL,day
MOV AH,2bh
INT 21h
ret
setDate endp
setTime proc near
MOV CH,hour
MOV CL,minute
MOV DH,second
MOV DL,ms10
MOV AH,2dh
INT 21h
ret
setTime endp
clearLine proc near ;将clearLine_Line及以下的清空
MOV AL,0
MOV BH,1h
MOV CH,clearLine_Line
MOV CL,0
MOV DH,24
MOV DL,79
MOV AH,7h
INT 10h
MOV BH,0
MOV DH,clearLine_Line
MOV DL,0
MOV AH,2h
INT 10h
ret
clearLine endp
CODE ENDS
end Start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -