;編程:訪問CMOS RAM以年/月/日 時:分:秒的格式,顯示當前的時間日期
assume cs:code
data segment
db 0,2,4,7,8,9,10
data ends
time segment
db 15 dup(0)
time ends
code segment
start:mov ax,data
mov ds,ax
mov si,0
mov ax,time
mov es,ax
mov di,0
call change
call showtime
mov ax,4c00h
int 21h
;名稱:change
;功能:從端口中取出時間的BCD碼,轉化成十進制放到內側段time中
;參數:ds:[si]爲時間在CMOS RAM中存放的內存單元號,es:[di]指向time段的首地址
change: push cx
chgs: mov al,ds:[si]
cmp al,10
je next
out 70h,al ;要訪問的內存單元號寫入地址端口70h
in al,71h ;從數據端口71h讀出內存單元號所對應的內容
mov ah,al ;al爲從CMOS RAM的ds:[si]號單元讀出的數據
mov cl,4
shr ah,cl ;移位次數大於1必須放入cl,不能使用其他寄存器存放
and al,00001111b ;低位
add ah,30h
add al,30h
mov dl,al
mov dh,0
mov al,0
push dx ;低位
push ax ;高位
inc si
loop chgs
next: mov cx,6
chgs1:pop ax
mov byte ptr es:[di],ah ;高位
pop dx
mov byte ptr es:[di+2],dl ;低位
add di,4
loop chgs1
pop cx
ret
;名稱:showtime
;功能:按 年/月/日 時:分:秒的格式,顯示當前的時間日期
;參數:time段存放着時間
showtime:push ax
push cx
mov ax,time
mov ds,ax
mov bp,0
mov ax,0b800h
mov es,ax
mov di,10*160+30*2
mov cx,3
shows: mov ax,ds:[bp] ;年/月/日
mov es:[di],al
mov ax,ds:[bp+2]
mov es:[di+2],al
mov ax,ds:[bp+12] ;時: 分: 秒
mov es:[di+20],al
mov ax,ds:[bp+14]
mov es:[di+22],al
add bp,4
add di,6
loop shows
mov byte ptr es:[10*160+30*2+4],'/' ;反斜槓
mov byte ptr es:[10*160+30*2+10],'/'
mov byte ptr es:[10*160+30*2+24],':';冒號
mov byte ptr es:[10*160+30*2+30],':'
pop cx
pop ax
ret
code ends
end start