接口中通常都设置了一些用于数据、控制和状态缓存的寄存器,这些寄存器就是能够让CPU直接访问的I/O端口。为了便于CPU对外部设备的快速识别和选择,必须对接口中所有可访问的寄存器(I/O端口)进行编址。常用的编址方式主要有两种,一种是I/O端口与主存储器统一的编址方式,另一种是I/O端口与主存储器彼此独立的编址方式。
1.统一编址方式
统一编址方式是将主存地址空间分出一部分地址用于对I/O端口进行编址,也就是I/O端口使用了原本属于主存地址对其进行编址。此方式无需设置专门的输入输出指令,只要用一般的访问主存的指令就可以访问I/O端口。由于这种方法是将I/O端口映射到主存空间的某些地址上,所以又称为存储映射I/O方式。
在统一编址方式下,I/O端口访问和主存访问指令相同,所以它的保护机制可由分段或分页存储管理来实现,而无需另外专门的保护机制。这种存储器映射方式给编程提供了非常大的灵活性。任何对内存存取的指令都可用来访问位于主存空间中的I/O端口,并且所有有关主存的寻址方式都可用于I/O端口的寻址。例如,可用MOV指令实现寄存器和I/O端口的数据传送,可用AND、OR或TEST等指令直接操作I/O接口中的控制寄存器或状态寄存器。此外,由于外设和I/O寄存器的数目几乎不受限制,这种编制方式还便于扩大系统吞吐量,这在大型控制或数据通信系统等特殊场合很有用。但是,统一编址使I/O占用了一部分主存空间的地址,主存空间减少了。而且,由于在识别I/O端口时全部地址线都需参与地址译码,使译码电路变得复杂,译码所需时间变长,使执行外设寻址的操作时间相对增长了。
2.独立编址方式
独立编址方式则是将I/O端口单独进行编址,使I/O端口和存储空间的地址空间互相独立。采用这种编址方式,CPU访问I/O端口时必须使用专用的I/O指令。当CPU使用I/O指令时,其指令的地址字段直接或间接的指示出端口地址。这些端口地址被接口电路中的地址译码器接收并且进行译码,符合者就是CPU所指定的外设寄存器,该外设寄存器将被CPU访问。目前以x86系列微处理器为核心的微机一般都采用的是I/O独立编址方式,其I/O地址空间由216(64K)个地址编号组成,每个编号可以寻址一个8位的I/O端口,两个连续的8位端口可看成一个16位端口,四个连续的8位端口则可作为一个32位端口处理。所以,64K个I/O地址空间最多能提供64K个8位端口、32K个16位端口、16K个32位端口等总容量不超过64KB的不同端口的组合。