Re: OT - per soli programmatori
On Wed, Feb 13, 2002 at 05:57:16PM +0100, Little-John wrote:
> int somma(int a, int b) {
> return a+b;
> }
>
> int main() {
> int a, risultato;
> a = 4;
> risultato=somma(a,5);
> return 0;
> }
> personalmente mi aspetterei un codice asm che assomigli a questo:
>
> pushl %ebp
> movl %esp,%ebp
qui devi decrementare (o incrementare dipende dall'architettura) lo
stack pointer di due word (per l'allocazione di a e risultato)
> movl $4, %eax
> pushl $5
> pushl %eax
> call somma
> addl $8, %esp
> xorl %eax, %eax
> movl %ebp, %esp
> popl %ebp
>
> vediamo cosa genera il gcc (senza alcuno switch di ottimizzazione):
> $ gcc -S prova.c
>
> ecco la funzione main:
>
> main:
> pushl %ebp ; ok questo è
> movl %esp,%ebp ; il prologo
> subl $24,%esp <-- a che serve 'sta riga?
serve per fare spazio alle variabili automatiche, (vedi int a,
risultato;), c'e' un bug nel gcc 2.95.x, non so se nella versione 3 sia
stato risolto. Il fatto e' che deve decrementare di 8 byte invece che di
24. La versione corretta deve essere
subl $8,%esp
infatti... deve essere
[ ret ]
[ ebp ] <-- saved frame pointer, una word (4 byte su x86)
[ ] <-- 4 byte di int a
[ ] <-- 4 byte di int risultato, e qui punta lo stack pointer %esp
e non subl $24,%esp
> movl $4,-4(%ebp)
> addl $-8,%esp <-- e quest'altra ?
qui decrementa ulteriormente l'SP di 8 byte, ignoro il perche' di
questa cosa, anzi e' uno spreco inutile in memoria e in tempo
> ok, direte voi, ma il codice non era ottimizzato (fatto sta che è _molto_
> non ottimizzato...). Quindi in questo caso, la domanda specifica è, perchè
> lo stack viene gestito in questo modo?
niente e' un problema del 2.95.x anche il mio fa cosi', con l'egcs
invece tutt'apposto. Non e' un problema di ottimizzazione o non, e' un
problema punto e stop
> Vediamo cosa succede compilando in questo modo (cioè come viene compilata
> la maggior parte del software, con le ottimizzazioni usuali) :
> $ gcc prova.c -S -O2 -fomit-frame-pointer
> main:
> subl $12,%esp <-- Ma perchè due istruzioni
> addl $-8,%esp <-- al posto di una?
boh, viva l'ottimizzazione :)
> any hints?
prova il gcc 3 e facci sapere,
Ciao, blitzrieg
--
Reply to: