Pregunta

Estoy tratando de entender el desbordamiento y el transporte de banderas en x86.

Según tengo entendido, para la suma de números en complemento a 2 con signo, las banderas solo se pueden generar de una de cuatro maneras (mis ejemplos son números de 4 bits):

  1. pos+pos = neg (desbordamiento)
    • 0111 + 0001 = 1000 (7 + 1 = -8)
  2. pos+neg = pos (llevar)
    • 0011 + 1110 = 0001 (3 + -2 = 1)
  3. neg+neg = neg (llevar)
    • 1111 + 1111 = 1110 (-1 + -1 = -2)
  4. neg+neg = pos (desbordamiento y acarreo)
    • 1000 + 1001 = 0001 (-8 + -7 = 1)

Entonces, en el ensamblaje x86, ¿restar B de A genera los mismos indicadores que sumar A y -B?

¿Fue útil?

Solución

Aquí hay una tabla de referencia que podría ayudar.Esto muestra un ejemplo de cada una combinación posible de las 4 banderas aritméticas que pueden resultar de las instrucciones de suma y subvenciones en X86.'H' 'UD' y 'D' defienden los hexagonales, sin firmar decimal y firmaron representaciones decimales de cada valor.Por ejemplo, la primera fila de Sub dice 0xff - 0xfe= 0x1 sin banderas establecidas.

Pero, creo que la historia corta es la respuesta de Alex es correcta.

 ADD
       A                   B                   A + B              Flags  
 ---------------     ----------------    ---------------      -----------------
 h  |  ud  |   d   | h  |  ud  |   d   | h  |  ud  |   d   | OF | SF | ZF | CF
 ---+------+-------+----+------+-------+----+------+-------+----+----+----+---
 7F | 127  |  127  | 0  |  0   |   0   | 7F | 127  |  127  | 0  | 0  | 0  | 0
 FF | 255  |  -1   | 7F | 127  |  127  | 7E | 126  |  126  | 0  | 0  | 0  | 1
 0  |  0   |   0   | 0  |  0   |   0   | 0  |  0   |   0   | 0  | 0  | 1  | 0
 FF | 255  |  -1   | 1  |  1   |   1   | 0  |  0   |   0   | 0  | 0  | 1  | 1
 FF | 255  |  -1   | 0  |  0   |   0   | FF | 255  |  -1   | 0  | 1  | 0  | 0
 FF | 255  |  -1   | FF | 255  |  -1   | FE | 254  |  -2   | 0  | 1  | 0  | 1
 FF | 255  |  -1   | 80 | 128  | -128  | 7F | 127  |  127  | 1  | 0  | 0  | 1
 80 | 128  | -128  | 80 | 128  | -128  | 0  |  0   |   0   | 1  | 0  | 1  | 1
 7F | 127  |  127  | 7F | 127  |  127  | FE | 254  |  -2   | 1  | 1  | 0  | 0


 SUB
       A                   B                   A - B              Flags  
 ---------------     ----------------    ---------------      -----------------
 h  |  ud  |   d   | h  |  ud  |   d   | h  |  ud  |   d   || OF | SF | ZF | CF
----+------+-------+----+------+-------+----+------+-------++----+----+----+----
 FF | 255  |  -1   | FE | 254  |  -2   | 1  |  1   |   1   || 0  | 0  | 0  | 0
 7E | 126  |  126  | FF | 255  |  -1   | 7F | 127  |  127  || 0  | 0  | 0  | 1
 FF | 255  |  -1   | FF | 255  |  -1   | 0  |  0   |   0   || 0  | 0  | 1  | 0
 FF | 255  |  -1   | 7F | 127  |  127  | 80 | 128  | -128  || 0  | 1  | 0  | 0
 FE | 254  |  -2   | FF | 255  |  -1   | FF | 255  |  -1   || 0  | 1  | 0  | 1
 FE | 254  |  -2   | 7F | 127  |  127  | 7F | 127  |  127  || 1  | 0  | 0  | 0
 7F | 127  |  127  | FF | 255  |  -1   | 80 | 128  | -128  || 1  | 1  | 0  | 1

Otros consejos

Las 4 combinaciones de los valores de acarreo y desbordamiento son posibles al sumar o restar.Puedes ver más ejemplos en esta respuesta.

esta respuesta contiene una prueba del hecho de que el carry que obtienes de A-B es el inverso del acarreo que obtienes de A+(-B).El código del primer enlace explota esta propiedad para convertir ADC en SBB.

Sin embargo, el valor del indicador de desbordamiento firmado debe ser el mismo para ambos A-B y A+(-B) porque depende de si el resultado tiene o no el bit de signo correcto y en ambos casos el bit de signo será el mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top