访问CMOS RAM
要求:
编程,以“年/月/日 时:分:秒”的格式,显示当前的日期,时间。
个人分析:
我是以一个输出模板’yy/mm/ss hh:mm:ss’, 0,然后把提取到的数字转换字符都’扔’到模板中,方便后续一起输出,调用一个输出的子程序就可以搞定。
提醒一点,读出来的数是一个2位的十进制数,由课本中提到的BCD码,可以知道,低4位代表的是十进制的个位,高4位是十进制的十位,分别转换成字符后,年月日时分秒其实一个占一个字型数据。
实验中大部分的知识甚至一些程序编写,前面的案列中都有提到,就不多说了。这里就直接上代码了。
汇编代码:
assume cs:code
data segment
db 'yy/mm/ss hh:mm:ss', 0 ;输出模板
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, 0 ;初始化输出模板
mov bx, 9 ;方便循环操作
mov dx, 3 ;计数
mov cl, 4
y_m_s:
mov al, bl
out 70h, al ;给70h端口送入9,访问CMOS-9号地址
in al, 71h ;拿出9号地址中间的内容
mov ah, al
shr ah, cl ;只需要前面4个字节
and al, 00001111b ;只需要后面4个字节
add ah, 30h
add al, 30h
mov [si], ah ;放入模板字符串中
mov [si+1], al
add si, 3
dec bx
dec dx
cmp dx, 0 ;判断循环是否结束
je h_m_s_start
jmp short y_m_s
h_m_s_start:
mov bx, 4
mov dx, 3
h_m_s:
mov al, bl
out 70h, al
in al, 71h
mov ah, al
shr ah, cl
and al, 00001111b
add ah, 30h
add al, 30h
mov [si], ah
mov [si+1], al
add si, 3
sub bx, 2
dec dx
cmp dx, 0
je print_str_start
jmp short h_m_s
print_str_start:
call print_str
mov ax, 4c00h
int 21h
---------------pirnt_str------------------
print_str:
push es
push ax
push cx
push di
push si
mov ax, 0b800h
mov es, ax ;初始化显存
mov si, 0
mov di, 36*2 ;确定列
mov cx, 0 ;结束输入的条件
print_loop:
mov cl, [si]
jcxz print_ok
mov es:[160*12][di], cl
inc si
add di, 2
jmp short print_loop
print_ok:
pop si
pop di
pop cx
pop ax
pop es
ret
code ends
end start
运行结果: