2010-09-29 10 views
10

Używam debugera wykonawczego.instrukcja montażu imul - jeden operand?

EAX: 0000 0023 EDX: 5555 5556

imul edx 

EAX: aaaa aac2 EDX: 0000 000B

jestem kompletnie zdezorientowany i nie może dowiedzieć się, jak to wielokrotnie działa. Co tu się dzieje? Zauważyłem w podobny question here tym imul ebx ; result in EDX:EAX ja nie rozumiem EDX: EAX notacji jednak:/

Odpowiedz

21

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.

+0

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

+2

Istnieje wiele form instrukcji imul. Formularz, który przyjmuje pojedynczy 32-bitowy argument (pamięć lub rejestr) zawsze zwraca wynik w parze EDX: EAX. –