第8章 输入 输出

这一章中从以下几点讲述了80386的I/O特性:

  • I/O端口寻址方法(Methods of addressing I/O ports)

  • 引起I/O操作的指令(Instructions that cause I/O operations)

  • 当使用I/O指令和访问I/O端口时使用的保护规则(Protections as it applies to the use of I/O Instructions and I/O port addresses)

8.1.1 I/O 地址空间(I/O Address Space)

80386提供了独立的I/O地址空间,不同于物理内存空间,这些空间可以为16位设备端口来寻址。I/O地址空间由此2^16(64K)独立的可寻址8-位端口组成。任何两个连续的8-位端口可以当作一个16-位端口,4个连续的8-位端口可以当作一个32-位的端口。所以I/O地址空间总计64K个8-位端口,或者说32K个16-位端口,或者说16K个32-位端口。

程序可以以两种方式指定端口地址。通过使用立即数,程序可以指定:

  • 256个8-位端口,从0~255。

  • 128个16-位端口,从0,2,4,……,252,254。

  • 64个32-位端口,从0,4,8,……,248,252。

通过使用DX来指定:

  • 8-位端口,编号从0到65535

  • 16-位端口,编号从0,2,4,……,65532,65534

  • 32-位端口,编号从0,4,8,……,65528,65532

80386可以一次传送给指定地址的外设32、16、或8位数据。和在内存中的双字一样,32-位的端口地址应该可以被4整除,似便32-位数据可以在一次总线周期内传送完。16位的应该被2整除,8位的可以指定任何的地址。

IN和OUT指令在寄存器与端口间传送数据。INS和OUTS在内存和I/O地址空间之间传送整串的数据。

8.1.2 内存映射 I/O

I/O设备也可以放在主内存空间中。只要设备象内存一样的作出合适的反应,处理器并区别不出他们。

内存映射I/O指供了外加的编程伸缩性。任何访问内存的指令都可以用来访问位于内存空间的I/O设备。例如,MOV指令可以在寄存器和端口间传送数据。还有AND,OR,和TEST指令可以用来控制在外设内部的寄存器的位(见图8-1)。内存映射I/O可以使用任何寻址模式的指令(真接,间接,其址,索引,标量等)。

内存映射I/O和其它任何内存访问相同,在保护模式下有相同的保护的控制。参看第6章,关于内存保护。