[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: