Wenn die Ein-Operanden-Form imul
ein 32-Bit-Argument übergeben wird (wie in Ihrem Fall mit EDX
) es effektiv bedeutet, EAX * EDX
, wobei sowohl EAX
als auch EDX
32-Bit-Register sind.
Das Produkt aus zwei 32-Bit-Werten passt nicht unbedingt in 32 Bit: Das vollständige Multiplikationsergebnis kann bis zu 64 Bit dauern. Die hohen 32 Bits der Antwort werden in das Register EDX
und die unteren 32 Bits in das Register EAX
geschrieben; Dies wird mit der Notation EDX:EAX
dargestellt.
Wenn Sie nur die unteren 32 Bits des Ergebnisses wollen, verwenden Sie die 2-Operanden-Form imul
; Es läuft schneller und hat keine impliziten Operanden (Sie können also die am besten geeigneten Register verwenden).
imul ecx, esi
tut ecx *= esi
wie Sie erwarten würden, ohne EAX
oder EDX
zu berühren. Es ist wie C, wo unsigned x=...;
x *= y;
die gleiche Breite für das Ergebnis wie die Eingänge hat.
imul
hat auch eine sofortige Form: tut ecx = ebx * 1234
. Viele Assembler akzeptieren imul ecx, 1234
als short-hand für imul ecx, ecx, 1234
.
Diese 32x32 => 32-Bit-Formen der imul
Arbeit korrekt mit oder ohne Vorzeichen; die Ergebnisse der Einoperanden mul
und imul
unterscheiden sich nur in der oberen Hälfte (in EDX
), nicht in der unteren Hälfte EAX
.
Siehe Intel's instruction reference manual entry for imul
.
Was passiert, wenn das Register "imul" "eax" ist? Macht es immer noch das gleiche? Was ist, wenn Sie etwas anderes als 'eax' oder' edx' geben, wie zum Beispiel 'eax'? –
Es gibt viele Formen der Imul-Anweisung. Die Form, die ein einzelnes 32-Bit-Argument (Speicher oder Register) verwendet, gibt immer das Ergebnis im EDX: EAX-Paar zurück. –