793 votes

Ce qui ' s la fin de l’instruction de LEA ?

Pour moi, il semble juste comme un MOV funky. Quel est son but et quand dois-je utiliser il ?

925voto

I. J. Kennedy Points 7430

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;

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.

612voto

Frank Krueger Points 27508

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:

  1. la capacité à effectuer une addition avec deux ou trois opérandes, et
  2. la capacité de stocker le résultat dans tout registre; pas seulement l'un des opérandes source.

128voto

Angus Lee Points 201

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.

109voto

hdante Points 2192

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.

70voto

Mehrdad Afshari Points 204872

``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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X