32060624_王克_asmhomework_5_1.asm

来自「汇编语言 参考书 包含作业与答案 从入门到精通 通俗易懂」· 汇编 代码 · 共 169 行

ASM
169
字号
;a proc to show date&time
;there is also a TSR.
print_string	macro 	string
		push	ax
		push	dx
		mov	dx,offset string
		mov	ah,9h
		int 21h
		pop	dx
		pop	ax
		endm
	print_char	macro	char
		push	ax
		push	dx
		mov	dl,char
		mov	ah,2h
		int 21h
		pop	dx
		pop	ax
		endm
;********************************************************
	.model	small

	stack	segment	stack
		WORD	100 DUP(?)
	stack	ends

	DATA	segment	para
		msg_date	byte	'Date: ','$'
		msg_time	byte	0dh,0ah,'Time: ','$'
		count_buffer	byte	5 DUP(0),'$'
	DATA	ends

	CODE	segment	para
		assume	cs:code, ds:data, ss:stack
	main	proc	far
		mov	ax,data
		mov	ds,ax
		mov	es,ax

		call	show_date
		call	SHOW_TIME

		mov	ax,4c00h
		INT 21H

		RET		
	main	endp
;******************************************************
	show_date	proc	near
		;push	word ptr row
		
		;mov	row,0
		;mov	col,64
		;call	SET_CURSOR
		
		mov	ah,2ah			;取得系统日期
		int 21h			;AL星期,DL日,DH月,CX年
		push	cx
		push	dx		;保存取得的日期
		push	dx
		push	ax
		
		mov	dx,offset msg_date
		mov	ah,09h
		int 21h
		pop	ax
		;add	col,6		
		;call	SET_CURSOR
		xor	ah,ah		;暂不显示星期几
		call	deal_num

		mov	dl,' '
		mov	ah,02h
		int 21h
		;add	col,3
		;call	SET_CURSOR
		
		pop	dx
		xor	ah,ah
		mov	al,dh		;输出月
		call	deal_num		
		;add	col,2
		;call	SET_CURSOR
		
		mov	dl,'/'
		mov	ah,02h
		int 21h
		
		pop	dx
		xor	ah,ah
		mov	al,dl		;输出日
		call	deal_num
		;add	col,4
		;call	SET_CURSOR

		mov	dl,' '
		mov	ah,02h
		int 21h
				
		pop	cx
		mov	ax,cx		;输出年
		call	deal_num
		
		;pop	word ptr row		
		ret
	show_date	endp
;*******************************************************
	SHOW_TIME	proc	near
		mov	ah,2ch
		INT 21h		;CH:CL hour:minute,DH:DL second:1/100s

		print_string	msg_time

		xor	ah,ah
		mov	al,ch
		call	DEAL_NUM

		print_char	':'

		xor	ah,ah
		mov	al,cl
		call	DEAL_NUM

		print_char	':'
		
		xor	ah,ah
		mov	al,dh
		call	DEAL_NUM
		
		RET
	SHOW_TIME	ENDP
;*******************************************************
	DEAL_NUM	PROC	NEAR		;将一个字转换成十进制并输出子程序
		push	ax
		push	bx
		push	cx
		push	dx
		push	di
		
		MOV     CX,5
		
	        MOV     BX,10
	        MOV     DI,OFFSET count_buffer+4	;从后往前保存
	next:
		XOR     DX,DX			;将DX清零 
	        DIV     BX
	        OR      DL,30H			;也可用ADD DL,30H	
	        MOV     BYTE PTR [DI],DL	;将16进制的数转换到ASCII中对应的数,0的ASCII码为 30H (48D)
	        CMP	AX,0
	        JZ	PRINT			;当商为0时,直接去打印,可不打印高位的0.
	        DEC     DI
	        LOOP    next
	PRINT:
	        MOV     DX,DI			;从DI开始打印,因为RESULT不一定够5位
	        MOV     AH,9
	        INT     21H			;调用DOS的21号中断的9号功能,将DB输出

		pop	di
		pop	dx
		pop	cx
		pop	bx
		pop	ax
	        RET
	DEAL_NUM	ENDP
;*********************************************************
	code	ends
		end	main

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?