L'assunzione di un programma vuotoFunzione Prologo ed Epilogo rimossi da GCC Optimization
//demo.c
int main(void)
{
}
La compilazione del programma a ottimizzazione di default.
gcc -S demo.c -o dasm.asm
ottengo l'uscita di montaggio come
//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
Ora Compilazione del programma a -O2 ottimizzazione.
gcc -O2 -S demo.c -o dasm.asm
ottengo l'assemblaggio ottimizzato
main:
rep
ret
Nella mia ricerca iniziale, ho trovato che l'ottimizzazione bandiera -fomit-frame-pointer è stato responsabile per la rimozione del prologo e un epilogo.
Ho trovato ulteriori informazioni sulla bandiera, nel gcc compiler manual. Ma non ho potuto capire questo motivo qui sotto, dato dal manuale, per rimuovere il prologo e l'epilogo.
Non mantenere il puntatore del frame in un registro per le funzioni che non sono richieste da .
C'è qualche altro modo di mettere la ragione di cui sopra?
Qual è il motivo dell'istruzione "rep"
, visualizzata all'ottimizzazione -02?
Perché la funzione principale non richiede l'inizializzazione del frame dello stack?
Se l'impostazione del puntatore del frame non viene eseguita dalla funzione principale, chi fa questo lavoro?
È fatto dal sistema operativo o è la funzionalità dell'hardware?
'ret' rappresentante è un' ret' con un prefisso che non altera la semantica, mantiene alcuni processori AMD felici (alcuni di loro hanno una pena per saltare direttamente a a 'ret'). – harold
Possibile duplicato di [Evitare l'overhead del prologo della funzione gcc?] (Http://stackoverflow.com/questions/5477673/avoiding-gcc-function-prologue-overhead) – mlt