Assembleur - Multiplication par une constante

Décembre 2016

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.

A voir également :

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.