操作碼 |
指令 |
說明 |
0F C7 /1 m64 |
CMPXCHG8B m64 |
比較 EDX:EAX 與 m64。如果相等,則設定 ZF,並將 ECX:EBX 載入到 m64。否則清除 ZF,並將 m64 載入到 EDX:EAX。 |
比較 EDX:EAX 中的 64 位值與運算元(目標運算元)。如果這兩個值相等,則將 ECX:EBX 中的 64 位值儲存到目標運算元。否則,將目標運算元的值載入到 EDX:EAX。目標運算元是 8 位元組記憶體位置。對於一對 EDX:EAX 與 ECX:EBX 暫存器,EDX 與 ECX 包含 64 位值的 32 個高位,EAX 與 EBX 包含 32 個低位。
此指令可以配合 LOCK 字首使用,此時指令將以原子方式執行。爲了簡化處理器的匯流排介面,目標運算元可以不考慮比較結果而接收一個寫入週期。如果比較失敗,則寫回目標運算元;否則,將源運算元寫入目標。(處理器永遠不會只產生鎖定讀取而不產生鎖定寫入)。
早於奔騰(R) 的英特爾(R) 處理器不支援此指令。
IF (EDX:EAX DEST)
ZF 1
DEST ECX:EBX
ELSE
ZF 0
EDX:EAX DEST
如果目標運算元與 EDX:EAX 相等,則設定 ZF 標誌;否則清除它。CF、PF、AF、SF 及 OF 標誌不受影響。
#UD - 如果目標運算元不是記憶體位置。
#GP(0) - 如果目標位於不可寫的段。如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。如果 DS、ES、FS 或 GS 暫存器包含空的段選擇器。
#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果啟用對齊檢查並在目前特權級別為 3 時進行未對齊的記憶體引用。
#UD - 如果目標運算元不是記憶體位置。
#GP - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS - 如果記憶體運算元有效地址超出 SS 段限制。
#UD - 如果目標運算元不是記憶體位置。
#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。