在CMOS RAM中,存放着当前的时间:年、月、日、时、分、秒。这6个信息的长度都为1个字节,存放单元为:
秒:0 分:2 时:4 日:7 月:s 年:9
这些数据以BCD码的方式存放。
BCD码是以4位二进制数表示十进制数码的编码方法,如下所示。
十进制数码: 0 1 2 3 4 5 6 7 8 9 对应的BCD码:0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
比如,数值26,用BCD码表示为:0010 0110< 可见,一个字节可表示两个BCD码。则CMOS RAM存储时间信息的单元中,存储了用两个BCD码表示的两位十进制数,高4位的BCD码表示十位,低4位的BCD码表示个位。比如,OOOlOl00b表示14 编程,在屏幕中间显示当前的月份。 分析,这个程序主要做以下两部分工作。 (1)从CMOS RAM的8号单元读出当前月份的BCD码。 要读取CMOS RAM的信息,首先要向地址端口70h写入要访问的单元的地址:
mov al,8 out 70h,a1
然后从数据端口71h中取得指定单元中的数据:
in al,71h
(2)将用BCd码表示的月份以十进制的形式显示到屏幕上。
我们可以看出,BCD码值=十进制数码值,则BCD码值++30h二十进制数对应的ASCII码。
从CMOS RAM的8号单元读出的一个字节中,包含了用两个BCD码表示的两位十进制数,高4位的BCD码表示十位,低4位的BCD码表示个位。比如,000l0l00b表: 14
我们需要进行以下两步工作。
(1)将从CMOS RAM的8号单元中读出的一个字节,分为两个表示BCD码值的数据
mov ah,al ;al中为从CMOS RAM的 8 号单元中读出的数据 mov c1,4 shr ah,cl ;ah中为月份的十位数码值 and al,000llllb ;al中为月份的个位数码值
(2)显示(ah)+30h和(al)+30h对应的ASCII码字符
完整的程序如下
assume cs:code code segment start:mov al,8 out 70h,a1 in al,71h mov ah,al mov c1,4 shr ah,cl and al,000llllb add ah,30h add al,30h mov bx,0b800h mov es,bx mov byte ptr es:[160*12+40*2],ah ;显示月份的十位数 mov byte ptr es:[160*12+40*2+2],al ;接着显示月份的十位数码 mov ax,4c00h int 21h code ends end start