assembly - ¿Por qué las instrucciones de multiplicación firmada y no firmada son diferentes en x86(-64)?
x86-64 twos-complement (3)
El resultado será el mismo para las versiones de los operandos 2 y 3, excepto que las instrucciones mul e imul difieren en la forma en que establecen los indicadores CF y OF (acarreo y desbordamiento).
Piense en los dos casos: -1 * -1 versus 0xFFFFFFFF * 0xFFFFFFFF en términos de desbordamiento y obtendrá la idea.
Pensé que todo el punto del complemento de 2 era que las operaciones podían implementarse de la misma manera para números firmados y no firmados. Incluso las listas de Wikipedia específicamente se multiplican como una de las operaciones que beneficia . Entonces, ¿por qué x86 tiene instrucciones separadas para cada uno, mul
y imul
? ¿Esto sigue siendo cierto para x86-64?
La multiplicación de dos números de 16 bits produce un resultado de 32 bits. Incluso si uno de los números es "1", el procesador extenderá efectivamente el otro a 32 bits. El proceso de extender un número a una longitud de bit más larga es una de las operaciones que es diferente para los valores con signo y sin signo (la otra operación significativa donde el signo importa es la comparación de la magnitud, que también es una parte esencial de la división).
La suma y la resta son lo mismo, al igual que la mitad inferior de una multiplicación. Una multiplicación completa, sin embargo, no lo es. Ejemplo simple:
En el complemento de dos bits de 32 bits, -1 tiene la misma representación que la cantidad sin firmar 2 ** 32 - 1. Sin embargo:
-1 * -1 = +1
(2**32 - 1) * (2**32 - 1) = (2**64 - 2**33 + 1)
(Tenga en cuenta que los 32 bits bajos de ambos resultados son los mismos; a eso me refiero cuando digo que "la mitad inferior de la multiplicación" es lo mismo).