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

Assembleur Discussion :

[8086] Signification de l'instruction LEA


Sujet :

Assembleur

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    541
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 541
    Points : 124
    Points
    124
    Par défaut [8086] Signification de l'instruction LEA
    Bonjour !

    je voudrais savoir à quoi peuvent servir ces instructions
    Merci d'avance !!

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    je voudrais savoir à quoi peut servir ces instructions

    LEA AX,[BX] [SI]
    Il n'y a ici qu'une seule instruction : LEA (AX, BX et SI sont des opérandes).

    LEA signifie : Load Effective Address.

    Sachant que l'instruction peut s'écrire :

    LEA calcule l'offset de la source (BX + SI) et le place dans la destination (AX).

    Cela revient à dire : AX = BX + SI

    Un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mov BX, 10 ; BX = 10
    mov SI, 20 ; SI = 20
    LEA AX, [BX] [SI]; AX = 30

  3. #3
    Membre averti Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Points : 390
    Points
    390
    Par défaut
    Bonsoir,

    L'instruction LEA est très simple, mais souvent mal comprise, peut-être à cause du fait qu'elle ne fait rien d'exceptionnel alors qu'on attend quelque chose de magique.
    Oublions LEA pour l'instant. Tout part du mode d'adressage. De nombreuses instructions vont chercher une donnée en mémoire, c'est le mode mem8 ... mem64 de la doc. MOV, ADD, XOR, et bien d'autres. Prenons MOV, les autres ajoutant simplement une opération au passage. On aura donc à faire:'data' est une adresse en mémoire, et c'est le contenu de cette adresse qui sera transféré dans 'cible'. 'data' sera une expression assez complexe, mais très bien pensée pour pouvoir parcourir des zones, tableaux, etc. Cette expression est de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    REGBASE + REGINDEX x [1, 2, 4 ou 8] + OFFSET (valeur immédiate sur 8, 16 ou 32 bits)
    REGBASE et REGINDEX peuvent pratiquement être n'importe quel registre général. Les expressions incomplètes sont autorisées, et même fréquentes. Les noms ne doivent pas tromper, par exemple OFFSET pourra être une adresse de base codée en dur (donnée immédiate) et REGBASE un déplacement par rapport à cette adresse.
    Le programmeur saisit son expression dans la syntaxe de son assembleur / compilateur. Il lui indique ainsi quels registres sont REGBASE et REGINDEX, la valeur du multiplicateur, la taille et la valeur de OFFSET. L'assembleur / compilateur va ensuite mouliner tout ça et en intégrer une grande partie dans l'opcode.
    A l'exécution, le calcul de l'adresse de la donnée est pratiquement câblé dans le processeur, en tous cas fait très rapidement.
    Sans ce système, que ferait le programmeur ? Ben, quelques lignes de code de plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MOV UN_REG_LIBRE, REGINDEX
    SHL UN_REG_LIBRE, (0, 1, 2 ou 3 bits)
    ADD UN_REG_LIBRE, REGBASE
    ADD UN_REG_LIBRE, OFFSET
    MOV 'cible', [UN_REG_LIBRE]
    Revenons à LEA. LEA fait comme MOV, mais simplement ne va pas chercher la donnée, et transfère son adresse dans la cible. Ainsi:pourrait être écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MOV UN_REG_LIBRE, REGINDEX
    SHL UN_REG_LIBRE, (0, 1, 2 ou 3 bits)
    ADD UN_REG_LIBRE, REGBASE
    ADD UN_REG_LIBRE, OFFSET
    MOV 'cible', UN_REG_LIBRE
    ou même (version2):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MOV 'cible', REGINDEX
    SHL 'cible', (0, 1, 2 ou 3 bits)
    ADD 'cible', REGBASE
    ADD 'cible', OFFSET
    Pourquoi LEA pose-t-elle des problèmes de compréhension ? Peut-être simplement parce que quand on débute on n'a pas à sa disposition d'exemple "pour de vrai" d'expression à peu près complète de 'data'. A partir de là, on ne voit pas immédiatement l'intérêt de LEA, surtout remplacée par la version2. Par exemplec'estet rien d'autre.

    Il y a peut-être un autre point qui trouble le débutant. Il faut pour parler de mode d'adressage au moins parcourir une zone. Une variable varréservée par une directive db ou autre est une adresse en valeur immédiate accessible par ADDRESS var par exemple. C'est parfois troublant, parce que cette adresse sera peut-être résolue par l'assembleur, le linker et le chargeur du programme, mais elle sera manipulée comme une valeur immédiate même si sa valeur numérique n'est pas "connue" du programmeur. Ça vaut le cout d'y réfléchir cinq minutes. Et LEA ne peut rien sur ce coup-là, trop de débutants pensent que ça va leur donner par magie l'adresse d'une variable. Si vous êtes en assembleur inline sur du C, l'adresse de var est &var, une constante (de valeur inconnue !!).

    Utilisation normale de LEA: vous parcourez des structures de données à partir de deux registres et de l'expression classique de 'data'. A un moment, vous devez utiliser des instructions de type chaîne et vous utiliserez LEA pour initialiser les registres d'index ?SI et ?DI.

    Utilisation marrante de LEA: vous utilisez son aspect "calcul rapide de polynome". Ainsi:
    LEA eax, [ecx + ecx*4]
    vous donnera une multplication par 5. Un petit hack, utilisé par tout le monde y compris les compilateurs C/C++ corrects.

  4. #4
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 59
    Points : 47
    Points
    47
    Par défaut
    Bonjour,
    Cette instruction charge le déplacement (offset) d'une zone mémoire dans un registre, aucun indicateur n'est affecté.
    La seule forme possible de cette instruction est :
    (faut pas utiliser de registres sur 8bits)
    Elle permet par exemple de mettre l'adresse d'une variable dans un registre.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEA si, toto ; On place l'adresse mémoire de la variable toto dans si.
    Cet exemple équivaut à :
    Dans ton cas:
    LEA calcule l'offset de la source (BX + SI) et le place dans la destination (AX).
    c'est à dire : AX = BX + SI

Discussions similaires

  1. Signification d'une instruction
    Par eemii dans le forum C#
    Réponses: 5
    Dernier message: 13/04/2010, 00h16
  2. Signification de l'instruction extract ($_POST) ;
    Par amazircool dans le forum Langage
    Réponses: 2
    Dernier message: 15/04/2008, 18h31
  3. signification d'une instruction
    Par dubus dans le forum Langage
    Réponses: 3
    Dernier message: 03/01/2008, 17h25
  4. Signification d'une instruction
    Par Pilloutou dans le forum C++
    Réponses: 8
    Dernier message: 20/09/2007, 08h54
  5. Signification d'une instruction
    Par pips01 dans le forum Assembleur
    Réponses: 1
    Dernier message: 02/05/2006, 20h35

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