CMP

Compare Dos operandos

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
3C ibCMP AL, imm8IValidoValidoCompare imm8 con AL.
3D iwCMP AX, imm16IValidoValidoCompare imm16 con AX.
3D idCMP EAX, imm32IValidoValidoCompare imm32 con EAX.
REX.W + 3D idCMP RAX, imm32IValidoNo codificableCompare imm32 sign-extended a 64-bits con RAX.
80 /7 ibCMP r/m8, imm8MIValidoValidoCompare imm8 con r/m8.
81 /7 iwCMP r/m16, imm16MIValidoValidoCompare imm16 con r/m16.
81 /7 idCMP r/m32, imm32MIValidoValidoCompare imm32 con r/m32.
REX.W + 81 /7 idCMP r/m64, imm32MIValidoNo codificableCompare imm32 sign-extended a 64-bits con r/m64.
83 /7 ibCMP r/m16, imm8MIValidoValidoCompare imm8 con r/m16.
83 /7 ibCMP r/m32, imm8MIValidoValidoCompare imm8 con r/m32.
REX.W + 83 /7 ibCMP r/m64, imm8MIValidoNo codificableCompare imm8 con r/m64.
38 /rCMP r/m8, r8MRValidoValidoCompare r8 con r/m8.
39 /rCMP r/m16, r16MRValidoValidoCompare r16 con r/m16.
39 /rCMP r/m32, r32MRValidoValidoCompare r32 con r/m32.
REX.W + 39 /rCMP r/m64,r64MRValidoNo codificableCompare r64 con r/m64.
3A /rCMP r8, r/m8RMValidoValidoCompare r/m8 con r8.
3B /rCMP r16, r/m16RMValidoValidoCompare r/m16 con r16.
3B /rCMP r32, r/m32RMValidoValidoCompare r/m32 con r32.
REX.W + 3B /rCMP r64, r/m64RMValidoNo codificableCompare 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

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

MR

  1. modrm.rm lecturabyte 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)

MI

  1. modrm.rm lecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
  2. imm8/16/32inmediato que sigue a la instruccion, del ancho del operando

I

  1. AL/AX/EAX/RAX lectura
  2. imm8/16/32inmediato que sigue a la instruccion, del ancho del operando

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

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.
#UDSi se utiliza el prefijo LOCK.
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.
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 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.
#UDSi se utiliza el prefijo LOCK.

Fuentes