325 votos

¿Cuál es el propósito de la LEA a la enseñanza?

Para mí, parece como un cobarde MOV. ¿Cuál es su propósito y cuándo se debe utilizar?

423voto

I. J. Kennedy Puntos 7430

Como otros han señalado, la LEA (carga de dirección efectiva) se utiliza a menudo como un "truco" para hacer ciertos cálculos, pero eso no es su propósito principal. El conjunto de instrucciones x86 diseñado para apoyar a los lenguajes de alto nivel como Pascal y C, donde las matrices-especialmente las matrices de enteros o pequeñas estructuras-son comunes. Consideremos, por ejemplo, una estructura que representa (x, y) coordenadas:

struct Point
{
     int xcoord;
     int ycoord;
};

Ahora imagina una instrucción como:

int y = points[i].ycoord;

donde points[] es una matriz de Point. Suponiendo que la base de la matriz ya está en EBX, y la variable i está en EAXy xcoord y ycoord son cada uno de 32 bits (para ycoord está en el desplazamiento de 4 bytes en la estructura), esta declaración puede ser compilado para:

MOV EDX, [EBX + 8*EAX + 4]    ; right side is "effective address"

que lo de la tierra y en EDX. El factor de escala de 8 es porque cada Point es de 8 bytes de tamaño. Consideremos ahora la misma expresión se usa con el campo "dirección de" operador &:

int *p = &points[i].ycoord;

En este caso, usted no desea que el valor de ycoord, pero su dirección. Que es donde LEA (carga de dirección efectiva). En lugar de un MOV, el compilador puede generar

LEA ESI, [EBX + 8*EAX + 4]

que se carga la dirección en ESI.

277voto

Frank Krueger Puntos 27508

Desde el "Zen de la Asamblea" por Abrash:

LEA, la única instrucción que realiza direcciones de memoria de los cálculos, pero en realidad no tratar de memoria. LEA acepta un estándar de memoria de direccionamiento de los operandos, pero no hace nada más que almacenar el valor calculado de desplazamiento de memoria especificado en el registro, que puede ser cualquier registro de propósito general.

¿Qué nos dan? Dos cosas que AÑADIR no proporcionar:

  1. la capacidad de llevar a cabo, además de con dos o tres operandos, y
  2. la capacidad de almacenar el resultado en cualquier registro; no sólo uno de los operandos fuente.

48voto

hdante Puntos 2192

A pesar de todas las explicaciones, LEA es una operación aritmética:

LEA Rt, [Rs1+a*Rs2+b] => Rt = Rs1 + a*Rs2 + b

Es solo que su nombre es extremadamente estúpido para un mayús+agregar operación. La razón por la que ya fue explicado en la parte superior nominal de las respuestas (es decir. fue diseñado para asignar directamente a alto nivel de las referencias de memoria).

40voto

Mehrdad Afshari Puntos 204872

lea es una abreviatura de "carga de dirección efectiva". Se carga la dirección de la ubicación de referencia por el operando fuente al operando destino. Por ejemplo, usted podría usar para:

lea ebx, [ebx+eax*8]

para mover ebx puntero eax elementos más (en un 64-bit/elemento de la matriz) con una sola instrucción. Básicamente, usted se beneficia de complejo de abordar los modos compatibles con la arquitectura x86 para manipular punteros de manera eficiente.

37voto

GJ. Puntos 6487

Tal vez sólo otra cosa acerca de la LEA instrucciones. También puede utilizar LEA rápido multiplaing registros por 3, 5 o 9.

LEA EAX, [EAX * 2 + EAX]   ;EAX = EAX * 3
LEA EAX, [EAX * 4 + EAX]   ;EAX = EAX * 5
LEA EAX, [EAX * 8 + EAX]   ;EAX = EAX * 9

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X