lealについて

lea命令は、Load Effective Address命令というもので、メモリ上の場所のアドレス値をレジスタに格納するもの。そのアドレスへのパイプを作っているような具合。なので、

    leal 4(%esp), %eax

とあったら、「ESPの値に4を足したメモリ位置」のアドレスを、EAXに格納するという意味になる。
端的に言うと、 EAX = ESP + 4 ってこと。
この命令を行うだけなら、二命令使って

    movl %esp, %eax
    addl $4, %eax

としても同じ結果が得られそうなものだけど、では何のためにLEA命令があるのか。


実は、LEAは計算が目的じゃなくてアドレスを得るための命令なので、通常の計算命令と違ってフラグレジスタに影響を与えない。フラグに影響を与えないので、反復する命令に適している。*1
また足し算が一命令で出来てしまうので、その辺でも使われることがあるみたい。


じっさいの使用例:

void funtction1() {

    int A = 10;
    A += 66;
}
1.    pushl   %ebp
2.    movl    %esp, %ebp
3.    subl    $4, %esp
4.    movl    $10, -4(%ebp)
5.    leal    -4(%ebp), %eax
6.    addl    $66, (%eax)
7.    leave
8.    ret
/* 行先頭は行番号。本来の文法では無いので、消さないとコンパイルできないよ */

3行目でスタックを伸ばしていて(その部分に int A を割り当て)、4行目ではそこ(EBP-4)に即値10を代入している。
5行目では、int A の場所(EBP-4)をEAXに割り当てている。
6行目では(%eax)を通じてautoな変数 int A にアクセスしている。


という具合に、「レジスタをメモリ上のとある場所に結びつけるパイプ」的な命令がLEAだよ!たぶん!
なぜか日本語の情報が滅多にないので、記事にしておきました。ツッコミは毎日歓迎です。


参考URL:
http://www.astahost.com/info.php/leal-what-hell-instruction_t11602.html
検索ワード:gas, GNU as, lea, leal, asm


現在、ディレクティブ等について読んでます。しかしねむいのでねる!明日はFizzBuzzあたり作ります。
明日用URL
http://www.ibm.com/developerworks/jp/linux/library/l-gas-nasm.html
http://www.oklab.org/gas.xhtml
http://tigcc.ticalc.org/doc/gnuasm.html#SEC60

*1:と、参考URLの回答者の方が申しておりました