取一个空程序
//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 函数不需要堆栈帧初始化?
如果框架指针的设置不是在主函数中完成的,那么谁来做这个工作?
它是由操作系统完成的还是硬件的功能?