Cuando la forma de un operando de imul
se pasa un argumento de 32 bits (como en su caso con EDX
) que significa efectivamente EAX * EDX
donde tanto EAX
EDX
y son 32 registros bits.
El producto de dos 32 valores de bits no se ajusta necesariamente en 32 bits: el resultado se multiplica completa puede tardar hasta 64 bits. Los altos 32 bits de la respuesta se escriben en el registro EDX
y los bajos 32 bits al registro de EAX
; esto se representa con la notación EDX:EAX
.
Si sólo desea los bajos 32 bits del resultado, utilice el formulario 2-operando de imul
; funciona más rápido y no tiene ningún operando implícito (para que pueda usar los registros que sean más convenientes).
imul ecx, esi
hace ecx *= esi
como era de esperar, sin tocar o EAX
EDX
. Es como C donde unsigned x=...;
x *= y;
tiene la misma anchura para el resultado como las entradas.
imul
también tiene una forma inmediata: imul ecx, ebx, 1234
hace ecx = ebx * 1234
. Muchos ensambladores aceptarán imul ecx, 1234
como short-hand para imul ecx, ecx, 1234
.
Estas formas 32x32 => 32 bits de imul
funciona correctamente con o sin signo; los resultados de un solo operando mul
y imul
solo difieren en la mitad superior (en EDX
), no en la mitad baja EAX
de salida.
Ver Intel's instruction reference manual entry for imul
.
Lo que ocurre cuando el registro dado a '' imul' es eax'? ¿Todavía hace lo mismo? ¿Qué pasa si le das algo que no sea 'eax' o' edx', como 'eax', por ejemplo? –
Hay muchas formas de instrucción imul. La forma que toma un solo argumento de 32 bits (memoria o registro) siempre devuelve el resultado en el par EDX: EAX. –