XCHG
Registro de intercambio / memoria con registro
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
90+rw | XCHG AX, r16 | O | Valido | Valido | Intercambio r16 con AX. |
90+rw | XCHG r16, AX | O | Valido | Valido | Intercambio AX con r16. |
90+rd | XCHG EAX, r32 | O | Valido | Valido | Intercambio r32 con EAX. |
REX.W + 90+rd | XCHG RAX, r64 | O | Valido | No codificable | Intercambio r64 con RAX. |
90+rd | XCHG r32, EAX | O | Valido | Valido | Intercambio EAX con r32. |
REX.W + 90+rd | XCHG r64, RAX | O | Valido | No codificable | Intercambio RAX con r64. |
86 /r | XCHG r/m8, r8 | MR | Valido | Valido | Intercambio r8 (registro de byte) con byte de r/m8. |
86 /r | XCHG r8, r/m8 | RM | Valido | Valido | Intercambio de byte de r/m8 con r8 (registro de byte). |
87 /r | XCHG r/m16, r16 | MR | Valido | Valido | Intercambio r16 con palabra de r/m16. |
87 /r | XCHG r16, r/m16 | RM | Valido | Valido | Palabras de cambio de r/m16 con r16. |
87 /r | XCHG r/m32, r32 | MR | Valido | Valido | Intercambio r32 con doble palabra de r/m32. |
REX.W + 87 /r | XCHG r/m64, r64 | MR | Valido | No codificable | Intercambio r64 con cuádpago de r/m64. |
87 /r | XCHG r32, r/m32 | RM | Valido | Valido | Intercambiar la palabra doble de r/m32 con r32. |
REX.W + 87 /r | XCHG r64, r/m64 | RM | Valido | No codificable | Intercambiar cuádpo de r/m64 con r64. |
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.
O
AX/EAX/RAXlectura y escrituraopcode.reglectura y escrituralos tres bits bajos del propio byte de opcode
O
opcode.reglectura y escrituralos tres bits bajos del propio byte de opcodeAX/EAX/RAXlectura y escritura
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)
RM
modrm.regescriturabyte 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
Intercambia el contenido del destino (primero) y fuente (segundo) operandos. Los operandos puede ser dos registros generales o un registro y una ubicación de memoria. Si se hace referencia a un operando de memoria, el protocolo de bloqueo del procesador se implementa automáticamente durante la operación de intercambio, independientemente de la presencia o ausencia del prefijo LOCK o del valor del IOPL. (Véase la descripción prefijo LOCK en este capítulo para más información sobre el protocolo de bloqueo.)
Esta instrucción es útil para implementar semáforos o estructuras de datos similares para la sincronización de procesos. (Ver "Bus Locking" en el capítulo 9 del Intel(R) 64 e IA-32 Architectures Software Developer's Manual, Volumen 3A, para obtener más información sobre el bloqueo de bus.)
La instrucción XCHG también se puede utilizar en lugar de la instrucción BSWAP de 16 bits operandos.
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.
NOTE
XCHG (E)AX, (E)AX (encoded instruction byte is 90H) es un alias para NOP independientemente de los prefijos del tamaño de los datos, incluyendo REX.W.
Operación
TEMP := DEST;
DEST := SRC;
SRC := TEMP;Banderas afectadas
None.
Excepciones
Modo protegido
#GP(0) | Si operando está 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. |