質問: アセンブリ言語で質問があります。 C言語のプログラムをコンパイルした際に出てくるアセンブリ言語の一部なんですが、main()前の初期化の箇所で以下のような部分がありました。 main+3: and $0xfffffff0,%esp このmain+3とはなんですか?? "and $0xfffffff0,%esp"の部分が何をしているのかわかりません。 x86でコンパイラはgccです。 英語の説明を読んだら、16byteにアライアメントしているとか・・なんとか・・ よくわからないんです。
回答: まず、「main+3」は、「mainの開始位置から3バイト目」という意味です。それ以前に3バイト分の何かがあると思います(x86命令は可変長なので少しわかりづらいですが)。 そして、その行の`AND`命令は、「ESPレジスタ(スタックポインタ)の下4ビットを0にする」という意味です。x86の取り扱うデータは整数が4バイト、doubleが8バイトありますが、これが4バイト・8バイトで割り切れないメモリに入ってしまうと大きく速度低下します(x86はどうにか動きますが、CPUによってはエラーで止まってしまうものすら存在します)。 ということで、関数に入ったところで、スタックをキリの良い位置に揃えることになります。x86の場合は、スタックがアドレスの小さい方に進むので、下位の数ビットをクリアすれば、ちょうどいい位置になります(8バイトでなくて16バイトに揃えている理由はよくわからないですが)。