Sì pardon, ho fatto un attimo confusione; normalmente il prologo è del tipo
e alla finecodice:push ebp mov ebp, esp sub esp, <dimensione variabili locali>
(nel caso di una funzione cdecl, altrimenti dopo ret ci sarebbe anche un parametro, che indica di spostare esp in modo da ripulire lo stack dai parametri della funzione)codice:mov esp, ebp pop ebp ret
push ebp salva il frame pointer corrente, che viene quindi cambiato all'esp attuale, facendo sì che ebp punti sempre alla base dello stack frame corrente. In questa maniera, in caso di allocazioni sullo stack non note a compile-time, il compilatore può fare riferimento alle variabili locali riferendosi a [ebp-offset] (dal momento che, facendo allocazioni sullo stack non note a compile-time, esp non è più un punto di riferimento "fissato" per la funzione corrente). Inoltre, i vari valori di ebp pushati sullo stack costituiscono di fatto una lista linkata che consente ad un debugger di risalire facilmente ai vari stack frame.
D'altra parte, se non si fanno allocazioni sullo stack a runtime e non serve questo aiuto per ricostruire gli stack frame, è possibile in genere segnalare al compilatore di omettere il push ebp (e il corrispondente pop alla fine), liberando un registro altrimenti costantemente occupato (e questo, su un'architettura register-starved come x86, può dare in alcuni casi vantaggi di prestazioni sensibili).