CMPXCHG
Comparación e intercambio
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
0F B0/r | CMPXCHG r/m8, r8 | MR | Valido | valid2 | Compare AL con r/m8. Si es igual, ZF se establece y r8 se carga en r/m8. Else, ZF claro y cargar r/m8 en AL. |
0F B1/r | CMPXCHG r/m16, r16 | MR | Valido | valid2 | Compare AX con r/m16. Si es igual, ZF se establece y r16 se carga en r/m16. Else, ZF claro y cargar r/m16 en AX. |
0F B1/r | CMPXCHG r/m3, r3 | MR | Valido | valid2 | Compare EAX con r/m32. Si es igual, ZF se establece y r3 se carga en r/m32. Else, ZF claro y cargar r/m3 en EAX. |
REX.W + 0F B1/r | CMPXCHG r/m64, r64 | MR | Valido | No codificable | Compare RAX con r/m64. Si es igual, ZF se establece y r64 se carga en r/m64. Else, ZF claro y cargar r/m64 en 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.
MR
modrm.rmlectura y escriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pidemodrm.reglecturabyte ModRM, campo reg (bits 5-3)
Coste medido
Cargando las mediciones de arch-data...
Banderas nombradas
CFAcarreoPFParidadAFAcarreo auxiliarZFCeroSFSignoOFDesbordamiento
Descripción
Compara el valor en el registro AL, AX, EAX, o RAX con el primer operando (operando de destino). Si los dos valores son iguales, el segundo operando (operando de origen) se carga en el operando de destino. De lo contrario, el operando de destino se carga en el registro AL, AX, EAX o RAX. El registro RAX está disponible sólo en modo de 64 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 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.
Compatibilidad de arquitectura IA-32
Esta instrucción no es compatible con procesadores Intel antes que los procesadores Intel486.
Operación
(* Accumulator = AL, AX, EAX, or RAX depending on whether a byte, word, doubleword, or quadword comparison is being performed *)
TEMP := DEST
IF accumulator = TEMP
THEN
ZF := 1;
DEST := SRC;
ELSE
ZF := 0;
accumulator := TEMP;
DEST := TEMP;
FI;Banderas afectadas
La bandera ZF se establece si los valores en el operando de destino y registro AL, AX, o EAX son iguales; de lo contrario se pone a cero. Las banderas CF, PF, AF, SF y OF se establecen según los resultados de la operación de comparación.
Excepciones
Modo protegido
#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. |
#UD | Si el prefijo LOCK se utiliza pero el destino no es un operando de memoria. |
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 el prefijo LOCK se utiliza pero el destino no es un operando de memoria. |
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 el prefijo LOCK se utiliza pero el destino no es un operando de memoria. |
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 el prefijo LOCK se utiliza pero el destino no es un operando de memoria. |