Assembleur - Multiplication par une constante

En assembleur vous pouvez effectuer une multiplication en utilisant les instructions mul (nombres non signés) et imul.
On l'utilise ainsi:
mul nom_registre

Ensuite en interne, le processeur multiplie le contenu de eax ou ax ou al (selon la taille du registre donné en paramètre) puis stocke le résultat dans eax ou ax pour la partie "poids faible" du résultat et dans edx ou dx pour la partie "poids fort" du résultat, si le registre passé en paramètre de mul est supérieur à un octet.

Utiliser mul est un peu lourd car il faut déplacer la valeur multipliée dans eax, la valeur à multiplier dans un autre registre et le registre de résultat sera obligatoirement eax, ce qui écrase la valeur qu'il possédait.

Toutefois, si vous désirez juste multiplier un registre par une constante et mettre le résultat dans le registre de votre choix, vous pouvez utiliser un raccourci avec l'instruction "lea" (load effective address). Cette instruction sert à récupérer l'adresse d'une donnée en mémoire.
lea registre_destination, [adresse_mémoire] ; place adresse_memoire dans registre_destination

Le gros avantage est que, en lieu et place de l'adresse mémoire, vous pouvez mettre une multiplication ou une addition d'un registre par une constante.

Imaginons donc que vous vouliez multiplier ecx par 7 et mettre le résultat dans ebx, la commande serait la suivante:
lea ebx, [ecx * 7]


Voilà donc pour le raccourci bien pratique. Malheureusement vous ne pouvez pas multiplier deux registres ensemble par ce raccourci.
Publié par kilian - Dernière mise à jour le 13 novembre 2009 à 13:27 par marlalapocket
Ce document intitulé « Assembleur - Multiplication par une constante » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Suggestions
  •  Assembleur - Multiplication par une constante
  •  Cours assembleur 8086 (Résolu) » Meilleure réponse: Salut, C'est le meilleur cours d'assembleur que je connaisse: http://drpaulcarter.com/pcasm/pcasm-book-french-pdf.zip
  •  Programmer en assembleur » Meilleure réponse: http://www.commentcamarche.net/contents/asm/assembleur.php3 http://benoit-m.developpez.com/assembleur/tutoriel/ http://asm.developpez.com/faq/ --> a voir en premier
  •  Comment effectuer une multiplication sous assembleur » Bonjour, J'ai un projet en traitement numerique de signal et je n'arrive pas a faire une multiplication sous assembleur car en utilisant l'instruction Mul le resultat est dans 16bits or j veux le renvoyer sur le port B qui lui est 8 bits donc je...
  •  Plusieur constantes pour un choix multiple? » Salut tout le monde, je suis étudiant en IUT, et je dois faire un programe, mais je voudrais savoir si c'est possible d'associer plusieur constantes pour un choix multiple: pour le moment, j'ai fais ça, mais ça n'est pa bon: switch(a) { case...
  •  Assembleur » Articles : Les prérequis nécessaires Le langage assembleur est très proche du langage machine (c'est-à-dire le langage qu'utilise l'ordinateur : des informations en binaire, soit des 0 et des 1). Il dépend donc fortement du type de processeur. Ainsi il...
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?
Exercice assembleur x86 occurence d'un caractère
Exercice assembleur x86 inversion de chaîne