Ver Mensaje Individual
  #1  
Antiguo 04-01-2021
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 11
aguml Va por buen camino
Revertir números mágicos matemáticamente

Buenas, he visto que los compiladores pueden optimizar las divisiones con constantes, por ejemplo, si divides entre 9 al optimizar se vería algo así:
Código PHP:
mov eax38e38e38
mul esi
mov eax
,edx
shr eax
,
La cosa es invertir eso y que cuando vea ese código pueda obtener el divisor.
He encontrado informacion en inglés y con un nivel de matemáticas que no comprendo y que el inglés no me ayuda porque no sé mucho.
Hasta ahora hago algo como:
(2^(32+s))/M=D
D es divisor
s es el valor de desplazamiento lógico
M es el número mágico .
Esto funciona pero no para todos, por ejemplo con el 62, 63, 70...
Dónde esa formula no sirve y el compilador no hace lo mismo y hace algo así por ejemplo para el 63:
Código PHP:
mov eax,41041041
mul esi
sub esi
,edx
shr esi
,1
add esi
edx
shr esi
,
Como ven enreda bastante más y no sé a que fórmula equivale ni como decidir cuándo debo usar una u otra.
¿Alguien que entienda y pueda ayudarme?

Última edición por aguml fecha: 04-01-2021 a las 22:34:15.
Responder Con Cita