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

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.

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é

Exemple

Voici un exemple en Turbo Pascal montrant une utilisation de cet instruction :

  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