2011-08-31 21 views
11

He estado jugando con el ensamblado por un tiempo y mirando algún código. en el que AL se establece por primera vez en 0x84, luego se usa cmp AL, 0x30. Esta instrucción activa el indicador de Desbordamiento.¿Por qué cmp 0x84,0x30 activa el indicador de desbordamiento?

De lo que leí CMP se supone que resta el segundo número del primero y luego establece las banderas, en ese caso debe ser 0x84-0x30 el resultado es 0x54 y no hay desbordamiento.

Respuesta

18

Sólo hay ningún desbordamiento si estás interpretar esos valores como números sin signo - si usted interpreta su 0x84 como firmado, no hay duda de desbordamiento:

  1. 0x84 interpretado como un valor de 8 bits con signo es -124
  2. 0x30 interpretado como un valor de 8 bits con signo es 48
  3. -124 - 48 = -172

-172 está fuera del alcance de un valor de 8 bits con signo (-128 a 127) y T por eso se establece la bandera OF. Debería marcar CF que indica un desbordamiento sin signo.

Desde el Intel 64 and IA-32 Architectures Software Developer’s Manual, Volumen 2 para CMP:

La comparación se realiza restando el segundo operando desde el primer operando y luego establecer los indicadores de estado de la misma manera que la instrucción SUB.

y para SUB:

La instrucción SUB realiza la resta de enteros. Evalúa el resultado para los operandos de enteros firmados y no firmados y establece los indicadores OF y CF para indicar un desbordamiento en el resultado firmado o no firmado, respectivamente. La bandera SF indica el signo del resultado firmado.

+0

Carl es correcto. El indicador de desbordamiento x86 en realidad significa * desbordamiento firmado *. – wallyk

+0

muy buena respuesta. – phoxis

+0

muchas gracias por su respuesta! – Maciek

Cuestiones relacionadas