Temas que encontraras en esta pagina aritmetica de complemento a dos, aritmetica de precision extendida
ARITMÉTICA DE COMPLEMENTO A DOS
La instrucción ADD
efectúa una suma y la instrucción SUB
efectúa una resta. Dos de los bits en el registro FLAGS
, que se alteran con estas instrucciones son las banderas de desborde y carry.
La bandera de desborde se fija si el resultado verdadero de la operación es muy grande para caber en el destino para aritmética con signo. La bandera de carry se fija si hay carry en el bit más significativo de una suma o un préstamo en el bit más significativo de una resta.
Una de las grandes ventajas del complemento a 2 es que las reglas para la adición y sustracción son exactamente las mismas que para los enteros sin signo. Así ADD
y SUB
se pueden usar con enteros con o sin signo. 002C + FFFF = 002B
44 - 1 = 43
Hay un carry generado, pero no es parte de la respuesta. Hay dos instrucciones diferentes para multiplicar y dividir. Primero para multiplicar use la instrucción MUL o IMUL. La instrucción MUL
se emplea para multiplicar números sin signo e IMUL
se usa para multiplicar enteros con signo.
Las reglas para la multiplicación son diferentes para números en complemento a dos con signo o sin signo. Considere la multiplicación del byte FF
con sí mismo dando como resultado una palabra. Usando una multiplicación sin signo es 255
veces 255
o 65025
(o FE01
en hex). Usando la multiplicaci´on con signo es −1
veces −1
o 0001
en hex.
ARITMÉTICA DE PRECISIÓN EXTENDIDA
El lenguaje ensamblador también suministra instrucciones que le permitan a uno hacer operaciones de suma y resta de números más grandes que palabras dobles.
Las instrucciones ADD
y SUB
modifican la bandera de carry si se ha generado un carry o un préstamo respectivamente. Esta información almacenada en la bandera de carry se puede usar para sumar o restar números grandes dividiendo la operación en piezas pequeñas de palabras dobles o menores.
Las instrucciones ADC
y SBB
usan esta información en la bandera de carry.
La instrucción ADC
hace la siguiente operación: operando1 = operando1 + bandera de carry + operando2
La instrucción SBB
realiza: operando1 = operando1 - bandera de flag - operando2
Considere la suma de enteros de 64 bits en EDX:EAX
y EBX:ECX
. El siguiente código podía almacenar la suma en EDX:EAX
1 add eax, ecx;
suma los 32-bits inferiores
2 adc edx, ebx;
suma los 32-bits superiores y el carry
La resta es muy similar. El siguiente código resta EBX:ECX
de EDX:EAX
1 sub eax, ecx;
resta los 32-bits inferiores
2 sbb edx, ebx;
resta los 32-bits superiores y el préstamo
Para números realmente grandes, se puede usar un bucle Para el bucle suma sería conveniente usar la instrucción ADC
para cada iteración (en todas menos la primera). Esto se puede hacer usando la instrucción CLC
(CLear Carry) antes que comienze el bucle para iniciar la bandera de carry a cero. Si la bandera de carry es cero no hay diferencia entre ADD y ADC. La misma idea se puede usar también para la resta.