11.1 独立编址与存储器映射 I/O
第 10 章沿着地址追踪到最终响应的存储器芯片。处理器还要与开关、显示器和控制器等设备交换数据。输入输出接口(input/output interface)位于 CPU 总线与设备之间。它向 CPU 暴露称为端口(port)或设备寄存器(device register)的小型存储位置,再把总线读写转换成设备动作。
决定设备寄存器属于哪片地址空间
地址空间(address space)是由同一种访问机制解释的全部地址。在独立编址 I/O(isolated I/O)中,存储器和 I/O 使用彼此分开的空间。对 8086 而言,IN、OUT 指令选择 I/O 空间,总线控制信号则区分 I/O 周期与存储器周期。因此,端口地址可以与存储器地址数值相同而不冲突:存储单元 0060H 和 I/O 端口 0060H 是两个不同目标。
在存储器映射 I/O(memory-mapped I/O)中,设备寄存器占用普通存储器空间内的地址。软件可以使用一般存储器指令访问它,但每个设备窗口都会占用原本可分配给存储器的地址。
两种方式改变的是软件接口和译码器,而不是设备的基本用途。独立编址保留存储器地址空间,并让设备访问在程序中一目了然;存储器映射方式则允许使用普通寻址方式和存储器操作。审查设计时,要核对可用指令、译码器检查的总线周期类型,以及设备窗口是否与其他目标重叠。
把 IN 与 OUT 追踪为数据传送
在 8086 中,IN 把数据从 I/O 端口送入 AL 或 AX;OUT 把 AL 或 AX 中的数据送到 I/O 端口。累加器宽度决定一次传送 8 位还是 16 位。
端口地址有两种来源:
- 指令内的 8 位立即数可以选择 00H–FFH 端口。
DX寄存器提供 16 位端口地址,可以选择 0000H–FFFFH 端口。
例如,若 DX=03F8H,状态端口中保存 60H,IN AL, DX 会把 60H 复制到 AL,不会修改 DX 或端口。若 AL=55H,OUT DX, AL 会把 55H 送到选中的设备寄存器。交换操作数会颠倒预期数据方向,而且不是合法的 8086 写法。
端口地址负责选择寄存器,它不是数据值;累加器负责承载数据,它不选择端口。分清这两种职责,可以避免最常见的入门程序错误。
现在,CPU 已经能够访问设备寄存器。第 11.2 节将解决两个新问题:硬件如何可靠选中唯一端口,以及软件如何知道设备是否已经就绪。