汇编实验14:访问CMOS RAM

任务

编程,以“年/月/日 时:分:秒”的格式,显示当前的日期,时间。

预备知识

CMOS存储当前时间的信息:年、月、日、时、分、秒。这六个信息的长度均为1个字节,并且以BCD码的形式存放(什么是BCD码?这里就不科普了,自行百度,反正我也只是略懂),存放的单元如下表所示:

024789

那么怎么访问CMOS的端口呢?这就要用到inout指令。另外要注意的是,这两条指令只能用寄存器AX和AL发送和接收端口的数据。
也就是只能用in ax/al,端口号读入数据,只能用out 端口号,ax/al写数据,当然,这里的端口号既可以放在寄存器里,也可以凡在内存单元里,也可以是立即数,这无所谓。

CMOS芯片内部有两个端口,地址分别为70h与71h。

  • 70h为地址端口,存放要访问的CMOS单元地址
  • 71为数据端口,存放读写数据

要读取CMOS的2号单元,应该这么写

    mov     al,2
out 70h,al ;将2送入端口70h中
in al,71h ;从端口71h读取2号单元的内容

要将“0”写入CMOS的2号单元,应该这么写

    mov     al,2
out 70h,al ;将2送入端口70h
mov al,0
out 71h,al ;从端口71h写入0放到2号单元

编程思路

有了前面知识的铺垫,编程就变得相当简单。

在数据段先定义好输出格式

 time db '00/00/00 00:00:00$'

后面为什么加了个$符号呢?那是为了调用dos中断,用int 21h的9号功能输出字符串(没错,我就是这么懒,不想自己造轮子)。
接下来要从CMOS中读取时间信息,并且存放到数据段中去了。
显然这里要用到循环结构,为了方便,我还要定义一个地址表,给出各个时间信息的存放单元

list    db 9,8,7,4,2,1
;分别为年、月、日、时、分、秒的单元地址

用寄存器DI指向time字符串,用寄存器SI指向list地址表。每次循环调整时,
只要inc siadd di,3即可。

循环的核心部分思路,王爽的书中已经给出详细代码,就不在赘述(好吧,我就是懒)。这里有一点要注意的是,由于循环体中用到了CX寄存器,因此使用loop指令要注意寄存器CX的保护。其次,对于时间信息来说(这里以年为例子),‘16’年中数字16中的十位数字“ 1 ”在存储单元低地址位置,而个位数字“ 6 ”在存储单元高地址位置,因此我在实现的过程中,将数字“1”的ascii码放在寄存器AL中,将数字“6”的ascii码放在寄存器AH中,然后将寄存器AX整体复制到time字符串中。当然中间将BCD码转换成ASCII码的实现,在王爽的书里已经有了,就不贴出来了。

代码实现

其实这次实验很简单,代码也简单明了,一看就懂,没必要写注释了(偷懒偷得理直气壮,笑)

assume      cs:code,ds:data,ss:stack

data        segment
time db '00/00/00 00:00:00$'
list db 9,8,7,4,2,0
data ends stack segment
db 256 dup(0)
stack ends code segment main: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,256 mov si,offset list
mov di,offset time
mov cx,6
s: push cx
mov al,[si]
out 70h,al
in al,71h mov ah,al
mov cl,4
shr al,cl
and ah,00001111b
add ax,3030h mov [di],ax add di,3
inc si
pop cx
loop s mov ah,9
mov dx,offset time
int 21h mov ax,4c00h
int 21h code ends end main

最后的效果是这样的:

汇编实验14:访问CMOS RAM-LMLPHP

总结

这篇博文本来我早就想发的,但是因为种种原因,拖到现在才发(我发誓,这次真的不是因为懒)。王爽的《汇编语言(第三版)》马上就要读完了,感觉自己慢慢开始入门了,找到了点汇编的门道,虽然前面的路还很长(32位汇编,实模式,保护模式,AT&T,inte,IA32,以上名词本人一无所知),但我还是有信心可以成为“牛人”的。读完这本书以后,我就要开始数据结构和算法的学习了,业余时间我还想读一读《深入理解计算机系统》(CSAPP),我听说学校有一门课的教材就是这本书,这老师是要把学生培养成“牛人”,然后上天的节奏啊!!!不过这个过程还是很幸苦的。(只要你成为牛人,那么即使成为书呆子也无所谓啦

05-11 09:33