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の回答者の方が申しておりました