操作碼 |
指令 |
說明 |
0F B0/r |
CMPXCHG r/m8,r8 |
比較 AL 與 r/m8。如果相等,則設定 ZF,並將 r8 載入到 r/m8。否則清除 ZF,並將 r/m8 載入到 AL。 |
0F B1/r |
CMPXCHG r/m16,r16 |
比較 AX 與 r/m16。如果相等,則設定 ZF,並將 r16 載入到 r/m16。否則清除 ZF,並將 r/m16 載入到 AL。 |
0F B1/r |
CMPXCHG r/m32,r32 |
比較 EAX 與 r/m32。如果相等,則設定 ZF,並將 r32 載入到 r/m32。否則清除 ZF,並將 r/m32 載入到 AL。 |
比較 AL、AX 或 EAX 暫存器中的值(具體取決於運算元的大小)與第一個運算元(目標運算元)。如果兩個值相等,則將第二個運算元(源運算元)載入到目標運算元。否則,將目標運算元載入到 AL、AX 或 EAX 暫存器。
此指令可以配合 LOCK 字首使用,此時指令將以原子方式執行。爲了簡化處理器的匯流排介面,目標運算元可以不考慮比較結果而接收一個寫入週期。如果比較失敗,則寫回目標運算元;否則,將源運算元寫入目標。(處理器永遠不會只產生鎖定讀取而不產生鎖定寫入)。
早於 Intel486™ 的英特爾(R) 處理器不支援此指令。
(* accumulator AL, AX, or EAX, depending on whether *)
(* a byte, word, or doubleword comparison is being performed*)
IF accumulator DEST
THEN
ZF 1
DEST SRC
ELSE
ZF 0
accumulator DEST
FI;
如果目標運算元中的值與暫存器 AL、AX 或 EAX 中的相等,則設定 ZF 標誌;否則,清除此標誌。CF、PF、AF、SF 及 OF 標誌根據比較操作的結果設定。
#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 段限制。
#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。