|
Assembleur 80x86
|
IMUL
|
|
INTEL 8088+
|
Multiplication entière
|
Syntaxe
|
IMUL Opérande
|
INTEL 8088+
|
|
IMUL dest, src
|
INTEL 80286+
|
|
IMUL dest, src, imm
|
INTEL 80386+
|
Description
Cette instruction permet d'effectuer une multiplication signée (nombre entier).
Le multiplicateur est implicite; il est ajuster en fonction de la taille
de la base. Le produit est toujours plus grand que le multiplicateur. Le
type de multiplication détermine quel registre l'instruction
utilisera:
| Octet |
AL |
Opérande |
AX |
| Mot |
AX |
Opérande |
DX:AX |
| Double mot |
EAX |
Opérande |
EDX:EAX |
Algorithme
SI Nombre d'opérande = 1 ALORS
SI Taille de l'opérande en bits = 8 ALORS
AX ← AL x Opérande
SI (AH = 00h) OU (AH = FFh) ALORS
CF ← 0
OF ← 0
SINON
CF ← 1
OF ← 1
FIN SI
SINON SI Taille de l'opérande en bits = 16 ALORS
DX:AX ← AX x Opérande
SI (DX = 0000h) OU (DX = FFFFh) ALORS
CF ← 0
OF ← 0
SINON
CF ← 1
OF ← 1
FIN SI
SINON
EDX:EAX ← EAX x Opérande
SI ((EDX = 00000000h) OU (EDX = FFFFFFFFh)) ALORS
CF ← 0
OF ← 0
SINON
CF ← 1
OF ← 1
FIN SI
FIN SI
SINON SI Nombre d'opérande = 2 ALORS
temp ← dest x src
dest ← dest x src
SI temp = dest ALORS
CF ← 1
OF ← 1
SINON
CF ← 0
OF ← 0
FIN SI
SINON
temp ← dest x src
dest ← dest x src
SI temp = dest ALORS
CF ← 1
OF ← 1
SINON
CF ← 0
OF ← 0
FIN SI
FIN SI
FIN SI
|
Mnémonique
| IMUL reg/mem8 |
F6h /5 |
Multiplie le contenu du registre AL avec une opérande mémoire ou registre de 8 bits et met le résultat entier dans le registre AX. |
| IMUL reg/mem16 |
F7h /5 |
Multiplie le contenu du registre AX avec une opérande mémoire ou registre de 16 bits et met le résultat entier dans le registre DX:AX. |
| IMUL reg/mem32 |
F7h /5 |
Multiplie le contenu du registre EAX avec une opérande mémoire ou registre de 32 bits et met le résultat entier dans le registre EDX:EAX. |
| IMUL reg/mem64 |
F7h /5 |
Multiplie le contenu du registre RAX avec une opérande mémoire ou registre de 64 bits et met le résultat entier dans le registre RDX:RAX. |
| IMUL reg16, reg/mem16 |
0Fh AFh /r |
Multiplie le contenu d'un registre de destination 16 bits avec une opérande mémoire ou registre de 16 bits et met le résultat entier dans le registre de destination 16 bits. |
| IMUL reg32, reg/mem32 |
0Fh AFh /r |
Multiplie le contenu d'un registre de destination 32 bits avec une opérande mémoire ou registre de 32 bits et met le résultat entier dans le registre de destination 32 bits. |
| IMUL reg64, reg/mem64 |
0Fh AFh /r |
Multiplie le contenu d'un registre de destination 64 bits avec une opérande mémoire ou registre de 64 bits et met le résultat entier dans le registre de destination 64 bits. |
| IMUL reg16, reg/mem16, imm8 |
6Bh /r ib |
Multiplie le contenu d'une opérande mémoire ou registre de 16 bits par une valeur entière immédiate de 8 bits et met le résultat entier dans le registre 16 bits. |
| IMUL reg32, reg/mem32, imm8 |
6Bh /r ib |
Multiplie le contenu d'une opérande mémoire ou registre de 32 bits par une valeur entière immédiate de 8 bits et met le résultat entier dans le registre 32 bits. |
| IMUL reg64, reg/mem64, imm8 |
6Bh /r ib |
Multiplie le contenu d'une opérande mémoire ou registre de 64 bits par une valeur entière immédiate de 8 bits et met le résultat entier dans le registre 64 bits. |
| IMUL reg16, reg/mem16,imm16 |
69h /r iw |
Multiplie le contenu d'une opérande mémoire ou registre de 16 bits par une valeur entière immédiate de 16 bits et met le résultat entier dans le registre 16 bits. |
| IMUL reg32, reg/mem32,imm32 |
69h /r id |
Multiplie le contenu d'une opérande mémoire ou registre de 32 bits par une valeur entière immédiate de 32 bits et met le résultat entier dans le registre 32 bits. |
| IMUL reg64, reg/mem64,imm32 |
69h /r id |
Multiplie le contenu d'une opérande mémoire ou registre de 64 bits par une valeur entière immédiate de 32 bits et met le résultat entier dans le registre 64 bits. |
Exceptions
| #AC(Vérifie l'alignement) |
|
X |
X |
Un désalignement de la référence mémoire est effectué quand une vérification d'alignement est activé |
| #GP(Protection général) |
X |
X |
X |
Une adresse mémoire dépasse la limite du segment de données ou n'est pas canonique |
| |
|
X |
Un segment de données nulle est utilisé comme référence mémoire |
| #PF(Faute de page) |
|
X |
X |
Une faute de page résultat de l'exécution de l'instruction |
| #SS(Pile non-canonique) |
X |
X |
X |
Une adresse mémoire dépasse la limite du segment de pile ou n'est pas canonique |
Voir également
Instruction assembleur 80x86 - Instruction IDIV
Instruction assembleur 80x86 - Instruction MUL
Références
Le livre d'Or PC, Martin Althaus, 1992, ISBN: 2-7361-0934-1, page 812
Assembleur Facile, Philippe Mercier, 1990, ISBN: 2-501-01176-7, page 405
AMD64 Architecture Programmer's Manual Volume 3: General-Purpose and System Instructions, Edition Advanced Micro Devices, Revision 3.14, September 2007, Publication No. 24594, page 115.
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M, Edition Intel, Mars 2010, Publication No. 253666-034US, page 563 à 567.
|