读取CMOS内存中的时钟
一、CMOS内存信息详解
一般的PC/AT、286、386、486等微机均配有CMOS芯片,CMOS&127;芯片包含了一个实时钟
和64个字节的CMOS内存。在CMOS内存中,0-0DH为实时钟的有关信息,0E-&127;3FH包含
计算机的硬件配置信息,如常规内存的大小、扩展内存的大小、&127;软盘的类型、固定
盘的类型及其物理参数、显示器的类型等,这些参数与计算机能否正常工作具有密切的
关系,另外还有计算机的开机口令和其它辅助设置信息。表1列出了CMOS内存各字
节的用途。
偏移量 | 偏移量 | 字段长度 | 功能描述 |
00h | 0 | 1 | 用BCD描述的当前秒(00-59) |
01h | 1 | 1 | 用BCD描述的报警时钟秒 |
02h | 2 | 1 | 用BCD描述的报警当前分钟(00-59) |
03h | 3 | 1 | 用BCD描述的报警时钟分钟 |
04h | 4 | 1 | 用BCD描述的报警当前小时(00-23) |
05h | 5 | 1 | 用BCD描述的报警时钟(以小时为单位) |
06h | 6 | 1 | 用BCD描述的当前日期(星期几)(00-06) |
07h | 7 | 1 | 用BCD描述的当前日期(日)(00-31) |
08h | 8 | 1 | 用BCD描述的当前月(00-12) |
09h | 9 | 1 | 用BCD描述的当前年(00-99) |
0Ah | 10 | 1 | 状态注册码A |
0Bh | 11 | 1 | 状态注册码B |
0Ch | 12 | 1 | 状态注册码C |
0Dh | 13 | 1 | 状态注册码D |
0Eh | 14 | 1 | 诊断状态 |
0Fh | 15 | 1 | 系统关闭代码 |
10h | 16 | 1 | 软盘驱动器类型 |
11h | 17 | 1 | 高级BIOS设置选项 |
12h | 18 | 1 | 硬盘O/I类型(0-15) |
13h | 19 | 1 | 键盘输人速率与延迟 |
14h | 20 | 1 | 安装设备 |
15h | 21 | 1 | 从低位字节计数的基本内存,以1K计数 |
16h | 22 | 1 | 从高位字节计数的基本内存,以1K计数 |
17h | 23 | 1 | 从低位字节计数的扩展内存,以1K计数 |
18h | 24 | 1 | 从高位字节计数的扩展内存,以1K计数 |
19h | 25 | 1 | 硬盘扩展类型0(0-255) |
1Ah | 26 | 1 | 硬盘扩展类型1(0-255) |
1Bh | 27 | 8 | 硬盘0的用户定义类型信息 |
24h | 36 | 8 | 硬盘1的用户定义类型信息 |
2Dh | 45 | 1 | 高级BIOS设置选项 |
2Eh | 46 | 1 | 高位字节CMOS校验和 |
2Fh | 47 | 1 | 低位字节CMOS校验和 |
30h | 48 | 1 | 从低位字节计数的POST报告扩展内存 |
31h | 49 | 1 | 从高位字节计数的POST报告扩展内存 |
32h | 50 | 1 | BCD码公元数(00-90) |
33h | 51 | 1 | 通电自检信息标志 |
34h | 52 | 2 | 高级BIOS设置选项 |
36h | 54 | 1 | 指定芯片组的BIOS设置选项 |
37h | 55 | 7 | 加电口令(通常加密) |
3Eh | 62 | 1 | 从高位字节计数的扩展CMOS校验和 |
3Fh | 63 | 1 | 从低位字节计数的扩展CMOS校验和 |
二、读写CMOS内存的方法
CMOS内存的地址口和数据口的口地址分别为70H和71H。在对CMOS内存进行写操作时,首先
将要写入的CMOS内存的地址送到口地址70H,&127;再将要写入的数据送口地址71H。在对
CMOS内存进行读操作时,首先将要读出的CMOS内存的地址送到口地址70H,再从口地址71H
读出数据到AL寄存器。
注意,若对RTC的访问么有做到互斥,那么读取到的时间将不正确。因为在读取的时候,会先往70H端口写数据(要读年?yue?ri?..),再从71H端口读数据;有可能会出现一个在读年的数据,而另外一个在读月的数据,最终从71H端口读取到的数据有可能就都是月的数据。