ADD
Añadir
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
04 ib | ADD AL, imm8 | I | Valido | Valido | Añadir imm8 a AL. |
05 iw | ADD AX, imm16 | I | Valido | Valido | Añadir imm16 a AX. |
05 id | ADD EAX, imm32 | I | Valido | Valido | Añadir imm32 a EAX. |
REX.W + 05 id | ADD RAX, imm32 | I | Valido | No codificable | Añadir imm32 sign-extended a 64-bits a RAX. |
80 /0 ib | ADD r/m8, imm8 | MI | Valido | Valido | Añadir imm8 a r/m8. |
81 /0 iw | ADD r/m16, imm16 | MI | Valido | Valido | Añadir imm16 a r/m16. |
81 /0 id | ADD r/m32, imm32 | MI | Valido | Valido | Añadir imm32 a r/m32. |
REX.W + 81 /0 id | ADD r/m64, imm32 | MI | Valido | No codificable | Añadir imm32 sign-extended a 64-bits a r/m64. |
83 /0 ib | ADD r/m16, imm8 | MI | Valido | Valido | Añadir señal-extended imm8 a r/m16. |
83 /0 ib | ADD r/m32, imm8 | MI | Valido | Valido | Añadir señal-extended imm8 a r/m32. |
REX.W + 83 /0 ib | ADD r/m64, imm8 | MI | Valido | No codificable | Añadir señal-extended imm8 a r/m64. |
00 /r | ADD r/m8, r8 | MR | Valido | Valido | Añadir r8 a r/m8. |
01 /r | ADD r/m16, r16 | MR | Valido | Valido | Añadir r16 a r/m16. |
01 /r | ADD r/m32, r32 | MR | Valido | Valido | Añadir r32 a r/m32. |
REX.W + 01 /r | ADD r/m64, r64 | MR | Valido | No codificable | Añadir r64 a r/m64. |
02 /r | ADD r8, r/m8 | RM | Valido | Valido | Añadir r/m8 a r8. |
03 /r | ADD r16, r/m16 | RM | Valido | Valido | Añadir r/m16 a r16. |
03 /r | ADD r32, r/m32 | RM | Valido | Valido | Añadir r/m32 a r32. |
REX.W + 03 /r | ADD r64, r/m64 | RM | Valido | No codificable | Añadir r/m64 a 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.
RM
modrm.reglectura y escriturabyte 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
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)
MI
modrm.rmlectura y escriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pideimm8/16/32inmediato que sigue a la instruccion, del ancho del operando
I
AL/AX/EAX/RAXimm8/16/32inmediato que sigue a la instruccion, del ancho del operando
Coste medido
Cargando las mediciones de arch-data...
Banderas nombradas
CFAcarreoPFParidadAFAcarreo auxiliarZFCeroSFSignoOFDesbordamiento
Descripción
Añade el operando de destino (primer operando) y el operando de origen (segundo operando) y luego almacena el resultado en el operando de destino. El operando de destino puede ser un registro o una ubicación de memoria; el operando de origen puede ser un registro inmediato, o una ubicación de memoria. (Sin embargo, dos operandos de memoria no se pueden utilizar en una instrucción.) Cuando un valor inmediato se utiliza como un operando, se muestra-extended a la longitud del formato el operando de destino.
La instrucción ADD realiza adición entero. Evalua el resultado tanto para el entero firmado y no firmado operandos y establece las banderas OF y CF para indicar un port (overflow) en el resultado con o sin signo, respectivamente. La bandera SF indica el signo del resultado con signo.
Esta instrucción se puede utilizar con un prefijo LOCK para permitir que la instrucción se ejecute atómicamente.
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.
Operación
DEST := DEST + SRC;Banderas afectadas
Las banderas OF, SF, ZF, AF, CF y PF se establecen según el resultado.
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 se utiliza para acceder a la memoria y 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. |