对我来说,这就像一部时髦的MOV。它的目的是什么?何时使用?

最佳答案

正如其他人指出的那样,LEA(有效负载地址)通常被用作进行某些计算的“技巧”,但这并不是其主要目的。 x86指令集旨在支持Pascal和C等高级语言,在这些语言中,数组(尤其是整数或小结构的数组)很常见。例如,考虑一个表示(x,y)坐标的结构:

struct Point
{
     int xcoord;
     int ycoord;
};

现在想象一条语句:
int y = points[i].ycoord;

其中points[]Point的数组。假设数组的基础已经在EBX中,并且变量iEAX中,并且xcoordycoord均为32位(因此ycoord在结构中的偏移量为4个字节),则此语句可以编译为:
MOV EDX, [EBX + 8*EAX + 4]    ; right side is "effective address"

它将y放入EDX中。比例因子8是因为每个Point的大小为8个字节。现在考虑与运算符&的“地址”一起使用的表达式:
int *p = &points[i].ycoord;

在这种情况下,您不需要ycoord的值,而是它的地址。这就是LEA(加载有效地址)的来源。编译器可以生成MOV而不是ESI
LEA ESI, [EBX + 8*EAX + 4]

这将在ojit_code中加载地址。

关于assembly - LEA指令的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1658294/

10-11 18:49