Multiplication ASM

Multiplication ASM - ASM - Programmation

Marsh Posté le 09-03-2008 à 18:59:37    

Salut,
 
Je découvre l'assembleur, et une question me turlupine. Si on prend le petit bout de code suivant, qui fait une petite multiplication par 20 :

Code :
  1. mov eax,DWORD PTR [ebp-0x8] ; eax = number
  2. mov edx,eax                 ; edx = eax = number
  3. shl edx,0x2                 ; edx = edx*2^2 = 4*number
  4. add edx,eax                 ; edx = edx+eax = 5*number
  5. lea eax,[edx*4+0x0]         ; eax = 4*edx+0 = 20*number
  6. mov DWORD PTR [ebp-0x8],eax ; number = eax = 20*number


Ce que je pige pas bien, c'est que dans les arguments de lea, il semble y avoir une multiplication sans instruction... Comment c'est possible ?
 
 
PS: Me demandez pas pourquoi je fais pas un IMUL, c'est du désassemblé donc c'est g++ qui a choisi. Optimisation toussa, sans doute. ;)

Reply

Marsh Posté le 09-03-2008 à 18:59:37   

Reply

Marsh Posté le 09-03-2008 à 22:46:58    

Tu n'as jamais vu un adressage du style [eax*4+ebx+2] ? C'est valide et ça permet d'adresser facilement un tableau par exemple. LEA sert à faire un calcul de la même façon qu'on calcule une adresse mais elle stocke simplement l'adresse calculée dans le premier opérande sans y accéder. Ça permet de faire plusieurs calculs en une fois.
Comme tu le vois dans le code désassemblé si il n'y a pas de deuxième terme l'assembleur ajoute +0 parce qu'il n'y a pas moyen d'encoder autrement, du coup lea eax, [eax*2] est plus long que lea eax, [eax+eax] par exemple.


---------------
dap.developpez.com
Reply

Marsh Posté le 09-03-2008 à 23:38:59    

dap++ a écrit :

Tu n'as jamais vu un adressage du style [eax*4+ebx+2] ?

Comme indiqué, je découvre... ;)
 

dap++ a écrit :

LEA sert à faire un calcul de la même façon qu'on calcule une adresse mais elle stocke simplement l'adresse calculée dans le premier opérande sans y accéder. Ça permet de faire plusieurs calculs en une fois.

J'avais juste vu que "lea esi,10" correspondait à "mov eax,10"+"mov esi,eax" parce qu'on ne pouvait pas mettre une valeur numérique directement dans esi, par exemple. Je ne savais pas qu'on pouvait l'utiliser pour des calculs (enfin j'avais cru remarquer, d'où ma question...). Je crois que je commence à comprendre, d'autant que je viens de tomber là-dessus.
 

dap++ a écrit :

Comme tu le vois dans le code désassemblé si il n'y a pas de deuxième terme l'assembleur ajoute +0 parce qu'il n'y a pas moyen d'encoder autrement, du coup lea eax, [eax*2] est plus long que lea eax, [eax+eax] par exemple.

Je ne suis pas sûr de bien comprendre la nécessité du +0... :heink:  
 
J'ai fait une petite recherche sur l'instruction lea, je comprends mieux. Mais il y a encore un truc qui m'échappe : comment sont effectuées ces opérations, puisqu'elles ne font l'objet d'aucune instruction spécifique ? Je veux dire : comment sont interprétés les signes '+' et '*' ?

Reply

Marsh Posté le 10-03-2008 à 15:58:16    

SkippyleGrandGourou a écrit :


J'ai fait une petite recherche sur l'instruction lea, je comprends mieux. Mais il y a encore un truc qui m'échappe : comment sont effectuées ces opérations, puisqu'elles ne font l'objet d'aucune instruction spécifique ? Je veux dire : comment sont interprétés les signes '+' et '*' ?


c'est lors de la phase d'assemblage que l'argument de lea est interprété et retranscrit en son equivalent binaire. l'assembleur n'est qu'un langage qui, comme tout langage, est compilé (on dira "assemblé" pour de l'assembleur) et transformé en code binaire.

Reply

Marsh Posté le 10-03-2008 à 19:14:03    

D'accord. Je demande peut-être la lune, mais est-ce qu'il y a moyen de voir à un niveau plus élémentaire (mais de manière compréhensible quand même) la différence entre ces fonctions (lea et lsh par exemple) ? Voir les opérations binaires associées, en quelque sorte.


Message édité par SkippyleGrandGourou le 10-03-2008 à 19:15:23
Reply

Marsh Posté le 11-03-2008 à 23:35:15    

En fait je crois que les meilleures docs sur l'assembleur sont celles d'Intel et d'AMD, c'est à la fois clair et intéressant, du bon boulot. :)
 
Et donc pour répondre à ma question, lea n'a pas grand'chose à voir dans tout ça (si ce n'est qu'il permet d'utiliser ce mode d'adressage sans trop de trucs superflus), c'est le mode d'adressage qui fait tout. Voir par exemple la section 3.7.5 du manuel d'Intel. ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed