assume cs:code
data segment
db 9,8,7,4,2,0 ;将年、月、日、时、分、秒在COMS RAM内的存放单元地址号依次放入数据段
db 32 dup (0) ;开辟数据段,用于存放从COMS RAM内读出的时间信息
data ends
stack segment
dw 8 dup (0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov si,0 ;ds:si指向时间在COMS RAM内的存放单元地址号;inc si可依次指向这些地址号
mov ax,stack
mov ss,ax
mov sp,16 ;设置栈段
xh: mov cx,3 ;此循环依次读出年、月、日
mov bx,6 ;设置存放读出的时间信息内容的首地址
time0: call duank ;跳到将时间信息读出并变为ASC码的子程序执行
mov [bx],ah
mov [bx+1],al ;时间的十位和个位依次放入字节
mov byte ptr [bx+2],2fh ;年、月、日的间隔为“/”
inc si ;指向下一个时间存放地址号
add bx,3 ; 指向存放下一个读出的时间信息的首地址
loop time0
dec bx
mov byte ptr [bx], 20h ;将日后的“/”去除,用空格代替,同时作为年月日和时分秒之间设置的一个空格
inc bx
mov cx,3 ;此循环依次读出时、分、秒
time1: call duank
mov [bx],ah
mov [bx+1],al
mov byte ptr [bx+2],3ah ;时、分、秒的间隔为“:”
inc si
add bx,3
loop time1
dec bx
mov byte ptr [bx],24h ;将秒后的“:”去除,用“$”代替,同时“$”为21h号中断例程的9号子程序的字符串显示的结束符
mov ah,2
mov bh,0
mov dh,10
mov dl,12
int 10h ;调用10h号中断例程的2号子程序,功能为设置光标位置
mov dx,6
mov ah,9
int 21h ;调用21h号中断例程的9号子程序,功能为在光标位置显示字符串;ds:bx指向字符串的首地址
call relay ;调用延时显示子程序
mov si,0
jmp near ptr xh ;重新执行显示程序。
mov ax,4c00h
int 21h
relay: push cx ;延时子程序,相当于软件执行12*5000*5000次循环后,再执行显示程序,使时间显示不至于快速变化。
push ax
mov cx,12
re0: push cx
mov cx,5000
re1: push cx
mov cx,5000
re2: mov ax,2
mov ax,1
add ax,ax
loop re2
pop cx
loop re1
pop cx
loop re0
pop ax
pop cx
ret
duank: push cx ;将时间信息读出并变为ASC码的子程序
mov al,[si]
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
pop cx
ret
code ends
end start