;*********************************************************
;实验14:访问CMOS RAM
;以“年/月/日 时:分:秒”的格式,显示当前时间和日期
;*********************************************************
assume cs:code
code segment
start:
mov ax, 0b800h
mov es, ax
mov di, 160*12+30*2 ;显示在12行,30列
mov al, 0ah ;将al设为10,因为在CMOS RAM中,年月日时分秒的存放单元为9,8,7,4,2,0
push di
rdata:
dec al
cmp al, 7
jb rtime ;当al小于7时,说明年月日读取完毕,已经读到时分秒
call show ;将日期显示
add di, 6 ;XX/XX/XX X(2字节)X(2字节)/(2字节),一共要向后跳6字节
jmp short rdata ;回跳继续显示日期
rtime:
sub al, 2
cmp al, 0feh ;0000h - 2 = 0feh
je sign ;若al == 0feh 则跳到显示”/”, “:”
call show
add di, 6 ;XX:XX:XX X(2字节)X(2字节):(2字节),一共要向后跳6字节
jmp short rtime
sign: ;XX/XX/XX XX:XX:XX
pop di
add di, 4 ;XX/ X(2字节)X(字节),一共要向后跳4个字节
mov byte ptr es:[di], ‘/’
add di, 6
mov byte ptr es:[di], '/'
add di, 12
mov byte ptr es:[di], ':'
add di, 6
mov byte ptr es:[di], ':'
mov ax, 4c00h
int 21h
show:
push ax
push cx
out 70h, al ;70h 为地址端口存放要访问的 CMOS RAM 单元的地址
in al, 71h ;71h 为数据端口,存放从选定的 CMOS RAM 单元中读取的数据,或要写入到其中的数据
mov cx, 4
mov ah, al
shr ah, cl ;将ah置为0000XXXXh
and al, 0fh ;将al置为0000XXXXh
add ah, 30h ;转为对应的ascii码
add al, 30h ;转为对应的ascii码
mov es:[di], ah ;存入显存
mov es:[di+2], al
pop cx
pop ax
ret
code ends
end start