对我来说,这就像一部时髦的MOV。它的目的是什么?何时使用?
最佳答案
正如其他人指出的那样,LEA(有效负载地址)通常被用作进行某些计算的“技巧”,但这并不是其主要目的。 x86指令集旨在支持Pascal和C等高级语言,在这些语言中,数组(尤其是整数或小结构的数组)很常见。例如,考虑一个表示(x,y)坐标的结构:
struct Point
{
int xcoord;
int ycoord;
};
现在想象一条语句:
int y = points[i].ycoord;
其中
points[]
是Point
的数组。假设数组的基础已经在EBX
中,并且变量i
在EAX
中,并且xcoord
和ycoord
均为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/