私にとっては、ただのファンキーな MOV のように思えます。その目的は何ですか? また、いつ使用すればよいですか?
ベストアンサー1
他の人が指摘しているように、LEA (実効アドレスのロード) は特定の計算を行うための「トリック」としてよく使用されますが、それが主な目的ではありません。x86 命令セットは、配列 (特に int 配列または小さな構造体) が一般的である 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
(load effective address) が役立ちます。 の代わりにMOV
、コンパイラは を生成することができます。
LEA ESI, [EBX + 8*EAX + 4]
これにより、アドレスがロードされますESI
。