在PC机系统中,和CPU通过总线相连的芯片除了各种存储器外,还有以下3中芯片。
- 各种接口卡(比如,网卡,显卡)上的接口芯片,它们控制接口卡进行工作;
- 主板上的接口芯片,CPU通过它们对部分外设进行访问;
- 其他芯片,用来存储相关的系统信息,或者进行相关的输入输出处理。
这些芯片中,都有一组可以由CPU读写的寄存器。这些寄存器,它们在物理上可能处于不同的芯片中,但它们在以下两点上相同。
- 都和CPU的总线相连,当然这种连接是通过它们所在的芯片中进行的。
- CPU对它们进行读或写的时候都通过控制总线向它们所在的芯片发出端口读写命令。
可见,从CPU的角度,将这些寄存器都当作端口,对它们进行统一编址,从而建立了一个同意的端口地址空间。每一的端口在地址空间中都有一个地址。
CPU可以直接读写以下3个地方的数据。
- CPU内部的寄存器
- 内存单元
- 端口
端口的读写
在访问端口的时候,CPU通过端口地址来定位端口。因为端口所在的芯片和CPU通过总线相连,所以,端口地址和内存地址一样,通过地址总线来传递。在PC系统中,CPU最多可以定位64KB个不同的端口。则端口地址的范围为0~65535。
对端口的读写不能用mov,push,pop等内存读写指令。端口的读写指令只有两条:in 和 out,分别用于从端口读取数据和往端口写入数据。
CPU执行内存访问指令和端口访问指令时候,总线上的信息:
访问内存:
mov ax,ds:[8] ;假设执行前(ds)=0
执行时与总线相关的操作如下所示:
- CPU通过地址线将地址信息8发出
- CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据。
- 存储器将8号单元中的数据通过数据线送入CPU
访问端口:
in al,60h ;从60h号端口读入一个字节
执行时与总线相关的操作如下:
- CPU通过地址线将地址信息60h发出;
- CPU通过控制线发出端口读命令,选中端口所在的芯片,并通知它,将要从中读数据;
- 端口所在的芯片将60h端口中的数据通过数据线送入CPU。
注意在 in 和 out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口的数据。访问8位端口(0~255)时用al,访问16位端口(256 ~ 65536)时用ax。
CMOS RAM 芯片
PC机中,有一个 CMOS RAM芯片,一般简称为CMOS。此芯片的特征如下。
- 包含一个实时钟和一个有128个存储单元的RAM存储器。
- 该芯片靠电池供电。所以,关机后其内部的实时钟仍可以正常工作,RAM中的信息不丢失。
- 128个字节的RAM中,内部实时钟占用0~0dh单元来保存时间信息,其余大部分单元用保存系统配置信息,供系统启动时BIOS程序读取。BIOS也提供了相关的程序,使我们可以在开机的时候配置 CMOS RAM中的系统信息。
- 70h为地址端口,存放要访问的 CMOS RAM单元的地址;71h为数据端口,存放从选定的 CMOS RAM单元中读取的数据,或要写入到其中的数据。可见CPU对 CMOS RAM的读写分两步进行,比如,读 CMOS RAM的2号单元:
- 将2送入端口70h;
- 从端口71h读出2号单元的内容。
shl 和 shr 指令
shl是逻辑左移指令,它的功能为:
- 将一个寄存器或内存单元中的数据向左移位;
- 将最后移出的一位写入CF中;
- 最低位用0补充。
shr是逻辑右移指令,它和shl所进行的数据操作刚好相反。
- 将一个寄存器或内存单元中的数据向右移位;
- 将最后移出的一位写入CF中;
- 最高位用0补充。