CMPXCHG8B, CMPXCHG16B
Comparar y cambiar Bytes
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
0F C7 /1 | CMPXCHG8B m64 | M | Valido | valid* | Compare EDX:EAX con m64. Si es igual, establecer ZF y cargar ECX:EBX en m64. Else, ZF claro y cargar m64 en EDX:EAX. |
REX.W + 0F C7 /1 | CMPXCHG16B m128 | M | Valido | No codificable | Compare RDX:RAX con m128. Si es igual, establecer ZF y cargar RCX:RBX en m128. Else, ZF claro y cargar m128 en RDX:RAX. |
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.
M
modrm.rmlectura y escriturabyte 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...
Banderas nombradas
CFAcarreoPFParidadAFAcarreo auxiliarZFCeroSFSignoOFDesbordamiento
Descripción
Compara el valor de 64 bits en EDX:EAX (o valor de 128 bits en RDX:RAX si tamaño de operando es de 128 bits) con el operando (operando de destino). Si los valores son iguales, el valor de 64 bits en ECX:EBX (o valor de 128 bits en RCX:RBX) se almacena en el operando de destino. De lo contrario, el valor en el operando de destino se carga en EDX:EAX (o RDX:RAX). El operando de destino es una ubicación de memoria de 8 bytes (o ubicación de memoria de 16 bytes si tamaño de operando es de 128 bits). Para el EDX:EAX y ECX:EBX pares de registro, EDX y ECX contienen los 32 bits de alto orden y EAX y EBX contienen los 32 bits de bajo orden de un valor de 64 bits. Para el RDX:RAX y RCX:RBX pares de registro, RDX y RCX contienen los 64 bits de alto orden y RAX y RBX contienen los 64bits de bajo orden de un valor de 128 bits.
Esta instrucción se puede utilizar con un prefijo LOCK para permitir que la instrucción se ejecute atómicamente. Para simplificar la interfaz al bus del procesador, el operando de destino recibe un ciclo de escritura sin tener en cuenta el resultado de la comparación. El operando de destino se escribe de nuevo si la comparación falla; de lo contrario, el operando de origen se escribe en el destino. (El procesador nunca produce una lectura cerrada sin producir también una escritura cerrada.)
En modo 64-bit, el tamaño de operación predeterminado es de 64 bits. El uso del prefijo REX.W promueve la operación a 128 bits. Tenga en cuenta que CMPXCHG16B requiere que el destino (memoria) operando sea 16-byte alineado. Vea la tabla resumen al comienzo de esta sección para la codificación de datos y límites. Para obtener información sobre la bandera CPUID que indica CMPX- CHG16B, consulte el Capítulo 21 en el Intel(R) 64 e IA-32 Architectures Software Developer's Manual, Volumen 1.
Compatibilidad de arquitectura IA-32
Esta codificación de instrucciones no es compatible con procesadores Intel antes que los procesadores de Pentium.
Operación
IF (64-Bit Mode and OperandSize = 64)
THEN
TEMP128 := DEST
IF (RDX:RAX = TEMP128)
THEN
ZF := 1;
DEST := RCX:RBX;
ELSE
ZF := 0;
RDX:RAX := TEMP128;
DEST := TEMP128;
FI;
FI
ELSE
TEMP64 := DEST;
IF (EDX:EAX = TEMP64)
THEN
ZF := 1;
DEST := ECX:EBX;
ELSE
ZF := 0;
EDX:EAX := TEMP64;
DEST := TEMP64;
FI;
FI;
FI;Banderas afectadas
La bandera ZF se establece si el operando de destino y EDX:EAX son iguales; de lo contrario se pone a cero. Las banderas CF, PF, AF, SF y OF no son afectadas.
Excepciones
Modo protegido
#UD | Si el destino no es un operando de memoria. |
#GP(0) | Si el destino se encuentra en un segmento no escrito. Si la dirección efectiva un operando de memoria 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. |
Modo real
#UD | Si el operando de destino no es una ubicación de memoria. |
#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. |
Modo virtual-8086
#UD | Si el operando de destino no es una ubicación de memoria. |
#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. |
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. Si operando de memoria para CMPXCHG16B no está alineada en un límite de 16 bytes. Si CPUID.01H:ECX.CMPXCHG16B[13] = 0. |
#UD | Si el operando de destino no es una ubicación de memoria. #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. |