Taking an empty program
//demo.c int main(void) { } Compiling the program at default optimization.
gcc -S demo.c -o dasm.asm I get the assembly output as
//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 Now Compiling the program at -O2 optimization.
gcc -O2 -S demo.c -o dasm.asm I get the optimized assembly
main: rep ret In my initial search , i found that the optimization flag -fomit-frame-pointer was responsible for removing the prologue and epilogue.
I found more information about the flag , in the gcc compiler manual.But could not understand this reason below , given by the manual , for removing the prologue and epilogue.
Don't keep the frame pointer in a register for functions that don't need one.
Is there any other way , of putting the above reason ?
What is the reason for "rep" instruction , appearing at -02 optimization ?
Why does main function , not require a stack frame initialization ?
If the setting up of the frame pointer , is not done from within the main function , then who does this job ?
Is it done by the OS or is it the functionality of the hardware ?
rep retis aretwith a prefix that doesn't alter the semantics, it keeps some AMD processors happy (some of them have a penalty for jumping directly to aret).