Section courante

A propos

Section administrative du site

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

Taille Base Multiplicateur Résultat
Octet AL Opérande AX
Mot AX Opérande DX:AX
Double mot EAX Opérande EDX:EAX

Remarque

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
         destdest x src
         SI temp = dest ALORS
            CF ← 1
            OF ← 1
         SINON
            CF ← 0
            OF ← 0
         FIN SI
      SINON
         temp ← dest x src
         destdest 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 :

  1. MUL CX

Voici un exemple en Turbo Pascal montrant une utilisation de l'instruction MUL :

  1. Program AsmMul;
  2.  
  3. Var a,b,c,c_:Integer;
  4.  
  5. Function Mul(X,Y:Integer):LongInt;Assembler;ASM
  6.  MOV AX,X
  7.  MUL Y
  8. END;
  9.  
  10. BEGIN
  11.  a := 1;
  12.  b := 2;
  13.  c := 3;
  14.  c_ := -3;
  15.  WriteLn('0 * 0 : ',Mul(0,0));
  16.  WriteLn('0 * 1 : ',Mul(0,1));
  17.  WriteLn('1 * 1 : ',Mul(1,1));
  18.  WriteLn('1 * 2 : ',Mul(1,2));
  19.  WriteLn('a * b : ',Mul(a,b));
  20.  WriteLn('a * b * c : ',Mul(Mul(a,b),c));
  21.  WriteLn('a * b * c_ : ',Integer(Mul(Mul(a,b),c_)));
  22.  WriteLn('c * c_ : ',Integer(Mul(c,c_)));
  23.  WriteLn('a * b * 20 : ',Mul(Mul(a,b),20));
  24. END.

on obtiendra le résultat suivant :

0 * 0 : 0
0 * 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.

Dernière mise à jour : Vendredi, le 5 septembre 2014