CMOVcc
Mover condicional
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
0F 47 /r | CMOVA r16, r/m16 | RM | Valido | Valido | Mover si arriba (CF=0 y ZF=0). |
0F 47 /r | CMOVA r32, r/m32 | RM | Valido | Valido | Mover si arriba (CF=0 y ZF=0). |
REX.W + 0F 47 /r | CMOVA r64, r/m64 | RM | Valido | No codificable | Mover si arriba (CF=0 y ZF=0). |
0F 43 /r | CMOVAE r16, r/m16 | RM | Valido | Valido | Mover si arriba o igual (CF=0). |
0F 43 /r | CMOVAE r32, r/m32 | RM | Valido | Valido | Mover si arriba o igual (CF=0). |
REX.W + 0F 43 /r | CMOVAE r64, r/m64 | RM | Valido | No codificable | Mover si arriba o igual (CF=0). |
0F 42 /r | CMOVB r16, r/m16 | RM | Valido | Valido | Muévete si abajo (CF=1). |
0F 42 /r | CMOVB r32, r/m32 | RM | Valido | Valido | Muévete si abajo (CF=1). |
REX.W + 0F 42 /r | CMOVB r64, r/m64 | RM | Valido | No codificable | Muévete si abajo (CF=1). |
0F 46 /r | CMOVBE r16, r/m16 | RM | Valido | Valido | Mover si es inferior o igual (CF=1 o ZF=1). |
0F 46 /r | CMOVBE r32, r/m32 | RM | Valido | Valido | Mover si es inferior o igual (CF=1 o ZF=1). |
REX.W + 0F 46 /r | CMOVBE r64, r/m64 | RM | Valido | No codificable | Mover si es inferior o igual (CF=1 o ZF=1). |
0F 42 /r | CMOVC r16, r/m16 | RM | Valido | Valido | Muévete si llevas (CF=1). |
0F 42 /r | CMOVC r32, r/m32 | RM | Valido | Valido | Muévete si llevas (CF=1). |
REX.W + 0F 42 /r | CMOVC r64, r/m64 | RM | Valido | No codificable | Muévete si llevas (CF=1). |
0F 44 /r | CMOVE r16, r/m16 | RM | Valido | Valido | Mover si es igual (ZF=1). |
0F 44 /r | CMOVE r32, r/m32 | RM | Valido | Valido | Mover si es igual (ZF=1). |
REX.W + 0F 44 /r | CMOVE r64, r/m64 | RM | Valido | No codificable | Mover si es igual (ZF=1). |
0F 4F /r | CMOVG r16, r/m16 | RM | Valido | Valido | Mover si es mayor (ZF=0 y SF=OF). |
0F 4F /r | CMOVG r32, r/m32 | RM | Valido | Valido | Mover si es mayor (ZF=0 y SF=OF). |
REX.W + 0F 4F /r | CMOVG r64, r/m64 | RM | v/n.e. | - | Mover si es mayor (ZF=0 y SF=OF). |
0F 4D /r | CMOVGE r16, r/m16 | RM | Valido | Valido | Mover si es mayor o igual (SF=OF). |
0F 4D /r | CMOVGE r32, r/m32 | RM | Valido | Valido | Mover si es mayor o igual (SF=OF). |
REX.W + 0F 4D /r | CMOVGE r64, r/m64 | RM | Valido | No codificable | Mover si es mayor o igual (SF=OF). |
0F 4C /r | CMOVL r16, r/m16 | RM | Valido | Valido | Muévete si es menos (SF OF). |
0F 4C /r | CMOVL r32, r/m32 | RM | Valido | Valido | Muévete si es menos (SF OF). |
REX.W + 0F 4C /r | CMOVL r64, r/m64 | RM | Valido | No codificable | Muévete si es menos (SF OF). |
0F 4E /r | CMOVLE r16, r/m16 | RM | Valido | Valido | Mover si es menos o igual (ZF=1 o SF OF). |
0F 4E /r | CMOVLE r32, r/m32 | RM | Valido | Valido | Mover si es menos o igual (ZF=1 o SF OF). |
REX.W + 0F 4E /r | CMOVLE r64, r/m64 | RM | Valido | No codificable | Mover si es menos o igual (ZF=1 o SF OF). |
0F 46 /r | CMOVNA r16, r/m16 | RM | Valido | Valido | Muévete si no por encima (CF=1 o ZF=1). |
0F 46 /r | CMOVNA r32, r/m32 | RM | Valido | Valido | Muévete si no por encima (CF=1 o ZF=1). |
REX.W + 0F 46 /r | CMOVNA r64, r/m64 | RM | Valido | No codificable | Muévete si no por encima (CF=1 o ZF=1). |
0F 42 /r | CMOVNAE r16, r/m16 | RM | Valido | Valido | Muévete si no por encima o por igual (CF=1). |
0F 42 /r | CMOVNAE r32, r/m32 | RM | Valido | Valido | Muévete si no por encima o por igual (CF=1). |
REX.W + 0F 42 /r | CMOVNAE r64, r/m64 | RM | Valido | No codificable | Muévete si no por encima o por igual (CF=1). |
0F 43 /r | CMOVNB r16, r/m16 | RM | Valido | Valido | Muévete si no debajo (CF=0). |
0F 43 /r | CMOVNB r32, r/m32 | RM | Valido | Valido | Muévete si no debajo (CF=0). |
REX.W + 0F 43 /r | CMOVNB r64, r/m64 | RM | Valido | No codificable | Muévete si no debajo (CF=0). |
0F 47 /r | CMOVNBE r16, r/m16 | RM | Valido | Valido | Mover si no es inferior o igual (CF=0 y ZF=0). |
0F 47 /r | CMOVNBE r32, r/m32 | RM | Valido | Valido | Mover si no es inferior o igual (CF=0 y ZF=0). |
REX.W + 0F 47 /r | CMOVNBE r64, r/m64 | RM | Valido | No codificable | Mover si no es inferior o igual (CF=0 y ZF=0). |
0F 43 /r | CMOVNC r16, r/m16 | RM | Valido | Valido | Muévete si no llevas (CF=0). |
0F 43 /r | CMOVNC r32, r/m32 | RM | Valido | Valido | Muévete si no llevas (CF=0). |
REX.W + 0F 43 /r | CMOVNC r64, r/m64 | RM | Valido | No codificable | Muévete si no llevas (CF=0). |
0F 45 /r | CMOVNE r16, r/m16 | RM | Valido | Valido | Mover si no es igual (ZF=0). |
0F 45 /r | CMOVNE r32, r/m32 | RM | Valido | Valido | Mover si no es igual (ZF=0). |
REX.W + 0F 45 /r | CMOVNE r64, r/m64 | RM | Valido | No codificable | Mover si no es igual (ZF=0). |
0F 4E /r | CMOVNG r16, r/m16 | RM | Valido | Valido | Muévete si no es mayor (ZF=1 o SF OF). |
0F 4E /r | CMOVNG r32, r/m32 | RM | Valido | Valido | Muévete si no es mayor (ZF=1 o SF OF). |
REX.W + 0F 4E /r | CMOVNG r64, r/m64 | RM | Valido | No codificable | Muévete si no es mayor (ZF=1 o SF OF). |
0F 4C /r | CMOVNGE r16, r/m16 | RM | Valido | Valido | Muévete si no es mayor o igual (SF OF). |
0F 4C /r | CMOVNGE r32, r/m32 | RM | Valido | Valido | Muévete si no es mayor o igual (SF OF). |
REX.W + 0F 4C /r | CMOVNGE r64, r/m64 | RM | Valido | No codificable | Muévete si no es mayor o igual (SF OF). |
0F 4D /r | CMOVNL r16, r/m16 | RM | Valido | Valido | Muévete si no menos (SF=OF). |
0F 4D /r | CMOVNL r32, r/m32 | RM | Valido | Valido | Muévete si no menos (SF=OF). |
REX.W + 0F 4D /r | CMOVNL r64, r/m64 | RM | Valido | No codificable | Muévete si no menos (SF=OF). |
0F 4F /r | CMOVNLE r16, r/m16 | RM | Valido | Valido | Muévete si no es menos o igual (ZF=0 y SF=OF). |
0F 4F /r | CMOVNLE r32, r/m32 | RM | Valido | Valido | Muévete si no es menos o igual (ZF=0 y SF=OF). |
REX.W + 0F 4F /r | CMOVNLE r64, r/m64 | RM | Valido | No codificable | Muévete si no es menos o igual (ZF=0 y SF=OF). |
0F 41 /r | CMOVNO r16, r/m16 | RM | Valido | Valido | Muévete si no desborda (OF=0). |
0F 41 /r | CMOVNO r32, r/m32 | RM | Valido | Valido | Muévete si no desborda (OF=0). |
REX.W + 0F 41 /r | CMOVNO r64, r/m64 | RM | Valido | No codificable | Muévete si no desborda (OF=0). |
0F 4B /r | CMOVNP r16, r/m16 | RM | Valido | Valido | Muévete si no la paridad (PF=0). |
0F 4B /r | CMOVNP r32, r/m32 | RM | Valido | Valido | Muévete si no la paridad (PF=0). |
REX.W + 0F 4B /r | CMOVNP r64, r/m64 | RM | Valido | No codificable | Muévete si no la paridad (PF=0). |
0F 49 /r | CMOVNS r16, r/m16 | RM | Valido | Valido | Muévete si no firmas (SF=0). |
0F 49 /r | CMOVNS r32, r/m32 | RM | Valido | Valido | Muévete si no firmas (SF=0). |
REX.W + 0F 49 /r | CMOVNS r64, r/m64 | RM | Valido | No codificable | Muévete si no firmas (SF=0). |
0F 45 /r | CMOVNZ r16, r/m16 | RM | Valido | Valido | Muévete si no cero (ZF=0). |
0F 45 /r | CMOVNZ r32, r/m32 | RM | Valido | Valido | Muévete si no cero (ZF=0). |
REX.W + 0F 45 /r | CMOVNZ r64, r/m64 | RM | Valido | No codificable | Muévete si no cero (ZF=0). |
0F 40 /r | CMOVO r16, r/m16 | RM | Valido | Valido | Muévete si se desborda (OF=1). |
0F 40 /r | CMOVO r32, r/m32 | RM | Valido | Valido | Muévete si se desborda (OF=1). |
REX.W + 0F 40 /r | CMOVO r64, r/m64 | RM | Valido | No codificable | Muévete si se desborda (OF=1). |
0F 4A /r | CMOVP r16, r/m16 | RM | Valido | Valido | Mover si la paridad (PF=1). |
0F 4A /r | CMOVP r32, r/m32 | RM | Valido | Valido | Mover si la paridad (PF=1). |
REX.W + 0F 4A /r | CMOVP r64, r/m64 | RM | Valido | No codificable | Mover si la paridad (PF=1). |
0F 4A /r | CMOVPE r16, r/m16 | RM | Valido | Valido | Muévete si la paridad es igual (PF=1). |
0F 4A /r | CMOVPE r32, r/m32 | RM | Valido | Valido | Muévete si la paridad es igual (PF=1). |
REX.W + 0F 4A /r | CMOVPE r64, r/m64 | RM | Valido | No codificable | Muévete si la paridad es igual (PF=1). |
0F 4B /r | CMOVPO r16, r/m16 | rm | val | id Valid Mover si paridad extraña (PF=0). | |
0F 4B /r | CMOVPO r32, r/m32 | rm | val | id Valid Mover si paridad extraña (PF=0). | |
REX.W + 0F 4B /r | CMOVPO r64, r/m64 | rm | val | id N.E. Mueva si la paridad es extraña (PF=0). | |
0F 48 /r | CMOVS r16, r/m16 | rm | val | id Valid Mover si signo (SF=1). | |
0F 48 /r | CMOVS r32, r/m32 | rm | val | id Valid Mover si signo (SF=1). | |
REX.W + 0F 48 /r | CMOVS r64, r/m64 | rm | val | id N.E. Mover si el signo (SF=1). | |
0F 44 /r | CMOVZ r16, r/m16 | rm | val | id Valid Move si cero (ZF=1). | |
0F 44 /r | CMOVZ r32, r/m32 | rm | val | id Valid Move si cero (ZF=1). | |
REX.W + 0F 44 /r | CMOVZ r64, r/m64 | rm | val | id N.E. Mover si cero (ZF=1). |
Codificacion de operandos
Cada modo es un valor de la columna Op/En de arriba. Dice en que campo de la instruccion codificada va cada operando, en el orden en que se escriben, y si la instruccion lo lee, lo escribe o ambas cosas.
RM
modrm.reglectura y escriturabyte ModRM, campo reg (bits 5-3)modrm.rmlecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
Coste medido
Cargando las mediciones de arch-data...
Descripción
Cada una de las instrucciones de CMOVcc realiza una operación de movimiento si las banderas de estado en el registro EFLAGS (CF, OF, PF, SF y ZF) se encuentran en un estado (o condición). Un código de condición (cc) se asocia con cada instrucción para indicar la condición que se está probando. Si la condición no está satisfecha, no se realiza un movimiento y la ejecución continúa con la instrucción siguiendo la instrucción CMOVcc.
Específicamente, CMOVcc carga datos de su operando de origen en un registro temporal incondicionalmente (independientemente del código de condiciones y las banderas de estado en el registro EFLAGS). Si el código de condición asociado con la instrucción (cc) está satisfecho, los datos del registro temporal se copian luego en el operando de destino de la instrucción.
Estas instrucciones pueden mover valores de 16 bits, 32 bits o 64 bits de memoria a un registro de proposito general o de un registro de proposito general a otro. No se admiten movimientos condicionales de 8 bits de registro operandos.
La condición para cada CMOVcc mnemonic se da en la columna de descripción de la tabla anterior. Los términos "menos" y "mayor" se utilizan para las comparaciones de enteros con signo y los términos "arriba" y "bajo" se utilizan para enteros sin signo.
Debido a que un estado particular de las banderas de estado puede a veces ser interpretado de dos maneras, dos mnemonics se definen para algunos códigos de operación. Por ejemplo, la instrucción CMOVA (movimiento condicional si arriba) y la instrucción CMOVNBE (movimiento condicional si no por debajo o por igual) son mnemonía alternativa para el código de operación 0F 47H.
Las instrucciones CMOVcc fueron introducidas en procesadores familiares P6; sin embargo, estas instrucciones pueden no ser apoyadas por todos los procesadores IA-32. El software puede determinar si las instrucciones CMOVcc son compatibles mediante la comprobación de la información de características del procesador con la instrucción CPUID (ver "CPUID--CPU Identificación" en este capítulo).
En modo de 64 bits, el tamaño de operación predeterminado de la instrucción es de 32 bits. El uso del prefijo REX.R permite el acceso a registros adicionales (R8-R15). El uso del prefijo REX.W promueve la operación a 64 bits. Vea la tabla resumen al comienzo de esta sección para la codificación de datos y límites.
Operación
temp := SRC
IF condition TRUE
THEN DEST := temp;
ELSE IF (OperandSize = 32 and IA-32e mode active)
THEN DEST[63:32] := 0;
FI;Banderas afectadas
None.
Excepciones
Modo protegido
#GP(0) | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. Si el registro DS, ES, FS o GS contiene un NULL selector de segmento. |
#SS(0) | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. #PF(fault-code) Si un fallo de pagina ocurre. |
#AC(0) | Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada mientras que el nivel de privilegio actual es 3. |
#UD | Si se utiliza el prefijo LOCK. |
Modo real
#GP | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. |
#SS | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. |
#UD | Si se utiliza el prefijo LOCK. |
Modo virtual-8086
#GP(0) | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. |
#SS(0) | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. #PF(fault-code) Si un fallo de pagina ocurre. |
#AC(0) | Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada. |
#UD | Si se utiliza el prefijo LOCK. |
Modo de compatibilidad
| Las mismas excepciones que en modo protegido. |
Modo de 64 bits
#SS(0) | Si una dirección de memoria que hace referencia al segmento SS está en forma no canónica. |
#GP(0) | Si la dirección de memoria está en forma no canónica. #PF(fault-code) Si un fallo de pagina ocurre. |
#AC(0) | Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada mientras que el nivel de privilegio actual es 3. |
#UD | Si se utiliza el prefijo LOCK. |