Multiplication ASM - ASM - Programmation
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.
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...
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 '*' ?
Marsh Posté le 10-03-2008 à 15:58:16
SkippyleGrandGourou a écrit : |
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.
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.
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.
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 :
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.