Gdy postać jednego argumentu o imul
przepuszcza 32 bit argumentu (jak w przypadku z EDX
) Oznacza to skutecznie EAX * EDX
, gdzie oba EAX
i EDX
są rejestrami 32-bitowymi.
Iloczyn dwóch wartości 32-bitowych niekoniecznie mieści się w 32 bitach: pełny wynik mnożenia może zająć do 64 bitów. 32 bity odpowiedzi będą zapisywane do rejestru EDX
i niskich 32 bitów do rejestru EAX
; jest to oznaczone notacją EDX:EAX
.
Jeśli chcesz tylko niskie 32 bitów wyniku skorzystać z formularza 2-operandu imul
; działa szybciej i nie ma żadnych implicytnych operandów (dzięki czemu możesz używać dowolnych rejestrów).
imul ecx, esi
ma ecx *= esi
jak można się spodziewać, bez dotykania EAX
lub EDX
. To jest jak C, gdzie unsigned x=...;
x *= y;
ma taką samą szerokość dla wyniku jak wejścia.
imul
ma również formularz natychmiastowy: imul ecx, ebx, 1234
ma ecx = ebx * 1234
. Wiele asemblerów zaakceptuje imul ecx, 1234
jako skrót dla imul ecx, ecx, 1234
.
te 32x32 => 32-bitowe formy imul
pracy odpowiednio do znakiem lub bez; wyniki pojedynczego operandu mul
i imul
różnią się tylko górną połówką (w EDX
), a nie niską połówką wyjściową EAX
.
Zobacz Intel's instruction reference manual entry for imul
.
Co się dzieje, gdy rejestr podany do 'imul' to' eax'? Czy nadal robi to samo? Co jeśli podasz mu coś innego niż "eax" lub "edx", na przykład "eax"? –
Istnieje wiele form instrukcji imul. Formularz, który przyjmuje pojedynczy 32-bitowy argument (pamięć lub rejestr) zawsze zwraca wynik w parze EDX: EAX. –