Pour moi, il semble juste comme un MOV funky. Quel est son but et quand dois-je utiliser il ?
Réponses
Trop de publicités?Comme d'autres l'ont souligné, LEA (charge efficace de l'adresse), est souvent utilisé comme un "truc" pour faire certains calculs, mais ce n'est pas son but premier. Le jeu d'instructions x86 a été conçu pour soutenir les langages de haut niveau comme Pascal et C, où les tableaux—en particulier des tableaux d'entiers ou de petites structures sont courants. Considérons, par exemple, une structure (struct) représentant (x, y) coordonnées:
struct Point
{
int xcoord;
int ycoord;
};
Maintenant, imaginez un énoncé comme:
int y = points[i].ycoord;
où points[]
est un tableau d' Point
. En supposant que la base du tableau est déjà en EBX
, et la variable i
est EAX
, et xcoord
et ycoord
sont chaque 32 bits (donc ycoord
est à l'offset de 4 octets de la structure), cette déclaration peut être compilé à:
MOV EDX, [EBX + 8*EAX + 4] ; right side is "effective address"
qui va atterrir y
en EDX
. Le facteur d'échelle de 8 est parce que chaque Point
est de 8 octets. Considérons maintenant la même expression utilisée avec l'option "adresse de l'opérateur &:
int *p = &points[i].ycoord;
Dans ce cas, vous ne voulez pas la valeur de ycoord
, mais son adresse. C'est là que LEA
(charge efficace de l'adresse). Au lieu d'un MOV
, le compilateur peut générer
LEA ESI, [EBX + 8*EAX + 4]
qui va charger l'adresse en ESI
.
De la "Zen de l'Assemblée" par Abrash:
LEA, la seule instruction qui effectue la mémoire d'adressage calculs mais n'a pas d'adresse mémoire. LÉA accepte une norme d'adressage de mémoire opérande, mais ne fait rien de plus que de stocker la valeur calculée de la mémoire de décalage spécifiée dans le registre, qui peut être n'importe quel registre.
Ce qui ne fait que nous donner? Deux choses qui ajoutent de ne pas fournir:
- la capacité à effectuer une addition avec deux ou trois opérandes, et
- la capacité de stocker le résultat dans tout registre; pas seulement l'un des opérandes source.
Une autre caractéristique importante de l’instruction de LEA est qu’il ne modifie pas les codes d’État tels que le CF et ZF, tandis que l’informatique de l’adresse en instructions arithmétiques comme ajout / MUL ne. Cette caractéristique diminue le niveau de dépendance dans les instructions et donc fait place à une optimisation supplémentaire par le compilateur ou le planificateur de matériel.
Malgré toutes les explications, LEA est une opération arithmétique :
LEA Rt, [Rs1 + a Rs2 + b] => Rt = Rs1 + a Rs2 + b
C’est juste que son nom est extremelly stupide pour une Maj + opération d’ajout. La raison en était déjà expliquée dans les réponses (c.-à-d. il a été conçu pour mapper directement référence à la mémoire de niveau élevé) les plus appréciés.
``est l’abréviation de « chargement adresse effective ». Il charge l’adresse de la référence de l’emplacement de l’opérande source pour l’opérande de destination. Par exemple, vous pouvez l’utiliser pour :
pour déplacer pointeur
éléments supplémentaires (dans un tableau de 64-bit/élément) a une seule instruction. Fondamentalement, vous bénéficiez de modes d’adressage complexes pris en charge par x86 architecture pour manipuler efficacement les pointeurs.