第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章,关于内存保护。