LEA の指示の目的は何ですか? 質問する

LEA の指示の目的は何ですか? 質問する

私にとっては、ただのファンキーな MOV のように思えます。その目的は何ですか? また、いつ使用すればよいですか?

ベストアンサー1

他の人が指摘しているように、LEA (実効アドレスのロード) は特定の計算を行うための「トリック」としてよく使用されますが、それが主な目的ではありません。x86 命令セットは、配列 (特に int 配列または小さな構造体) が一般的である Pascal や C などの高水準言語をサポートするように設計されています。たとえば、(x, y) 座標を表す構造体を考えてみましょう。

struct Point
{
     int xcoord;
     int ycoord;
};

ここで次のような文を想像してください。

int y = points[i].ycoord;

ここで、points[]は の配列ですPoint。配列のベースがすでに にありEBX、変数iが にありEAXxcoordと がycoordそれぞれ 32 ビット (つまり、 はycoord構造体のオフセット 4 バイトにある) であると仮定すると、このステートメントは次のようにコンパイルできます。

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

yこれは になりますEDX。スケール係数が 8 なのは、それぞれがPoint8 バイトのサイズだからです。次に、同じ式を「アドレス」演算子 & と共に使用した場合を考えてみましょう。

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

この場合、必要なのは の値ではなくycoord、そのアドレスです。そこでLEA(load effective address) が役立ちます。 の代わりにMOV、コンパイラは を生成することができます。

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

これにより、アドレスがロードされますESI

おすすめ記事