CMOVcc

有条件移动

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
0F 47 /rCMOVA r16, r/m16RM有效有效如果上移( CF = 0, ZF = 0) 。
0F 47 /rCMOVA r32, r/m32RM有效有效如果上移( CF = 0, ZF = 0) 。
REX.W + 0F 47 /rCMOVA r64, r/m64RM有效不可编码如果上移( CF = 0, ZF = 0) 。
0F 43 /rCMOVAE r16, r/m16RM有效有效如果上方或等于(CF=0),则移动。
0F 43 /rCMOVAE r32, r/m32RM有效有效如果上方或等于(CF=0),则移动。
REX.W + 0F 43 /rCMOVAE r64, r/m64RM有效不可编码如果上方或等于(CF=0),则移动。
0F 42 /rCMOVB r16, r/m16RM有效有效如果在下面移动( CF=1) 。
0F 42 /rCMOVB r32, r/m32RM有效有效如果在下面移动( CF=1) 。
REX.W + 0F 42 /rCMOVB r64, r/m64RM有效不可编码如果在下面移动( CF=1) 。
0F 46 /rCMOVBE r16, r/m16RM有效有效如果下方或等值(CF=1或ZF=1),则移动.
0F 46 /rCMOVBE r32, r/m32RM有效有效如果下方或等值(CF=1或ZF=1),则移动.
REX.W + 0F 46 /rCMOVBE r64, r/m64RM有效不可编码如果下方或等值(CF=1或ZF=1),则移动.
0F 42 /rCMOVC r16, r/m16RM有效有效携带时移动(CF=1).
0F 42 /rCMOVC r32, r/m32RM有效有效携带时移动(CF=1).
REX.W + 0F 42 /rCMOVC r64, r/m64RM有效不可编码携带时移动(CF=1).
0F 44 /rCMOVE r16, r/m16RM有效有效如果等于( ZF=1) 则移动 。
0F 44 /rCMOVE r32, r/m32RM有效有效如果等于( ZF=1) 则移动 。
REX.W + 0F 44 /rCMOVE r64, r/m64RM有效不可编码如果等于( ZF=1) 则移动 。
0F 4F /rCMOVG r16, r/m16RM有效有效如果更大,则移动(ZF=0,SF=OF)。
0F 4F /rCMOVG r32, r/m32RM有效有效如果更大,则移动(ZF=0,SF=OF)。
REX.W + 0F 4F /rCMOVG r64, r/m64RMv/n.e.-如果更大,则移动(ZF=0,SF=OF)。
0F 4D /rCMOVGE r16, r/m16RM有效有效如果大于或等于(SF=OF),则移动。
0F 4D /rCMOVGE r32, r/m32RM有效有效如果大于或等于(SF=OF),则移动。
REX.W + 0F 4D /rCMOVGE r64, r/m64RM有效不可编码如果大于或等于(SF=OF),则移动。
0F 4C /rCMOVL r16, r/m16RM有效有效如果少则移动( SF OF) 。
0F 4C /rCMOVL r32, r/m32RM有效有效如果少则移动( SF OF) 。
REX.W + 0F 4C /rCMOVL r64, r/m64RM有效不可编码如果少则移动( SF OF) 。
0F 4E /rCMOVLE r16, r/m16RM有效有效如果小于或等于(ZF=1或SF OF),则移动。
0F 4E /rCMOVLE r32, r/m32RM有效有效如果小于或等于(ZF=1或SF OF),则移动。
REX.W + 0F 4E /rCMOVLE r64, r/m64RM有效不可编码如果小于或等于(ZF=1或SF OF),则移动。
0F 46 /rCMOVNA r16, r/m16RM有效有效如果不是以上移动(CF=1或ZF=1).
0F 46 /rCMOVNA r32, r/m32RM有效有效如果不是以上移动(CF=1或ZF=1).
REX.W + 0F 46 /rCMOVNA r64, r/m64RM有效不可编码如果不是以上移动(CF=1或ZF=1).
0F 42 /rCMOVNAE r16, r/m16RM有效有效如果不高于或等于(CF=1),则移动。
0F 42 /rCMOVNAE r32, r/m32RM有效有效如果不高于或等于(CF=1),则移动。
REX.W + 0F 42 /rCMOVNAE r64, r/m64RM有效不可编码如果不高于或等于(CF=1),则移动。
0F 43 /rCMOVNB r16, r/m16RM有效有效如不低于(CF=0)则移动。
0F 43 /rCMOVNB r32, r/m32RM有效有效如不低于(CF=0)则移动。
REX.W + 0F 43 /rCMOVNB r64, r/m64RM有效不可编码如不低于(CF=0)则移动。
0F 47 /rCMOVNBE r16, r/m16RM有效有效如果不低于或等于(CF=0和ZF=0),则移动。
0F 47 /rCMOVNBE r32, r/m32RM有效有效如果不低于或等于(CF=0和ZF=0),则移动。
REX.W + 0F 47 /rCMOVNBE r64, r/m64RM有效不可编码如果不低于或等于(CF=0和ZF=0),则移动。
0F 43 /rCMOVNC r16, r/m16RM有效有效不携带则移动(CF=0).
0F 43 /rCMOVNC r32, r/m32RM有效有效不携带则移动(CF=0).
REX.W + 0F 43 /rCMOVNC r64, r/m64RM有效不可编码不携带则移动(CF=0).
0F 45 /rCMOVNE r16, r/m16RM有效有效移动( ZF = 0) 。
0F 45 /rCMOVNE r32, r/m32RM有效有效移动( ZF = 0) 。
REX.W + 0F 45 /rCMOVNE r64, r/m64RM有效不可编码移动( ZF = 0) 。
0F 4E /rCMOVNG r16, r/m16RM有效有效移动( ZF=1 或 SF OF) 。
0F 4E /rCMOVNG r32, r/m32RM有效有效移动( ZF=1 或 SF OF) 。
REX.W + 0F 4E /rCMOVNG r64, r/m64RM有效不可编码移动( ZF=1 或 SF OF) 。
0F 4C /rCMOVNGE r16, r/m16RM有效有效移动( 如果不是大于或等于) 。
0F 4C /rCMOVNGE r32, r/m32RM有效有效移动( 如果不是大于或等于) 。
REX.W + 0F 4C /rCMOVNGE r64, r/m64RM有效不可编码移动( 如果不是大于或等于) 。
0F 4D /rCMOVNL r16, r/m16RM有效有效移动( SF = OF) 。
0F 4D /rCMOVNL r32, r/m32RM有效有效移动( SF = OF) 。
REX.W + 0F 4D /rCMOVNL r64, r/m64RM有效不可编码移动( SF = OF) 。
0F 4F /rCMOVNLE r16, r/m16RM有效有效移动( ZF=0, SF=OF) 。
0F 4F /rCMOVNLE r32, r/m32RM有效有效移动( ZF=0, SF=OF) 。
REX.W + 0F 4F /rCMOVNLE r64, r/m64RM有效不可编码移动( ZF=0, SF=OF) 。
0F 41 /rCMOVNO r16, r/m16RM有效有效如果不是溢出,则移动(OF=0)。
0F 41 /rCMOVNO r32, r/m32RM有效有效如果不是溢出,则移动(OF=0)。
REX.W + 0F 41 /rCMOVNO r64, r/m64RM有效不可编码如果不是溢出,则移动(OF=0)。
0F 4B /rCMOVNP r16, r/m16RM有效有效如果不是对等,则移动(PF=0)。
0F 4B /rCMOVNP r32, r/m32RM有效有效如果不是对等,则移动(PF=0)。
REX.W + 0F 4B /rCMOVNP r64, r/m64RM有效不可编码如果不是对等,则移动(PF=0)。
0F 49 /rCMOVNS r16, r/m16RM有效有效如果没有签名,则移动(SF=0).
0F 49 /rCMOVNS r32, r/m32RM有效有效如果没有签名,则移动(SF=0).
REX.W + 0F 49 /rCMOVNS r64, r/m64RM有效不可编码如果没有签名,则移动(SF=0).
0F 45 /rCMOVNZ r16, r/m16RM有效有效移动( ZF=0) 。
0F 45 /rCMOVNZ r32, r/m32RM有效有效移动( ZF=0) 。
REX.W + 0F 45 /rCMOVNZ r64, r/m64RM有效不可编码移动( ZF=0) 。
0F 40 /rCMOVO r16, r/m16RM有效有效溢出时移动( OF = 1) 。
0F 40 /rCMOVO r32, r/m32RM有效有效溢出时移动( OF = 1) 。
REX.W + 0F 40 /rCMOVO r64, r/m64RM有效不可编码溢出时移动( OF = 1) 。
0F 4A /rCMOVP r16, r/m16RM有效有效如果对等,则移动(PF=1)。
0F 4A /rCMOVP r32, r/m32RM有效有效如果对等,则移动(PF=1)。
REX.W + 0F 4A /rCMOVP r64, r/m64RM有效不可编码如果对等,则移动(PF=1)。
0F 4A /rCMOVPE r16, r/m16RM有效有效如果偶数( PF=1) 则移动 。
0F 4A /rCMOVPE r32, r/m32RM有效有效如果偶数( PF=1) 则移动 。
REX.W + 0F 4A /rCMOVPE r64, r/m64RM有效不可编码如果偶数( PF=1) 则移动 。
0F 4B /rCMOVPO r16, r/m16rmval如果偶数为奇数( PF = 0) , id 有效移动
0F 4B /rCMOVPO r32, r/m32rmval如果偶数为奇数( PF = 0) , id 有效移动
REX.W + 0F 4B /rCMOVPO r64, r/m64rmvalid N.E. 如果平方为奇数(PF=0)则移动.
0F 48 /rCMOVS r16, r/m16rmvalid 签名时的有效移动( SF=1).
0F 48 /rCMOVS r32, r/m32rmvalid 签名时的有效移动( SF=1).
REX.W + 0F 48 /rCMOVS r64, r/m64rmvalid N.E. 如果符号移动( SF=1) 。
0F 44 /rCMOVZ r16, r/m16rmval如果为零, id 有效移动( ZF= 1) 。
0F 44 /rCMOVZ r32, r/m32rmval如果为零, id 有效移动( ZF= 1) 。
REX.W + 0F 44 /rCMOVZ r64, r/m64rmvalid N.E. 零移动(ZF=1).

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

RM

  1. modrm.reg lectura y escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 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 前缀 。

来源