istruzioni di montaggio IMUL - un operando?
-
26-09-2019 - |
Domanda
Sto usando un debugger in fase di esecuzione.
EAX: 0000 0023 EDX: 5555 5556
imul edx
EAX: AAC2 aaaa EDX: 0000 000b
Sono assolutamente confuso, e non riesco a capire come questo si moltiplicano sta lavorando. Cosa sta succedendo qui? Ho notato in un simile qui che imul ebx ; result in EDX:EAX
io non capisco l'EDX: EAX notazione però: /
Soluzione
Quando viene superato un unico operando forma di imul
un argomento 32 bit (come nel suo caso con EDX
) significa efficacemente EAX * EDX
dove sia EAX
e EDX
sono registri a 32 bit.
Il prodotto di due 32 valori di bit non necessariamente adatta a 32 bit: il risultato completo moltiplicazione può richiedere fino a 64 bit. Le alte 32 bit della risposta vengono scritti al registro EDX
ei bassi 32 bit al registro EAX
; questo è rappresentato con la notazione EDX:EAX
.
Se si desidera solo il basso 32 bit del risultato, utilizzare il 2-operando forma di imul
; Corre più veloce e non ha nessun operandi impliciti (in modo da poter utilizzare qualsiasi registri sono più conveniente).
imul ecx, esi
fa ecx *= esi
come ci si aspetterebbe, senza toccare o EAX
EDX
. È come C dove unsigned x=...;
x *= y;
ha la stessa larghezza per il risultato come ingressi.
imul
ha anche una forma immediata: imul ecx, ebx, 1234
fa ecx = ebx * 1234
. Molti assemblatori accetteranno imul ecx, 1234
più breve-mano per imul ecx, ecx, 1234
.
Queste 32x32 forme => a 32 bit di lavoro imul
correttamente per con o senza segno; i risultati di un operando mul
e imul
differiscono solo nella metà superiore (in EDX
), non l'uscita a bassa metà EAX
.
inserimento manuale di istruzioni di riferimento di Intel per imul
.