IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Exemple concret de LEA


Sujet :

x86 32-bits / 64-bits Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut Exemple concret de LEA
    Bonjour,

    j'ai beaucoup de mal avec l'instruction LEA. J'ai bien lu les tutoriels mais j'ai du mal à visualiser ce que ça fait. Ca copie l'adresse de la source dans l'adresse de la destinations ?!?!

    Quelqu'un aurait-il un exemple ?

    Merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 495
    Par défaut
    LEA = Load Effective Adress. Ça charge dans le registre concerné l'adresse de ce que tu pointes plutôt que son contenu.

    Généralement, c'est la même chose qu'un « MOV offset », mais le mnémonique existe parce que l'adresse en question peut être calculée de manière indirecte en utilisant les modes d'adressage idoines.

    Sur 6809, à titre d'anecdote, c'était pratique car l'ALU de ce micro-processeur étaient intrinsèquement 8 bits, et que les opérations arithmétiques telles que ADD ou SUB l'étaient aussi, par conséquent. Par contre, on pouvait utiliser tous les registres 16 bits tels que X, Y ou les pointeurs de pile U et S comme index en mémoire, à laquelle pouvaient venir s'ajouter un offset fixe de différents formats (5,8 ou 16 bits), ou variable sous la forme d'un des accumulateurs 8 bits (A ou B). Ainsi, en faisant LEAX 1,X, on chargeait dans X « l'adresse référencée par X + 1 », ce qui faisait qu'en fin de compte, on pouvait faire des additions ou soustractions sur 16 bits là où le micro-processeur n'était censé les faire que sur 8.

  3. #3
    Membre expérimenté

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Par défaut
    Le gros intérêt de lea est de faire des calculs "complexes" sur les Lp.
    est impossible mais pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lea eax D$ebx+ecx*4+edx
    - ecx contient l'x recherché dans un tableau (x, y)

    - ebx contient l'adresse de base d'une table (le LP sur l'adresse mémoire de base de celle-ci)

    - edx contient ton offset de déplacement (la deuxième dimension de ton tableau (x, y) -> si y = 256 DWORD -> y*256*4)

    *2 *4 ou *8 selon que tu déplaces dans ta table par WORD DWORD QWORD

    eax = Lp sur y*256*4 + x*4

    Tu peux suivre au débug, c'est plus simple.

    est la version table (au lieu de tableau du précédent exemple)

    Un autre exemple de multiplication :
    eax = eax*8+eax -> eax*9


    Pour résumer :

    Cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lea eax D$Table+ ebx*4 + edx + 12
    Est équivalente à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mov eax ebx
    shl eax 2
    add eax Table
    add eax edx
    add eax 12

  4. #4
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Donc, si j'ai bien compris

    LEA ax, maVariable

    Ca charge en AX, l'adresse relative (offset) de maVariable

    Soit en nasm : mov ax, maVariable.

    Donc, là je vois franchement pas l'intérêt d'avoir une instruction pour ça.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 495
    Par défaut
    Citation Envoyé par bubulemaster Voir le message
    Donc, là je vois franchement pas l'intérêt d'avoir une instruction pour ça.
    Non, non, non. Dans "MOV eax,MaVariable", MaVariable est un symbole qui est connu à la compilation. L'assembleur ne fait donc pas le distingo entre une adresse en particulier et une valeur numérique littérale d'une manière générale.

    LEA est une instruction qui va te permettre d'obtenir le résultat des calculs mis en oeuvre par le micro-processeur au niveau des modes d'adressage.

    Ensuite, c'est une question de point de vue : MOV n'est pas une instruction, mais plusieurs : chaque variante correspond à un code-opération distinct. Sur certains autres micro-processeurs (surtout sur 8 bits), il y a des mnémoniques distincts pour les opérations d'écriture et de lecture en mémoire (par exemple, LDX et STX, pour Load X et Store X). C'est rigoureusement la même chose. On aurait pu toutes les appeler MOV et les distinguer par la syntaxe de leurs opérandes. Il n'en resterait pas moins qu'au niveau de la circuiterie interne de ton CPU, il s'agirait de mécanismes séparés.

    Enfin, LEA est un mnémonique - et une notion - que l'on retrouve sur pratiquement tous les assembleurs. MOV offset, à ma connaissance, je ne l'ai rencontré que sur x86.

  6. #6
    Membre expérimenté

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Par défaut
    C'est en l'utilisant que tu ton "mal" avec disparaîtra.

    Ce que tu dis, "pourrait" être compréhensible dans une première et rapide approche en 16 bits mais la portée de lea est beaucoup plus importante que tu ne le présumes :
    si effectivement, mettre dans un registre une adresse ou un offset, n'est pas une fin en soit et que mov permet de le faire tout à fait correctement , il faut souligner, comme cela à été fait, que lea travaille sur les déplacements, au sens Lp, de manière plus efficace que mov et permet plusieurs opérations totalement impossibles avec les seuls mov.

    De plus, dans un source, la lisibilité étant le nerf de la guerre, séparer gestion des contenus et gestion des contenants est une excellente démarche : mov et lea permettent de le faire simplement.

    Maintenant, il faudrait que tu poses un exemple pratique où l'utilisation de lea te pose un réel problème. Si tu ne rencontres pas ce cas, ne te prends pas la tête, passes à la suite.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 29/03/2009, 16h24
  2. Réponses: 49
    Dernier message: 24/02/2009, 11h17
  3. Exemple concret de jointures
    Par Lenezir dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/02/2008, 16h56
  4. Réponses: 22
    Dernier message: 03/07/2006, 22h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo