OUTS/OUTSB/OUTSW/OUTSD - 字串輸出到埠

操作碼

指令

說明

6E

OUTS DX, m8

將位元組從 DS:(E)SI 指定的記憶體位置輸出到 DX 指定的 I/O 埠

6F

OUTS DX, m16

將字從 DS:(E)SI 指定的記憶體位置輸出到 DX 指定的 I/O 埠

6F

OUTS DX, m32

將雙字從 DS:(E)SI 指定的記憶體位置輸出到 DX 指定的 I/O 埠

6E

OUTSB

將位元組從 DS:(E)SI 指定的記憶體位置輸出到 DX 指定的 I/O 埠

6F

OUTSW

將字從 DS:(E)SI 指定的記憶體位置輸出到 DX 指定的 I/O 埠

6F

OUTSD

將雙字從 DS:(E)SI 指定的記憶體位置輸出到 DX 指定的 I/O 埠

說明

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

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

無運算元形式提供“簡短形式”的位元組、字及雙字版 OUTS 指令。這裡,同樣假設 DS:(E)SI 是源運算元,假設 DX 是目標運算元。I/O 埠的大小通過選擇助記符指定:OUTSB(位元組)、OUTSW(字)或 OUTSD(雙字)。

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

通過 REP 字首,OUTS、OUTSB、OUTSW 及 OUTSD 指令可用於整塊輸入 ECX 位元組、字或雙字。如需有關 REP 字首的說明,請參閱 REP/REPE/REPZ/REPNE/REPNZ - 重複字串操作字首

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

英特爾(R) 體系結構相容性

執行 OUTS、OUTSB、OUTSW 或 OUTSD 指令之後,奔騰® 處理器會在開始執行下一條指令之前,確保 EWBE# 引腳已通過採樣啟用。(請注意,如果 EWBE# 處於非活動狀態,可以預取此指令,但是要到通過採用啟用 EWBE# 引腳之後,才可以執行它)。只有奔騰處理器系列有 EWBE# 引腳;其它 IA-32 處理器都沒有。對於奔騰 4 與 P6 系列處理器,在執行 OUTS、OUTSB、OUTSW 或 OUTSD 指令時,要到事務的數據階段完成之後,處理器才會執行下一條指令。

操作

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; (* Writes to I/O port *)
FI;
ELSE (Real Mode or Protected Mode with CPL IOPL *)
DEST SRC; (* Writes to I/O port *)
FI;
IF (byte transfer)
THEN IF DF 0
THEN (E)SI (E)SI + 1;
ELSE (E)SI (E)SI - 1;
FI;
ELSE IF (word transfer)
THEN IF DF 0
THEN (E)SI (E)SI + 2;
ELSE (E)SI (E)SI - 2;
FI;
ELSE (* doubleword transfer *)
THEN IF DF 0
THEN (E)SI (E)SI + 4;
ELSE (E)SI (E)SI - 4;
FI;
FI;
FI;

影響的標誌

無。

保護模式異常

#GP(0) - 如果 CPL 大於(特權較低)I/O 特權級別 (IOPL),並且訪問的 I/O 埠的 TSS 中相應的任何 I/O 許可權位是 1。如果記憶體運算元的有效地址超出 CS、DS、ES、FS 或 GS 段的限制。如果段暫存器包含空的段選擇器。

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

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

實地址模式異常

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

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

虛 8086 模式異常

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

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

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