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ò: /

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top