instrução de montagem imul-um operando?
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.
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
.