2013-01-11 13 views
13

Perché questa funzione alloca più spazio di stack del necessario, prima di chiamare gets()?Stackspace allocata inutile?

echo: 
    pushl %ebp 
    movl %esp, %ebp 
    pushl %ebx 
    leal -8(%ebp), %ebx 
    subl $20, %esp  <-- Why so much space? 
    movl %ebx, (%esp) 
    call gets 
    ... 

Il codice C corrispondente:

void echo() 
{ 
    char buf[4]; 
    gets(buf); 
    puts(buf); 
} 

Perché c'è uno spazio aggiuntivo supplementare di tre parole tra il buffer e l'argomento per ottiene?

stack http://s8.postimage.org/h2niz1kut/stack.png

+7

Allineamento. Allineamento ovunque! –

+1

@ H2CO3 Qual è la convenzione di allineamento per i frame di stack, assumendo gcc su linux? – phant0m

+0

@ phant0m Dipende dal processore specifico. i386 potrebbe essere 8 byte (non sicuro) mentre AVX2 potrebbe essere 32 (di nuovo non sicuro). Le librerie statiche collegate a un binario devono essere abbinate. – Potatoswatter

risposta

11

ci sono due frasi nel libro Computer Systems. "gcc aderisce a una linea guida di programmazione x86 che lo spazio totale dello stack utilizzato dalla funzione deve essere multiplo di 16 byte." e "Inclusi i 4 byte per il% di ebp salvato e i 4 byte per l'indirizzo di ritorno",