CMOVcc - 條件移動

操作碼

指令

說明

0F 47 /r

CMOVA r16, r/m16

高於(CF=0 且 ZF=0)時移動

0F 47 /r

CMOVA r32, r/m32

高於(CF=0 且 ZF=0)時移動

0F 43 /r

CMOVAE r16, r/m16

高於或等於 (CF=0) 時移動

0F 43 /r

CMOVAE r32, r/m32

高於或等於 (CF=0) 時移動

0F 42 /r

CMOVB r16, r/m16

低於 (CF=1) 時移動

0F 42 /r

CMOVB r32, r/m32

低於 (CF=1) 時移動

0F 46 /r

CMOVBE r16, r/m16

低於或等於(CF=1 或 ZF=1)時移動

0F 46 /r

CMOVBE r32, r/m32

低於或等於(CF=1 或 ZF=1)時移動

0F 42 /r

CMOVC r16, r/m16

進位 (CF=1) 時移動

0F 42 /r

CMOVC r32, r/m32

進位 (CF=1) 時移動

0F 44 /r

CMOVE r16, r/m16

等於 (ZF=1) 時移動

0F 44 /r

CMOVE r32, r/m32

等於 (ZF=1) 時移動

0F 4F /r

CMOVG r16, r/m16

大於(ZF=0 且 SF=OF)時移動

0F 4F /r

CMOVG r32, r/m32

大於(ZF=0 且 SF=OF)時移動

0F 4D /r

CMOVGE r16, r/m16

大於或等於 (SF=OF) 時移動

0F 4D /r

CMOVGE r32, r/m32

大於或等於 (SF=OF) 時移動

0F 4C /r

CMOVL r16, r/m16

小於 (SF<>OF) 時移動

0F 4C /r

CMOVL r32, r/m32

小於 (SF<>OF) 時移動

0F 4E /r

CMOVLE r16, r/m16

小於或等於(ZF=1 或 SF<>OF)時移動

0F 4E /r

CMOVLE r32, r/m32

小於或等於(ZF=1 或 SF<>OF)時移動

0F 46 /r

CMOVNA r16, r/m16

不高於(CF=1 或 ZF=1)時移動

0F 46 /r

CMOVNA r32, r/m32

不高於(CF=1 或 ZF=1)時移動

0F 42 /r

CMOVNAE r16, r/m16

不高於或等於 (CF=1) 時移動

0F 42 /r

CMOVNAE r32, r/m32

不高於或等於 (CF=1) 時移動

0F 43 /r

CMOVNB r16, r/m16

不低於 (CF=0) 時移動

0F 43 /r

CMOVNB r32, r/m32

不低於 (CF=0) 時移動

0F 47 /r

CMOVNBE r16, r/m16

不低於或等於(CF=0 且 ZF=0)時移動

0F 47 /r

CMOVNBE r32, r/m32

不低於或等於(CF=0 且 ZF=0)時移動

0F 43 /r

CMOVNC r16, r/m16

無進位 (CF=0) 時移動

0F 43 /r

CMOVNC r32, r/m32

無進位 (CF=0) 時移動

0F 45 /r

CMOVNE r16, r/m16

不等於 (ZF=0) 時移動

0F 45 /r

CMOVNE r32, r/m32

不等於 (ZF=0) 時移動

0F 4E /r

CMOVNG r16, r/m16

不大於(ZF=1 或 SF<>OF)時移動

0F 4E /r

CMOVNG r32, r/m32

不大於(ZF=1 或 SF<>OF)時移動

0F 4C /r

CMOVNGE r16, r/m16

不大於或等於 (SF<>OF) 時移動

0F 4C /r

CMOVNGE r32, r/m32

不大於或等於 (SF<>OF) 時移動

0F 4D /r

CMOVNL r16, r/m16

不小於 (SF=OF) 時移動

0F 4D /r

CMOVNL r32, r/m32

不小於 (SF=OF) 時移動

0F 4F /r

CMOVNLE r16, r/m16

不小於或等於(ZF=0 且 SF=OF)時移動

0F 4F /r

CMOVNLE r32, r/m32

不小於或等於(ZF=0 且 SF=OF)時移動

操作碼

指令

說明

0F 41 /r

CMOVNO r16, r/m16

不上溢 (OF=0) 時移動

0F 41 /r

CMOVNO r32, r/m32

不上溢 (OF=0) 時移動

0F 4B /r

CMOVNP r16, r/m16

奇校驗 (PF=0) 時移動

0F 4B /r

CMOVNP r32, r/m32

奇校驗 (PF=0) 時移動

0F 49 /r

CMOVNS r16, r/m16

正數 (SF=0) 時移動

0F 49 /r

CMOVNS r32, r/m32

正數 (SF=0) 時移動

0F 45 /r

CMOVNZ r16, r/m16

不為零 (ZF=0) 時移動

0F 45 /r

CMOVNZ r32, r/m32

不為零 (ZF=0) 時移動

0F 40 /r

CMOVO r16, r/m16

上溢 (OF=0) 時移動

0F 40 /r

CMOVO r32, r/m32

上溢 (OF=0) 時移動

0F 4A /r

CMOVP r16, r/m16

偶校驗 (PF=1) 時移動

0F 4A /r

CMOVP r32, r/m32

偶校驗 (PF=1) 時移動

0F 4A /r

CMOVPE r16, r/m16

偶校驗 (PF=1) 時移動

0F 4A /r

CMOVPE r32, r/m32

偶校驗 (PF=1) 時移動

0F 4B /r

CMOVPO r16, r/m16

奇校驗 (PF=0) 時移動

0F 4B /r

CMOVPO r32, r/m32

奇校驗 (PF=0) 時移動

0F 48 /r

CMOVS r16, r/m16

負數 (SF=1) 時移動

0F 48 /r

CMOVS r32, r/m32

負數 (SF=1) 時移動

0F 44 /r

CMOVZ r16, r/m16

為零 (ZF=1) 時移動

0F 44 /r

CMOVZ r32, r/m32

為零 (ZF=1) 時移動

說明

CMOVcc 指令檢查 EFLAGS 暫存器中一個或多個狀態標誌(CF、OF、PF、SF 及 ZF)的狀態,如果標誌處於指定的狀態(或條件),則執行移動操作。條件程式碼 (cc) 與每條指令關聯,用於指明測試條件。如果條件不滿足,則不執行移動操作,而是繼續執行 CMOVcc 指令後面的指令。

這些指令可以將 16 位或 32 位值從記憶體移到通用暫存器,或是從一個通用暫存器移到另一個。不支援 8 位暫存器運算元的條件移動。

每個 CMOVcc 助記符的條件在上表的說明列中給出。術語“小於”與“大於”用於有符號整數的比較;術語“高於”與“低於”用於無符號整數。

由於狀態標誌的特定狀態有時存在兩種含義,因此給某些操作碼定義了兩個助記符。例如,CMOVA(高於時條件移動)指令與 CMOVNBE(不低於或等於時條件移動)指令是操作碼 0F 47H 的替代助記符。

CMOVcc 是奔騰(R) Pro 處理器系列的新增指令;不過,並非此係列的所有處理器都支援它們。軟體可以使用 CPUID 指令檢查處理器的功能資訊,以確定處理器是否支援 CMOVcc 指令(請參閱 COMISS - 比較標量有序單精度浮點值並設定 EFLAGS)。

操作

temp DEST
IF condition TRUE
THEN
DEST SRC
ELSE
DEST temp
FI;

影響的標誌

無。

保護模式異常

#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) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。