⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.asm

📁 一个简单的显示/修改系统时间的汇编程序。 极度适合初学者学习!
💻 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 + -