instrução de montagem imul-um operando?

Estou a usar um depurador em tempo de execução.

EAX: 0000 0023 Edx: 5555 5556

imul edx

EAX: aaaa aac2 EDX: 0000 000b

estou completamente confuso, e não consigo perceber como é que esta multiplicação está a funcionar. O que se passa aqui? Numa pergunta semelhante, vejo que não entendo a notação EDX:eax.

Author: Evan Carroll, 2010-09-29

1 answers

Quando a forma de um operando-único de imul é passado um argumento de 32 bits (como no seu caso com EDX) isso significa efectivamente EAX * EDX onde tanto EAX e EDX são 32 registos de bits.

O produto de dois valores de 32 bits não se encaixa necessariamente em 32 bits: o resultado de multiplicação completa pode levar até 64 bits. Os 32 bits altos da resposta serão escritos no registro EDX e os 32 bits baixos no registro EAX; Isto é representado com a notação EDX:EAX.


Se só quero os 32 bits baixos do resultado, use a forma 2-operando de imul; ele corre mais rápido e não tem nenhum operandos implícitos (então você pode usar os registros que são mais convenientes).

imul ecx, esi faz ecx *= esi como seria de esperar, sem tocar EAX ou EDX. É como C Onde unsigned x=...; x *= y; tem a mesma largura para o resultado que as entradas.

imul também tem uma forma imediata: imul ecx, ebx, 1234 faz ecx = ebx * 1234. Muitos montadores aceitarão imul ecx, 1234 como mão curta para imul ecx, ecx, 1234.


Estes 32x32 = > 32-bits de imul funcionam correctamente para assinado ou não assinado; os resultados de um operando mul e imul só diferem na metade superior( em EDX), não na metade baixa EAX.

Ver manual de referência da instrução Intel para imul.

 24
Author: Chris Taylor, 2018-02-27 18:06:27