XADD

Intercambio y Add

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
0F C0 /rXADD r/m8, r8MRValidoValidoIntercambio r8 y r/m8; carga suma en r/m8.
0F C1 /rXADD r/m16, r16MRValidoValidoIntercambio r16 y r/m16; carga suma en r/m16.
0F C1 /rXADD r/m32, r32MRValidoValidoIntercambio r32 y r/m32; carga suma en r/m32.
REX.W + 0F C1 /rXADD r/m64, r64MRValidoNo codificableIntercambio r64 y r/m64; carga suma en r/m64.

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 lectura y escriturabyte ModRM, campo reg (bits 5-3)

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

Descripción

Intercambia el primer operando (operando de destino) con el segundo operando (operando de origen), luego carga la suma de los dos valores en el operando de destino. El operando de destino puede ser un registro o una ubicación de memoria; el operando de origen es un registro.

En modo de 64 bits, el tamaño de operación predeterminado de la instrucción es de 32 bits. El uso de un prefijo REX en forma de REX.R permite el acceso a registros adicionales (R8-R15). Utilizar un prefijo REX en forma de 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.

Esta instrucción se puede utilizar con un prefijo LOCK para permitir que la instrucción se ejecute atómicamente.

Compatibilidad de arquitectura IA-32

Los procesadores IA-32 antes que el procesador Intel486 no reconocen esta instrucción. Si esta instrucción se utiliza, debe proporcionar una secuencia de código equivalente que se ejecuta en procesadores anteriores.

Operación

TEMP := SRC + DEST;
SRC := DEST;
DEST := TEMP;

Banderas afectadas

Las banderas CF, PF, AF, SF, ZF y OF se establecen según el resultado de la adición, que se almacena en el operando de destino.

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