## 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)來傳送不同數量的字節。

### 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實地址模式的不同