汇编语言 实验14

;*********************************************************
;实验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

发布了23 篇原创文章 · 获赞 22 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章