CMP
Compare Dos operandos
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
3C ib | CMP AL, imm8 | I | Valido | Valido | Compare imm8 con AL. |
3D iw | CMP AX, imm16 | I | Valido | Valido | Compare imm16 con AX. |
3D id | CMP EAX, imm32 | I | Valido | Valido | Compare imm32 con EAX. |
REX.W + 3D id | CMP RAX, imm32 | I | Valido | No codificable | Compare imm32 sign-extended a 64-bits con RAX. |
80 /7 ib | CMP r/m8, imm8 | MI | Valido | Valido | Compare imm8 con r/m8. |
81 /7 iw | CMP r/m16, imm16 | MI | Valido | Valido | Compare imm16 con r/m16. |
81 /7 id | CMP r/m32, imm32 | MI | Valido | Valido | Compare imm32 con r/m32. |
REX.W + 81 /7 id | CMP r/m64, imm32 | MI | Valido | No codificable | Compare imm32 sign-extended a 64-bits con r/m64. |
83 /7 ib | CMP r/m16, imm8 | MI | Valido | Valido | Compare imm8 con r/m16. |
83 /7 ib | CMP r/m32, imm8 | MI | Valido | Valido | Compare imm8 con r/m32. |
REX.W + 83 /7 ib | CMP r/m64, imm8 | MI | Valido | No codificable | Compare imm8 con r/m64. |
38 /r | CMP r/m8, r8 | MR | Valido | Valido | Compare r8 con r/m8. |
39 /r | CMP r/m16, r16 | MR | Valido | Valido | Compare r16 con r/m16. |
39 /r | CMP r/m32, r32 | MR | Valido | Valido | Compare r32 con r/m32. |
REX.W + 39 /r | CMP r/m64,r64 | MR | Valido | No codificable | Compare r64 con r/m64. |
3A /r | CMP r8, r/m8 | RM | Valido | Valido | Compare r/m8 con r8. |
3B /r | CMP r16, r/m16 | RM | Valido | Valido | Compare r/m16 con r16. |
3B /r | CMP r32, r/m32 | RM | Valido | Valido | Compare r/m32 con r32. |
REX.W + 3B /r | CMP r64, r/m64 | RM | Valido | No codificable | Compare 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.
RM
modrm.reglecturabyte 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.rmlecturabyte 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.rmlecturabyte 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/RAXlecturaimm8/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
Compara el primer operando de origen con el segundo operando de origen y establece las banderas de estado en el registro EFLAGS según los resultados. La comparación se realiza restando el segundo operando del primer operando y luego estableciendo las banderas de estado de la misma manera que la instrucción SUB. Cuando un valor inmediato se utiliza como un operando, se muestra en la longitud del primer operando.
Los códigos de condiciones utilizados por las instrucciones Jcc, CMOVcc y SETcc se basan en los resultados de una instrucción CMP. Apéndice B, "EFLAGS Códigos de Estado", en Intel(R) 64 e IA-32 Architectures Software Developer's Manual, Volumen 1, muestra la relación de las banderas de estado y los códigos de condiciones.
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.
Operación
temp := SRC1 - SignExtend(SRC2);
ModifyStatusFlags; (* Modify status flags in the same manner as the SUB instruction*)Banderas afectadas
Las banderas CF, OF, SF, ZF, AF y PF se establecen según el resultado.
Excepciones
Modo protegido
#GP(0) | Si un operando de memoria dirección efectiva 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 se utiliza el prefijo LOCK. |
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. |
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 se utiliza el prefijo LOCK. |
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 se utiliza el prefijo LOCK. |