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
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
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.
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 mov eax, ebx+ecx*4+edx- ecx contient l'x recherché dans un tableau (x, y)
Code : Sélectionner tout - Visualiser dans une fenêtre à part lea eax D$ebx+ecx*4+edx
- 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)
Code : Sélectionner tout - Visualiser dans une fenêtre à part lea eax D$ebx+ecx*4
Un autre exemple de multiplication :
eax = eax*8+eax -> eax*9
Code : Sélectionner tout - Visualiser dans une fenêtre à part lea eax D$eax*8+eax
Pour résumer :
Cette ligne :Est équivalente à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part lea eax D$Table+ ebx*4 + edx + 12
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
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.
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.
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.
Partager