acarreo/desbordamiento y resta en x86
-
12-11-2019 - |
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):
- pos+pos = neg (desbordamiento)
- 0111 + 0001 = 1000 (7 + 1 = -8)
- pos+neg = pos (llevar)
- 0011 + 1110 = 0001 (3 + -2 = 1)
- neg+neg = neg (llevar)
- 1111 + 1111 = 1110 (-1 + -1 = -2)
- 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?
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.