【发布时间】:2013-03-11 21:38:06
【问题描述】:
取一个空程序
//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 compiler manual 中找到了有关该标志的更多信息。但是无法理解以下手册中给出的删除序言和尾声的原因。
不要将帧指针保存在寄存器中 需要一个。
有没有其他方法可以说明上述原因?
"rep"指令出现在-02优化是什么原因?
为什么 main 函数不需要栈帧初始化?
如果框架指针的设置不是在主函数中完成的,那么谁来做这项工作?
是操作系统完成的还是硬件的功能?
【问题讨论】:
-
rep ret是一个ret前缀不会改变语义,它让一些 AMD 处理器满意(其中一些直接跳转到ret会受到惩罚)。
标签: c optimization gcc assembly x86