CMOVcc
有条件移动
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
0F 47 /r | CMOVA r16, r/m16 | RM | 有效 | 有效 | 如果上移( CF = 0, ZF = 0) 。 |
0F 47 /r | CMOVA r32, r/m32 | RM | 有效 | 有效 | 如果上移( CF = 0, ZF = 0) 。 |
REX.W + 0F 47 /r | CMOVA r64, r/m64 | RM | 有效 | 不可编码 | 如果上移( CF = 0, ZF = 0) 。 |
0F 43 /r | CMOVAE r16, r/m16 | RM | 有效 | 有效 | 如果上方或等于(CF=0),则移动。 |
0F 43 /r | CMOVAE r32, r/m32 | RM | 有效 | 有效 | 如果上方或等于(CF=0),则移动。 |
REX.W + 0F 43 /r | CMOVAE r64, r/m64 | RM | 有效 | 不可编码 | 如果上方或等于(CF=0),则移动。 |
0F 42 /r | CMOVB r16, r/m16 | RM | 有效 | 有效 | 如果在下面移动( CF=1) 。 |
0F 42 /r | CMOVB r32, r/m32 | RM | 有效 | 有效 | 如果在下面移动( CF=1) 。 |
REX.W + 0F 42 /r | CMOVB r64, r/m64 | RM | 有效 | 不可编码 | 如果在下面移动( CF=1) 。 |
0F 46 /r | CMOVBE r16, r/m16 | RM | 有效 | 有效 | 如果下方或等值(CF=1或ZF=1),则移动. |
0F 46 /r | CMOVBE r32, r/m32 | RM | 有效 | 有效 | 如果下方或等值(CF=1或ZF=1),则移动. |
REX.W + 0F 46 /r | CMOVBE r64, r/m64 | RM | 有效 | 不可编码 | 如果下方或等值(CF=1或ZF=1),则移动. |
0F 42 /r | CMOVC r16, r/m16 | RM | 有效 | 有效 | 携带时移动(CF=1). |
0F 42 /r | CMOVC r32, r/m32 | RM | 有效 | 有效 | 携带时移动(CF=1). |
REX.W + 0F 42 /r | CMOVC r64, r/m64 | RM | 有效 | 不可编码 | 携带时移动(CF=1). |
0F 44 /r | CMOVE r16, r/m16 | RM | 有效 | 有效 | 如果等于( ZF=1) 则移动 。 |
0F 44 /r | CMOVE r32, r/m32 | RM | 有效 | 有效 | 如果等于( ZF=1) 则移动 。 |
REX.W + 0F 44 /r | CMOVE r64, r/m64 | RM | 有效 | 不可编码 | 如果等于( ZF=1) 则移动 。 |
0F 4F /r | CMOVG r16, r/m16 | RM | 有效 | 有效 | 如果更大,则移动(ZF=0,SF=OF)。 |
0F 4F /r | CMOVG r32, r/m32 | RM | 有效 | 有效 | 如果更大,则移动(ZF=0,SF=OF)。 |
REX.W + 0F 4F /r | CMOVG r64, r/m64 | RM | v/n.e. | - | 如果更大,则移动(ZF=0,SF=OF)。 |
0F 4D /r | CMOVGE r16, r/m16 | RM | 有效 | 有效 | 如果大于或等于(SF=OF),则移动。 |
0F 4D /r | CMOVGE r32, r/m32 | RM | 有效 | 有效 | 如果大于或等于(SF=OF),则移动。 |
REX.W + 0F 4D /r | CMOVGE r64, r/m64 | RM | 有效 | 不可编码 | 如果大于或等于(SF=OF),则移动。 |
0F 4C /r | CMOVL r16, r/m16 | RM | 有效 | 有效 | 如果少则移动( SF OF) 。 |
0F 4C /r | CMOVL r32, r/m32 | RM | 有效 | 有效 | 如果少则移动( SF OF) 。 |
REX.W + 0F 4C /r | CMOVL r64, r/m64 | RM | 有效 | 不可编码 | 如果少则移动( SF OF) 。 |
0F 4E /r | CMOVLE r16, r/m16 | RM | 有效 | 有效 | 如果小于或等于(ZF=1或SF OF),则移动。 |
0F 4E /r | CMOVLE r32, r/m32 | RM | 有效 | 有效 | 如果小于或等于(ZF=1或SF OF),则移动。 |
REX.W + 0F 4E /r | CMOVLE r64, r/m64 | RM | 有效 | 不可编码 | 如果小于或等于(ZF=1或SF OF),则移动。 |
0F 46 /r | CMOVNA r16, r/m16 | RM | 有效 | 有效 | 如果不是以上移动(CF=1或ZF=1). |
0F 46 /r | CMOVNA r32, r/m32 | RM | 有效 | 有效 | 如果不是以上移动(CF=1或ZF=1). |
REX.W + 0F 46 /r | CMOVNA r64, r/m64 | RM | 有效 | 不可编码 | 如果不是以上移动(CF=1或ZF=1). |
0F 42 /r | CMOVNAE r16, r/m16 | RM | 有效 | 有效 | 如果不高于或等于(CF=1),则移动。 |
0F 42 /r | CMOVNAE r32, r/m32 | RM | 有效 | 有效 | 如果不高于或等于(CF=1),则移动。 |
REX.W + 0F 42 /r | CMOVNAE r64, r/m64 | RM | 有效 | 不可编码 | 如果不高于或等于(CF=1),则移动。 |
0F 43 /r | CMOVNB r16, r/m16 | RM | 有效 | 有效 | 如不低于(CF=0)则移动。 |
0F 43 /r | CMOVNB r32, r/m32 | RM | 有效 | 有效 | 如不低于(CF=0)则移动。 |
REX.W + 0F 43 /r | CMOVNB r64, r/m64 | RM | 有效 | 不可编码 | 如不低于(CF=0)则移动。 |
0F 47 /r | CMOVNBE r16, r/m16 | RM | 有效 | 有效 | 如果不低于或等于(CF=0和ZF=0),则移动。 |
0F 47 /r | CMOVNBE r32, r/m32 | RM | 有效 | 有效 | 如果不低于或等于(CF=0和ZF=0),则移动。 |
REX.W + 0F 47 /r | CMOVNBE r64, r/m64 | RM | 有效 | 不可编码 | 如果不低于或等于(CF=0和ZF=0),则移动。 |
0F 43 /r | CMOVNC r16, r/m16 | RM | 有效 | 有效 | 不携带则移动(CF=0). |
0F 43 /r | CMOVNC r32, r/m32 | RM | 有效 | 有效 | 不携带则移动(CF=0). |
REX.W + 0F 43 /r | CMOVNC r64, r/m64 | RM | 有效 | 不可编码 | 不携带则移动(CF=0). |
0F 45 /r | CMOVNE r16, r/m16 | RM | 有效 | 有效 | 移动( ZF = 0) 。 |
0F 45 /r | CMOVNE r32, r/m32 | RM | 有效 | 有效 | 移动( ZF = 0) 。 |
REX.W + 0F 45 /r | CMOVNE r64, r/m64 | RM | 有效 | 不可编码 | 移动( ZF = 0) 。 |
0F 4E /r | CMOVNG r16, r/m16 | RM | 有效 | 有效 | 移动( ZF=1 或 SF OF) 。 |
0F 4E /r | CMOVNG r32, r/m32 | RM | 有效 | 有效 | 移动( ZF=1 或 SF OF) 。 |
REX.W + 0F 4E /r | CMOVNG r64, r/m64 | RM | 有效 | 不可编码 | 移动( ZF=1 或 SF OF) 。 |
0F 4C /r | CMOVNGE r16, r/m16 | RM | 有效 | 有效 | 移动( 如果不是大于或等于) 。 |
0F 4C /r | CMOVNGE r32, r/m32 | RM | 有效 | 有效 | 移动( 如果不是大于或等于) 。 |
REX.W + 0F 4C /r | CMOVNGE r64, r/m64 | RM | 有效 | 不可编码 | 移动( 如果不是大于或等于) 。 |
0F 4D /r | CMOVNL r16, r/m16 | RM | 有效 | 有效 | 移动( SF = OF) 。 |
0F 4D /r | CMOVNL r32, r/m32 | RM | 有效 | 有效 | 移动( SF = OF) 。 |
REX.W + 0F 4D /r | CMOVNL r64, r/m64 | RM | 有效 | 不可编码 | 移动( SF = OF) 。 |
0F 4F /r | CMOVNLE r16, r/m16 | RM | 有效 | 有效 | 移动( ZF=0, SF=OF) 。 |
0F 4F /r | CMOVNLE r32, r/m32 | RM | 有效 | 有效 | 移动( ZF=0, SF=OF) 。 |
REX.W + 0F 4F /r | CMOVNLE r64, r/m64 | RM | 有效 | 不可编码 | 移动( ZF=0, SF=OF) 。 |
0F 41 /r | CMOVNO r16, r/m16 | RM | 有效 | 有效 | 如果不是溢出,则移动(OF=0)。 |
0F 41 /r | CMOVNO r32, r/m32 | RM | 有效 | 有效 | 如果不是溢出,则移动(OF=0)。 |
REX.W + 0F 41 /r | CMOVNO r64, r/m64 | RM | 有效 | 不可编码 | 如果不是溢出,则移动(OF=0)。 |
0F 4B /r | CMOVNP r16, r/m16 | RM | 有效 | 有效 | 如果不是对等,则移动(PF=0)。 |
0F 4B /r | CMOVNP r32, r/m32 | RM | 有效 | 有效 | 如果不是对等,则移动(PF=0)。 |
REX.W + 0F 4B /r | CMOVNP r64, r/m64 | RM | 有效 | 不可编码 | 如果不是对等,则移动(PF=0)。 |
0F 49 /r | CMOVNS r16, r/m16 | RM | 有效 | 有效 | 如果没有签名,则移动(SF=0). |
0F 49 /r | CMOVNS r32, r/m32 | RM | 有效 | 有效 | 如果没有签名,则移动(SF=0). |
REX.W + 0F 49 /r | CMOVNS r64, r/m64 | RM | 有效 | 不可编码 | 如果没有签名,则移动(SF=0). |
0F 45 /r | CMOVNZ r16, r/m16 | RM | 有效 | 有效 | 移动( ZF=0) 。 |
0F 45 /r | CMOVNZ r32, r/m32 | RM | 有效 | 有效 | 移动( ZF=0) 。 |
REX.W + 0F 45 /r | CMOVNZ r64, r/m64 | RM | 有效 | 不可编码 | 移动( ZF=0) 。 |
0F 40 /r | CMOVO r16, r/m16 | RM | 有效 | 有效 | 溢出时移动( OF = 1) 。 |
0F 40 /r | CMOVO r32, r/m32 | RM | 有效 | 有效 | 溢出时移动( OF = 1) 。 |
REX.W + 0F 40 /r | CMOVO r64, r/m64 | RM | 有效 | 不可编码 | 溢出时移动( OF = 1) 。 |
0F 4A /r | CMOVP r16, r/m16 | RM | 有效 | 有效 | 如果对等,则移动(PF=1)。 |
0F 4A /r | CMOVP r32, r/m32 | RM | 有效 | 有效 | 如果对等,则移动(PF=1)。 |
REX.W + 0F 4A /r | CMOVP r64, r/m64 | RM | 有效 | 不可编码 | 如果对等,则移动(PF=1)。 |
0F 4A /r | CMOVPE r16, r/m16 | RM | 有效 | 有效 | 如果偶数( PF=1) 则移动 。 |
0F 4A /r | CMOVPE r32, r/m32 | RM | 有效 | 有效 | 如果偶数( PF=1) 则移动 。 |
REX.W + 0F 4A /r | CMOVPE r64, r/m64 | RM | 有效 | 不可编码 | 如果偶数( PF=1) 则移动 。 |
0F 4B /r | CMOVPO r16, r/m16 | rm | val | 如果偶数为奇数( PF = 0) , id 有效移动 | |
0F 4B /r | CMOVPO r32, r/m32 | rm | val | 如果偶数为奇数( PF = 0) , id 有效移动 | |
REX.W + 0F 4B /r | CMOVPO r64, r/m64 | rm | val | id N.E. 如果平方为奇数(PF=0)则移动. | |
0F 48 /r | CMOVS r16, r/m16 | rm | val | id 签名时的有效移动( SF=1). | |
0F 48 /r | CMOVS r32, r/m32 | rm | val | id 签名时的有效移动( SF=1). | |
REX.W + 0F 48 /r | CMOVS r64, r/m64 | rm | val | id N.E. 如果符号移动( SF=1) 。 | |
0F 44 /r | CMOVZ r16, r/m16 | rm | val | 如果为零, id 有效移动( ZF= 1) 。 | |
0F 44 /r | CMOVZ r32, r/m32 | rm | val | 如果为零, id 有效移动( ZF= 1) 。 | |
REX.W + 0F 44 /r | CMOVZ r64, r/m64 | rm | val | id N.E. 零移动(ZF=1). |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
RM
modrm.reglectura y escrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
实测开销
正在从 arch-data 加载实测数据...
说明
如果EFLAGS登记册(CF、OF、PF、SF和ZF)中的状态标志处于指定状态(或条件),则每个CMOVcc指令都执行移动操作。 每个指令都附有一个条件代码(cc),以说明所测试的条件。 如果条件不能满足,则不进行移动,继续按照CMOVcc指令执行指令。
具体来说,CMOVcc从它的源操作数无条件将数据加载到一个临时登记册中(无论条件代码和EFLAGS登记册中的状态标志). 如果与指令(cc)相关的条件代码得到满足,则临时寄存器中的数据随后被复制到指令的目标操作数中.
这些指令可以将16位,32位或64位值从内存移动到通用寄存器或从一个通用寄存器移动到另一个. 不支持8位寄存器操作数的有条件移动.
上表描述栏列出每个CMOVcc mnemonic的条件. 比较有符号整数时使用"小"和"大"两个词,比较无符号整数时使用"以上"和"以下"两个词.
由于状态标志的特定状态有时可以有两种解释,因此对一些操作码定义了两种mnemonics. 例如,CMOVA(如果以上为有条件移动)指令和CMOVNBE(如果不低于或相等为有条件移动)指令是操作码 0F 47H的交替模式.
CMOVcc指令是在P6家庭处理器中引入的;然而,这些指令可能不会得到所有IA-32处理器的支持. 软件可以通过使用CPUID指令(参见本章中的"CPUID--CPU识别")检查处理器的特性信息来判断CMOVcc指令是否得到支持.
在64位模式下,指令的默认操作大小为32位. 使用REX.R前缀可以访问额外的登记册(R8-R15). 使用REX.W前缀将操作提升到64位. 参见本节开头的汇总图,用于编码数据和限制.
行动
temp := SRC
IF condition TRUE
THEN DEST := temp;
ELSE IF (OperandSize = 32 and IA-32e mode active)
THEN DEST[63:32] := 0;
FI;受影响的旗帜
None.
异常
保护模式
#GP(0) | 如果 内存操作数 的有效地址位于 CS,DS,ES,FS 或 GS 区段限制之外,如果 DS,ES,FS,或 GS 注册簿中包含 NULL 段选择子. |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外. #PF(fault-code) 如果 页面错误 发生. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |
实地址模式
#GP | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#UD | 如果使用 LOCK 前缀 。 |
虚拟 8086 模式
#GP(0) | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外. #PF(fault-code) 如果 页面错误 发生. |
#AC(0) | 如果启用对齐检查, 并使用不对齐的内存引用 。 |
#UD | 如果使用 LOCK 前缀 。 |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
#SS(0) | 如果引用SS部分的内存地址是非冠状的. |
#GP(0) | 如果内存地址是非冠状的. #PF(fault-code) 如果发生 页面错误. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |