INS/INSB/INSW/INSD - 從埠輸入到字串

操作碼

指令

說明

6C

INS m8, DX

從 DX 指定的 I/O 埠將位元組輸入 ES:(E)DI 指定的記憶體位置

6D

INS m16, DX

從 DX 指定的 I/O 埠將字輸入 ES:(E)DI 指定的記憶體位置

6D

INS m32, DX

從 DX 指定的 I/O 埠將雙字輸入 ES:(E)DI 指定的記憶體位置

6C

INSB

從 DX 指定的 I/O 埠將位元組輸入 ES:(E)DI 指定的記憶體位置

6D

INSW

從 DX 指定的 I/O 埠將字輸入 ES:(E)DI 指定的記憶體位置

6D

INSD

從 DX 指定的 I/O 埠將雙字輸入 ES:(E)DI 指定的記憶體位置

說明

從源運算元(第二個運算元)指定的 I/O 埠將數據複製到目標運算元(第一個運算元)。源運算元是從 DX 暫存器讀取的 I/O 埠地址(從 0 到 65,535)。目標運算元是記憶體位置,其地址從 ES:EDI 或 ES:DI 暫存器讀取(具體取決於指令的地址大小屬性,分別是 32 或 16)。(ES 段不能使用跨段字首覆蓋)。對於 8 位 I/O 埠,訪問的 I/O 埠的大小(即源運算元與目標運算元的大小)由操作碼確定;對於 16 或 32 位 I/O 埠,則由指令的運算元大小屬性確定。

在彙編程式碼級別,此指令允許採用兩種形式:“顯式運算元”形式與“無運算元”形式。顯式運算元形式(使用 INS 助記符指定)可以明確指定源運算元與目標運算元。這裡,源運算元必須是 "DX",目標運算元應該是表示 I/O 埠與目標地址大小的符號。提供此顯式運算元形式是爲了便於記錄;不過請注意,此形式提供的記錄可能會令人誤解。也就是說,目標運算元符號必須指定運算元(位元組、字或雙字)的正確型別(大小),但不必指定正確的位置。位置總是由 ES:(E)DI 暫存器指定,在執行 INS 指令之前,必須先正確載入這些暫存器。

無運算元形式提供“簡短形式”的位元組、字及雙字版 INS 指令。這裡,處理器假設 DX 是源運算元,ES:(E)DI 是目標運算元。I/O 埠的大小可以選擇使用助記符指定:INSB(位元組)、INSW(字)或 INSD(雙字)。

從 I/O 埠將位元組、字或雙字傳輸到記憶體位置之後,根據 EFLAGS 暫存器中的 DF 標誌的設定,(E)DI 暫存器自動遞增或遞減。(如果 DF 標誌是 0,則 (E)DI 暫存器遞增;如果 DF 標誌是 1,則 (E)DI 暫存器遞減)。對於位元組操作,(E)DI 暫存器遞增或遞減 1;對於字操作,遞增或遞減 2;對於雙字操作,遞增或遞減 4。

通過加上 REP 字首,可以使用 INS、INSB、INSW 及 INSD 指令整塊輸入 ECX 位元組、字或雙字。如需有關 REP 字首的說明,請參閱本章的 REP/REPE/REPZ/REPNE/REPNZ - 重複字串操作字首

這些指令僅用於訪問處理器 I/O 地址空間中的 I/O 埠。如需有關訪問 I/O 地址空間中的 I/O 埠的詳細資訊,請參閱“IA-32 英特爾(R) 體系結構軟件開發人員手冊”第 1 卷第 9 章“輸入/輸出”。

操作

IF ((PE 1) AND ((CPL > IOPL) OR (VM 1)))
THEN (* Protected mode with CPL > IOPL or virtual-8086 mode *)
IF (Any I/O Permission Bit for I/O port being accessed 1)
THEN (* I/O operation is not allowed *)
#GP(0);
ELSE ( * I/O operation is allowed *)
DEST SRC; (* Reads from I/O port *)
FI;
ELSE (Real Mode or Protected Mode with CPL IOPL *)
DEST SRC; (* Reads from I/O port *)
FI;
IF (byte transfer)
THEN IF DF 0
THEN (E)DI (E)DI + 1;
ELSE (E)DI (E)DI - 1;
FI;
ELSE IF (word transfer)
THEN IF DF 0
THEN (E)DI (E)DI + 2;
ELSE (E)DI (E)DI - 2;
FI;
ELSE (* doubleword transfer *)
THEN IF DF 0
THEN (E)DI (E)DI + 4;
ELSE (E)DI (E)DI - 4;
FI;
FI;
FI;

影響的標誌

無。

保護模式異常

#GP(0) - 如果 CPL 大於(特權較低)I/O 特權級別 (IOPL),並且訪問的 I/O 埠的 TSS 中相應的任何 I/O 許可權位是 1。如果目標位於不可寫的段。如果給定的 ES 段中的記憶體運算元有效地址非法。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果啟用對齊檢查並在目前特權級別為 3 時進行未對齊的記憶體引用。

實地址模式異常

#GP - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。

#SS - 如果記憶體運算元有效地址超出 SS 段限制。

虛 8086 模式異常

#GP(0) - 如果訪問的 I/O 埠的 TSS 中的任何 I/O 許可權位是 1。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。