## 8.2 I/O 指令(I/O Instructions)
80386的I/O指令使得处理器可以访问I/O端口,以便从外设输入数据,或者向外设发送数据。这些指令有一个指定I/O空间端口地址的操作数。有两类的I/O指令:
1、 在寄存器指定的地址传送一个数据(字节、字、双字)。
2、 传送指定内存中的一串数据(字节串、字串、双字串)。这些被称作为“串 I/O指令”或者说“块I/O指令”。
### 8.2.1 寄存器I/O指令(Register I/O Instructions)
I/O指令IN和OUT是用来在I/O端口和EAX(32位)或AX(16位)或AL(8位)通用寄存器间传送数据的。IN和OUT指令可以是直接寻址(0~255端口地址),也可以通过DX寄存器间接寻址(0~64K端口地址)。
IN(Input from Port)从I/O端口传送一个字节、字、双字到AL、AX、或EAX寄存器。如果程序指定了AL寄存器,处理器从端口传送8位到AL寄存器。如果指定了AX寄存器,则传送16位到AX寄存器。如果指定了EAX寄存器,则传送32位到EAX寄存器。
OUT(Output to Port)从AL、AX、或EAX传送一个字节、字、双字到端口。程序可以指定不同的寄存器(AL、AX、EAX)来传送不同数量的字节。
![](https://box.kancloud.cn/2016-03-06_56dbfdae027fd.gif)
### 8.2.2 块I/O指令(Block I/O Intructions)
块I/O指令INS和OUTS用来在内存和端口间传送数据。块I/O指令使用DX来指定I/O端口地址。INS和OUTS用DX来指定:
+ 8位端口,编号从0~65535
+ 16位端口,编号从0,2,4,……,65532,65534
+ 32位端口,编号从0,4,8,……,65528,65532
块I/O指令使用SI或DI来指定源或目标内存地址。对每次传送,SI或DI通过标志寄存器里的方向位会自动增加或减少。
INS和OUTS,当使用 repeat 前缀时,会将一块数据输入或输出。REP,重复前缀,修饰INS或OUTS来指示他们在内存和端口间传送一块数据。这些块I/O指令是基于串原语的(参看第3章,关于串原语)。他们使得编程简化了,还能过消除了用单寄存器来保存数数的循环从而增加了数据传输速度。
基于串的指令可以传送字节、字、或是双字串。每一次传送结束后,ESI或EDI的内存地址将更新1个字节(字节操作数),或2个字节(字操作数),或4个字节(双字操作数)。标志寄存器里的DF标志将决定是增加还是减少ESI、EDI(DF=0 增加,DF=1 减少)。
INS(Input String from Port)从一个输入端口传送一串字节、字、或者双字到内存中。INSB、INSW、INSD是这条指令的变种,分别指定了操作传送单元的大小。如果一个程序指定INSB,处理器从输入端口传送8位到ES:EDI指定的内存处。如果程序指定了INSW则传送16位数据单元,INSD则传送32位数据单元。目的地的段寄存器ES不能被更改。和REP前缀一起使用,INS从输入端口传送一块数据信息到连续的内存地址处。
OUTS(Output String to Port)从内存传送一个字节、字、或双字串到输出端口。OUTSB,OUTSW,OUTSD是这条指令的变种,指定的数据单元的大小。如果程序指定了OUTSB,处理器从ES:EDI指定的内存处传8-位到输出端口。如果指定了OUTSW,则传送16位数据单元。如果指定了OUTSD,则传送32位数据单元。混合REP前缀,OUTS从内存的连续地址处传送一块数据到指定的端口。
- 第一章 80386介绍
- 1.1 该手册的组织结构
- 1.2 其他文献
- 第二章 编程基本模型
- 2.1 存储器组织和段
- 2.2 数据类型
- 2.3 寄存器
- 2.4 指令格式
- 2.5 操作数选择
- 2.6 中断和异常
- 第4章 系统寄存器
- 4.1 系统寄存器 (System Registers)
- 4.2 系统指令 (System Instructions)
- 第五章 内存管理
- 5.1 分段地址转换(Segment Translation)
- 5.2 分页地址转换(Page Translation)
- 5.3 混合分段和分页地址转换(Combining Segment and Page Translation)
- 第六章 内存管理
- 6.1 为什么要保护(Why Protection?)
- 6.2 80386保护机制概述(Overview of 80386 Protection Mechnaisms)
- 6.3 段级保护(Segment-Level Protection)
- 6.4 页级保护(Page-Level Protection)
- 6.5 混合分页和分段保护(Combining Page and Segment Protection)
- 第7章 多任务(Multitasking)
- 8.1 I/O 寻址(I/O Addressing)
- 7.1 任务状态段(Task State Segment)
- 7.3 任务寄存器(Task Register)
- 7.4 任务门描述符(Task Gate Descriptor)
- 7.5 任务切换(Task Switching)
- 7.6 任务链(Task Linking)
- 7.7 任务寻址空间(Task Address Space)
- 第8章 输入 输出
- 8.2 I/O 指令(I/O Instructions)
- 8.3 保护和I/O(Protection and I/O)
- 第9章 异常和中断(Exceptions and Interrupts)
- 9.1 识别中断(Identifying Interrupts)
- 9.2 允许和禁止中断(Enabling and Disabling Interrupts)
- 9.3 同时发生的中断和异常的优先级(Priority Among Simultaneous Interrupts and Exceptions)
- 9.4 中断描述符表(Interrupt Descriptor Table)
- 9.5 IDT 描述符(IDT Descriptors)
- 9.6 中断任务和中断子程序(Interrupt Tasks and Interrupt Procedures)
- 9.7 出错码(Error Code)
- 9.8 异常条件(Exception Conditions)
- 9.9 异常总结(Exception Summary)
- 9.10 出错码总结(Error Code Summary)
- 第10章 初始化(Initialization)
- 10.1 复位后处理器状态(Processor State After Reset)
- 10.2 实模式初始化(Software Initialization for Real-Address Mode)
- 10.3 切换到保护模式(Switching to Protected Mode)
- 10.4 保护模式初始化(Software Initialization for Protected Mode)
- 10.5 初始化示例
- 10.6 TLB测试
- 第十四章 80386实地址模式
- 14.1 物理地址构成
- 14.2 寄存器和指令
- 14.3 中断和异常处理
- 14.4 进入和离开实地址模式
- 14.6 实地址模式异常
- 14.7 与8086的不同
- 14.8 与80286实地址模式的不同