XCHG - 交換暫存器/記憶體與暫存器

操作碼

指令

說明

90+rw

XCHG AX,16

交換 r16 與 AX

90+rw

XCHG r16, X

交換 AX 與 r16

90+rd

XCHG EAX, r32

交換 r32 與 EAX

90+rd

XCHG r32, EAX

交換 EAX 與 r32

86 /r

XCHG r/m8, r8

交換 r8(位元組暫存器)與 r/m8 中的位元組

86 /r

XCHG r8, r/m8

交換 r/m8 中的位元組與 r8(位元組暫存器)

87 /r

XCHG r/m16, r16

交換 r16r/m16 中的字

87 /r

XCHG r16, r/m16

交換 r/m16 中的字與 r16

87 /r

XCHG r/m32, r32

交換 r32r/m32 中的雙字

87 /r

XCHG r32, r/m32

交換 r/m32 中的雙字與 r32

說明

交換目標(第一個)運算元與源(第二個)運算元的內容。運算元可以是兩個通用暫存器,也可以是暫存器與記憶體位置。如果引用記憶體運算元,則在執行交換操作期間,不論是否帶 LOCK 字首,也不論 IOPL 的值如何,都會自動實施處理器的鎖定協議。(如需有關鎖定協議的詳細資訊,請參閱本章中的 LOCK 字首說明)。

此指令對於實現程序同步中的訊號量或類似的數據結構非常有用。(如需有關匯流排鎖定的詳細資訊,請參閱“IA-32 英特爾(R) 體系結構軟件開發人員手冊”第 3 卷第 7 章中的“匯流排鎖定”)。

對於 16 位運算元,XCHG 指令還可以用於代替 BSWAP 指令。

操作

TEMP DEST
DEST SRC
SRC TEMP

影響的標誌

無。

保護模式異常

#GP(0) - 如果任何一個運算元位於不可寫的段。如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。如果 DS、ES、FS 或 GS 暫存器包含空的段選擇器。

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

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

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

實地址模式異常

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

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

虛 8086 模式異常

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

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

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

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