La instrucción cmp (comparar) es idéntica a la instrucción de resta (resta sin préstamo) con una diferencia importante: no almacena la diferencia en el operando de destino.
La sintaxis de una instrucción de resta es:
sub dest, src dest = dest - src and set flags
La forma genérica de la instrucción es:
cmp dest, src perform dest - src and set flags
así que dest es un nombre poco apropiado en este caso, ya que no se almacena nada.
El indicador de acarreo C se establece después de una operación cmp si restar src de dest requiere un préstamo. Esto ocurre solo cuando dest es menor que src donde dest y src son valores sin signo. Para los operandos firmados, la bandera C no tiene significado.
Las diversas formas son (en cada caso, la primera operación es dest, la segunda es src):
cmp reg, reg
cmp reg, mem
cmp mem, reg
cmp reg, immediate data
cmp mem, immediate data
cmp eax/ax/al, immediate data
Para completar, aquí está el resumen de las otras banderas:
El indicador cero Z se establece si y solo si dest = src.
Los indicadores de signo S y O de desbordamiento solo son válidos si los operandos se consideran firmados (es decir, justo lo contrario del indicador C).
Para las comparaciones firmadas, las banderas S (signo) y O (desbordamiento), en conjunto, tienen el siguiente significado:
Si ((S = 0) y (O = 1)) o ((S = 1) y (O = 0)), dest < src
Si ((S = 0) y (O = 0)) o ((S = 1) y (O = 1)), dest > = src