汇编语言 第14章 端口
简介
我们知道,各种存储器都与CPU的地址总线、数据总线、控制总线相连(参见第一章)。 CPU操作它们是通过把它们抽象成一片分段的连续的内存空间(用逻辑存储器实现物理地址映射)。这个逻辑存储器称为内存地址空间(CSAPP中也成为虚拟地址空间)。
和CPU通过总线相连的除了存储器(如内存、显存)外,还有以下3种芯片:
- 各种接口卡(网卡、显卡等)上的接口芯片,它们控制接口卡工作。
- 主板上的接口芯片(南北桥),CPU通过它们与外设进行访问。
- 其他芯片,存储相关系统信息,或进行相关输入输出处理。
这些芯片各自都有一组可由CPU读写的寄存器。 CPU对它们(寄存器)的读写操作都是通过控制线向它们所在芯片发出端口读写命令。
可见,从CPU角度,讲这些芯片寄存器视为端口,对它们进行统一编址,从而建立一个统一端口地址空间。每个端口在地址空间中都有一个地址。
加上端口,CPU实质上可以读写3个地方的数据:
- 寄存器
- 内存地址空间
- 端口
总的来说,端口是控制外设的方式(通过外设芯片中的寄存器),CPU通过一个统一的端口地址来定位端口(类似于虚拟内存地址)。
端口的读写
端口地址和内存地址一样,都是通过地址总线指定地址,用控制总线表述指令(如读、写),然后用数据总线传送数据。 端口读写汇编命令是in和out。
访问端口:
in al, 60h ;从60h号端口读入一个字节
out 3f8h, al ;向3f8号端口写入一个字节
注意8086中访问端口只能通过ax、al,访问8位端口用al,访问16位端口用ax。
CMOS RAM芯片
CMOS芯片特征如下:
- 包含一个实时钟,一个128个存储单元的RAM
- 该芯片靠电池供电,所以关机后,内部时钟仍可正常工作,RAM信号不丢失
- 128个字节单元中,0~0dh字节保持时间信息,其余大部分单元保存系统配置信息,供系统启动时BIOS读取。BIOS也有程序可在开机时配置CMOS RAM中的信息。
- 芯片内部有两个端口70h和71h,CPU通过这两个端口读写CMOS RAM
- 70h为地址端口,存放访问CMOS RAM单元的地址,71h为数据端口,存放从CMOS RAM中读出的数据,或者写入的数据。
所以CPU对CMOS RAM的读写分两步:
- 设置70h为要读/写的CMOS RAM地址
- 读取或写入71h端口
shl和shr指令
shl和shr是逻辑移位指令(sh
ift l
eft 和 sh
ift r
ight)
shl指令功能:
- 将数据左移移位
- 被移出的最高位写入CF(carry flag)中
- 最低位用0补充
shr指令功能:
- 将数据右移移位
- 被移出的最低位写入CF(carry flag)中
- 最高位用0补充
格式为: shr或者shl 数据, 1或者cl
其中1指的是移位1次,例如shl al, 1
如果移位大于1次,例如3次,要先mov cl 3
然后 shr al, cl
CMOS RAM中存储的时间信息
CMOS RAM中存放的时间位置为:
秒:0号字节 分:2号字节 时:4号字节 日:7号字节 月 8:号字节 年:9好字节
它们都是存放一个字节,用BCD码表示。 BCD(Binary-Coded Decimal)即用4位二进制表示十进制,例如1001表示9
1个字节2位,就可以表示00~99, 高4位地址表示十进制的高位(十位), 低4位地址表示十进制的低位(个位)。
BCD码+30H即对应的十进制ASCII码。
那么通过以上信息,就可以读写系统时间信息了。