汇编语言 第14章 端口

隐藏

简介

我们知道,各种存储器都与CPU的地址总线、数据总线、控制总线相连(参见第一章)。 CPU操作它们是通过把它们抽象成一片分段的连续的内存空间(用逻辑存储器实现物理地址映射)。这个逻辑存储器称为内存地址空间(CSAPP中也成为虚拟地址空间)。

和CPU通过总线相连的除了存储器(如内存、显存)外,还有以下3种芯片:

  1. 各种接口卡(网卡、显卡等)上的接口芯片,它们控制接口卡工作。
  2. 主板上的接口芯片(南北桥),CPU通过它们与外设进行访问。
  3. 其他芯片,存储相关系统信息,或进行相关输入输出处理。

这些芯片各自都有一组可由CPU读写的寄存器。 CPU对它们(寄存器)的读写操作都是通过控制线向它们所在芯片发出端口读写命令

可见,从CPU角度,讲这些芯片寄存器视为端口,对它们进行统一编址,从而建立一个统一端口地址空间。每个端口在地址空间中都有一个地址。

加上端口,CPU实质上可以读写3个地方的数据:

  1. 寄存器
  2. 内存地址空间
  3. 端口

总的来说,端口是控制外设的方式(通过外设芯片中的寄存器),CPU通过一个统一的端口地址来定位端口(类似于虚拟内存地址)。

端口的读写

端口地址和内存地址一样,都是通过地址总线指定地址,用控制总线表述指令(如读、写),然后用数据总线传送数据。 端口读写汇编命令是in和out。

访问端口:

in al, 60h    ;从60h号端口读入一个字节
out 3f8h, al  ;向3f8号端口写入一个字节

注意8086中访问端口只能通过ax、al,访问8位端口用al,访问16位端口用ax。

CMOS RAM芯片

CMOS芯片特征如下:

  1. 包含一个实时钟,一个128个存储单元的RAM
  2. 该芯片靠电池供电,所以关机后,内部时钟仍可正常工作,RAM信号不丢失
  3. 128个字节单元中,0~0dh字节保持时间信息,其余大部分单元保存系统配置信息,供系统启动时BIOS读取。BIOS也有程序可在开机时配置CMOS RAM中的信息。
  4. 芯片内部有两个端口70h和71h,CPU通过这两个端口读写CMOS RAM
  5. 70h为地址端口,存放访问CMOS RAM单元的地址,71h为数据端口,存放从CMOS RAM中读出的数据,或者写入的数据。

所以CPU对CMOS RAM的读写分两步:

  1. 设置70h为要读/写的CMOS RAM地址
  2. 读取或写入71h端口

shl和shr指令

shl和shr是逻辑移位指令(shift left 和 shift right)

shl指令功能:

  1. 将数据左移移位
  2. 被移出的最高位写入CF(carry flag)中
  3. 最低位用0补充

shr指令功能:

  1. 将数据右移移位
  2. 被移出的最低位写入CF(carry flag)中
  3. 最高位用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码。

那么通过以上信息,就可以读写系统时间信息了。

-----EOF-----

Categories: 汇编 Tags: 汇编 底层 端口