Como alguien nuevo en el ensamblaje, uso gcc para la ingeniería inversa. Pero ahora me encontré con un problema de alguna manera divertido: trato de multiplicar dos enteros de 64 bits por x86-64. El código C tiene el siguiente aspecto:
unsigned long long
val(unsigned long long a, unsigned long long b){
return a*b;
}
y compilado con gcc:
val:
movq %rdi, %rax
imulq %rsi, %rax
ret
Puede ser contrario a la intuición usar la multiplicación con signo para enteros sin signo, pero funciona para C.
Sin embargo, me gustaría comprobar si hay desbordamientos en la multiplicación. Ahora, el indicador de desbordamiento se establece si el resultado es mayor que 2^63-1
(Supongo que porque después de todo es una multiplicación con signos). Pero para 64 bits sin firmar, esto seguiría siendo correcto siempre que el resultado no sea mayor que 2^64-1
.
¿Cuál es la forma correcta de hacer la multiplicación (en conjunto) en este caso?
¿Podría usted, tal vez, probar, después del hecho, para ver si el resultado es “(sin firmar…) más pequeño” de lo que solía ser? Solo adivinando…
–Mike Robinson
7 julio 2016 a las 19:25
O simplemente podrías usar
mul
que establece CF y OF si el resultado de la multiplicación sin signo desborda el tamaño del operando.– FEO
7 julio 2016 a las 19:27
@ead: Porque
imul
hace lo mismo paran*n -> n
-multiplicaciones de bits. También,mul
sólo tiene una forma de un operando (utiliza[r/e]ax
implícitamente) y siempre golpeando[r/e]ax
y[r/e]dx
. Es simplemente menos flexible.– FEO
7 julio 2016 a las 19:38
En C, la multiplicación sin signo no se desborda. Si el resultado está fuera del rango del tipo sin signo, se ajusta descartando los bits de orden superior. Si desea verificar si fue necesario algún ajuste de este tipo, entonces está haciendo algo diferente a la multiplicación sin signo C. (Absolutamente no pretendo implicar que haya algo malo en eso).
–Keith Thompson
7 julio 2016 a las 20:15
@KeithThompson: “desbordamiento” se usa aquí para significar “envolver”, como si la mitad alta descartada no fuera cero. Es una de esas palabras que tiene al menos un significado técnico, pero se usa para otras cosas relacionadas que tienen diferentes nombres técnicos. (por ejemplo, llevar a cabo una adición sin firmar)
– Peter Cordes
7 julio 2016 a las 20:21