2010-09-29 21 views
10

Estoy usando un depurador en tiempo de ejecución.imul assembly instruction - one operand?

EAX: 0000 0023 EDX: 5555 5556

imul edx 

EAX: AAAA AAC2 EDX: 0000 000b

estoy totalmente confundido, y no puede averiguar cómo esto se multiplican está trabajando. ¿Que esta pasando aqui? Me he dado cuenta en una situación similar question here que imul ebx ; result in EDX:EAX No entiendo la EDX: EAX notación sin embargo:/

Respuesta

21

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 EAXEDX 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 EAXEDX. 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.

+0

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? –

+2

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. –