Assembleur 80x86 | MUL |
---|---|
INTEL 8088+ | Multiplication |
Syntaxe
MUL Opérande |
Paramètres
Nom | Description |
---|---|
Opérande | Ce paramètre permet d'indiquer le multiplicateur. |
Description
Cette instruction permet d'effectuer une multiplication non-signée (nombre naturel). Le multiplicateur est implicite; il est ajusté 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 :
Taille | Base | Multiplicateur | Résultat |
---|---|---|---|
Octet | AL | Opérande | AX |
Mot | AX | Opérande | DX:AX |
Double mot | EAX | Opérande | EDX:EAX |
Remarque
- Si l'octet (mot) le plus significatif d'un résultat 16 bits, 32 bits ou 64 bits est zéro, les drapeaux CF et OF seront tous les deux zéros.
Algorithme
MODULE MUL(Opérande|dest,src) 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
Instruction | Opcode | Description |
---|---|---|
MUL reg/mem8 | F6h /4 | Multiple l'opérande mémoire ou registre 8 bits par le contenu du registre AL et entrepose le résultat dans le registre AX. |
MUL reg/mem16 | F7h /4 | Multiple l'opérande mémoire ou registre 16 bits par le contenu du registre AX et entrepose le résultat dans le registre DX:AX. |
MUL reg/mem32 | F7h /4 | Multiple l'opérande mémoire ou registre 32 bits par le contenu du registre EAX et entrepose le résultat dans le registre EDX:EAX. |
MUL reg/mem64 | F7h /4 | Multiple l'opérande mémoire ou registre 64 bits par le contenu du registre RAX et entrepose le résultat dans le registre RDX:RAX. |
Cycles d'horloge
Opérande | Cycle d'horloge | Taille en octets | |||
---|---|---|---|---|---|
8086 | 80286 | 80386 | 80486 | ||
reg8 | 70 à 77 | 13 | 9 à 14 | 13 à 18 | 2 |
reg16 | 118 à 133 | 21 | 9 à 14 | 13 à 26 | 2 |
reg32 | - | - | 9 à 38 | 13 à 42 | 2 à 4 |
mem8 | 76 à 83 (+ EA) | 16 | 12 à 17 | 13 à 18 | 2 à 4 |
mem16 | 124 à 139 (+ EA) | 21 | 13 à 26 | 12 à 25 | 2 à 4 |
mem32 | - | - | 12 à 21 | 13 à 42 | 2 à 4 |
Exceptions
Message | Mode réel | Virtuel 8086 | Mode protégé | Description |
---|---|---|---|---|
#SS(Pile non-canonique) | X | X | X | Une adresse mémoire dépasse la limite du segment de pile ou n'est pas canonique |
#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 | |
#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é |
Exemples
L'exemple suivant permet de faire AX fois CX et mettre le résultat du mot élevé dans le registre DX et mot bas dans le registre AX :
- MUL CX
Voici un exemple en Turbo Pascal montrant une utilisation de l'instruction MUL :
- Program AsmMul;
-
- Var a,b,c,c_:Integer;
-
- Function Mul(X,Y:Integer):LongInt;Assembler;ASM
- MOV AX,X
- MUL Y
- END;
-
- BEGIN
- a := 1;
- b := 2;
- c := 3;
- c_ := -3;
- WriteLn('0 * 0 : ',Mul(0,0));
- WriteLn('0 * 1 : ',Mul(0,1));
- WriteLn('1 * 1 : ',Mul(1,1));
- WriteLn('1 * 2 : ',Mul(1,2));
- WriteLn('a * b : ',Mul(a,b));
- WriteLn('a * b * c : ',Mul(Mul(a,b),c));
- WriteLn('a * b * c_ : ',Integer(Mul(Mul(a,b),c_)));
- WriteLn('c * c_ : ',Integer(Mul(c,c_)));
- WriteLn('a * b * 20 : ',Mul(Mul(a,b),20));
- END.
on obtiendra le résultat suivant :
0 * 0 : 00 * 1 : 0
1 * 1 : 1
1 * 2 : 2
a * b : 2
a * b * c : 6
a * b * c_ : -6
c * c_ : -9
a * b * 20 : 40
Voir également
Langage de programmation - Assembleur 80x86 - Lexique et dictionnaire d'instruction assembleur 80x86 - Instruction DIV
Langage de programmation - Assembleur 80x86 - Lexique et dictionnaire d'instruction assembleur 80x86 - Instruction IMUL
Langage de programmation - Mathématique - Multiplication russe (Multiplication par décalage de bits)
Langage de programmation - Turbo Pascal - Turbo Pascal et Assembleur - Opération Mathématique
Références
Le livre d'Or PC, Martin Althaus, 1992, ISBN: 2-7361-0934-1, page 822
Assembleur Facile, Philippe Mercier, 1990, ISBN: 2-501-01176-7, page 411 à 412
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 173.
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 824 à 826.