Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1181 connectés 

  FORUM HardWare.fr
  Programmation
  ASM

  Multiplication ASM

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Multiplication ASM

n°1699554
SkippyleGr​andGourou
Posté le 09-03-2008 à 18:59:37  profilanswer
 

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. ;)

mood
Publicité
Posté le 09-03-2008 à 18:59:37  profilanswer
 

n°1699643
dap++
Script kiddie
Posté le 09-03-2008 à 22:46:58  profilanswer
 

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
n°1699654
SkippyleGr​andGourou
Posté le 09-03-2008 à 23:38:59  profilanswer
 

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 '*' ?

n°1699969
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 10-03-2008 à 15:58:16  profilanswer
 

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.

n°1700102
SkippyleGr​andGourou
Posté le 10-03-2008 à 19:14:03  profilanswer
 

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
n°1700772
SkippyleGr​andGourou
Posté le 11-03-2008 à 23:35:15  profilanswer
 

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. ;)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  ASM

  Multiplication ASM

 

Sujets relatifs
Plusieurs count dans une requete = multiplicationASM - hexa à ASCII
Code Asm pour réaliser un délais d'1 minutecalculer une multiplication de deux champs (mysql)
[ASM]coder un strlen en asssembleur??Programmer un system d'exploitation en C ? ou C++ ou ASM ? ou quoi ?
Afficher une image ne ASM.[ASM]erreur de compilation (debutant)
ASM Z80 Tutoriaux[Oracle ASM] Problème d'optimisation de requête suite à migration
Plus de sujets relatifs à : Multiplication ASM


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR