空のプログラムを取る
//demo.c
int main(void)
{
}
デフォルトの最適化でプログラムをコンパイルします。
gcc -S demo.c -o dasm.asm
アセンブリ出力を次のように取得します
//Removed labels and directive which are not relevant
main:
pushl %ebp // prologue of main
movl %esp, %ebp // prologue of main
popl %ebp // epilogue of main
ret
次に、-O2最適化でプログラムをコンパイルします。
gcc -O2 -S demo.c -o dasm.asm
最適化されたアセンブリを取得します
main:
rep
ret
最初の検索で、最適化フラグ-fomit-frame-pointerがプロローグとエピローグの削除に関与していることがわかりました。
フラグの詳細については、gccコンパイラのマニュアルを参照してください。しかし、プロローグとエピローグを削除するための、マニュアルに記載されている以下の理由を理解できませんでした。
フレームポインタを必要としない関数のレジスタにフレームポインタを保持しないでください。
上記の理由を置く他の方法はありますか?
"rep"
-02最適化に現れる命令の理由は何ですか?
スタックフレームの初期化を必要としないmain関数が必要なのはなぜですか?
フレームポインタの設定がメイン関数内から行われない場合、誰がこの仕事をしますか?
それはOSによって行われるのですか、それともハードウェアの機能ですか?