CMPXCHG

Comparación e intercambio

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
0F B0/rCMPXCHG r/m8, r8MRValidovalid2Compare 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/rCMPXCHG r/m16, r16MRValidovalid2Compare 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/rCMPXCHG r/m3, r3MRValidovalid2Compare 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/rCMPXCHG r/m64, r64MRValidoNo codificableCompare 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

  1. modrm.rm lectura y escriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
  2. modrm.reg lecturabyte ModRM, campo reg (bits 5-3)

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

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.
#UDSi el prefijo LOCK se utiliza pero el destino no es un operando de memoria.
Modo real
#GPSi un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS.
#SSSi un operando de memoria dirección efectiva está fuera del límite del segmento SS.
#UDSi 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.
#UDSi 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.
#UDSi el prefijo LOCK se utiliza pero el destino no es un operando de memoria.

Fuentes