assembly - registers - Lenguaje ensamblador usando shl para multiplicar por un número impar?
lenguaje ensamblador x86 (2)
Además de lo que Harold te ha contado, puedes utilizar la instrucción LEA
para realizar multiplicaciones también:
EAX * 2 : lea eax,[eax*2]
EAX * 3 : lea eax,[eax*2+eax]
EAX * 4 : lea eax,[eax*4]
EAX * 5 : lea eax,[eax*4+eax]
EAX * 8 : lea eax,[eax*8]
EAX * 9 : lea eax,[eax*8+eax]
Necesito multiplicar EAX por 37, sé que puedo usar shl eax,5
y shl register,2
luego agregar el registro a eax para multiplicar por 38, pero no estoy seguro de que el código se multiplique por un número impar y tengo para usar shl add y mov solamente. ¡Gracias!
Usando LEA, puede multiplicar directamente por una gran cantidad de constantes pequeñas e impares (2,4,8,3,5,9), así como agregar dos registros y mover la respuesta a un lugar diferente. Esto es asombrosamente útil. Componiéndolos, puedes multiplicar por casi cualquier constante pequeña usando una secuencia de instrucciones LEA, a menudo bastante cortas. El uso juicioso de otras instrucciones ADD, SHL y SUB (incluyendo NEG y ADD) puede acortar esas secuencias. Tales secuencias cortas de estos son casi siempre más rápidas que el uso de multiplicar, en parte porque muchas de las instrucciones están superpuestas en ejecución por los procesadores actuales:
Multiplique eax por 37:
lea ecx, [eax+8*eax] ; 9 * eax
lea eax, [ecx*4+eax] ; 37 * eax
Multiplique eax por 38:
lea ecx, [8*eax]
neg eax
lea ecx, [5*ecx]
lea eax, [ecx+2*eax]
Mejor:
lea ecx, [8*eax+eax] ; 9 * eax
lea ecx, [4*ecx] ; 36 * eax
lea eax, [eax*2+ecx] ; 38 * eax
Solo por diversión, multiplica por 103:
lea ecx, [8*eax] ; 8 * eax
lea ecx, [ecx*4] ; 32 * eax
lea ecx, [ecx*2+ecx] ; 96 * eax
lea ecx, [ecx+8*eax]; ; 104 * eax
sub ecx, eax ; 103 * eax