2011-03-31 8 views
5

Usando el siguiente código C¿Por qué mi puntero de pila solo se incrementa en múltiplos de 16?

void func() { 
    int a=1,b=2,c=3; 
} 

Compilar utilizando gcc -S -O -o- myfile.c me sale la salida

.file "myfile.c" 
    .intel_syntax noprefix 
    .text 
.globl func 
    .type func, @function 
func: 
    push ebp 
    mov ebp, esp 
    sub esp, 16 
    mov DWORD PTR [ebp-4], 1 
    mov DWORD PTR [ebp-8], 2 
    mov DWORD PTR [ebp-12], 3 
    mov DWORD PTR [ebp-16], 4 
    mov DWORD PTR [ebp-20], 5 
    leave 
    ret 
    .size func, .-func 
    .ident "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5" 
    .section .note.GNU-stack,"",@progbits 

Aquí yo esperaría que la tercera línea después de func: ser sub esp,12 en lugar de sub esp,16. Jugué con diferentes números de variables automáticas en la función y encontré que crece en incrementos de 16 bytes. ¿Por qué pasó esto? ¿Esto sucede en todas las plataformas, o es específico de la plataforma?

Actualmente estoy ejecutando un Intel Mac con OSX, compilando a través de un huésped Ubuntu (32 bits) VirtualBox usando GCC.

Respuesta

8

De GCC man page, (énfasis negrita):

-mpreferred-stack-boundary = num

intento de mantener el límite pila alineada a un 2 elevado a límite de byte num. Si no se especifica -mpreferred-stack-boundary, el valor predeterminado es 4 (16 bytes o 128 bits).

+1

Y la razón por la cual los compiladores hacen esto es que algunas instrucciones que acceden a las ubicaciones de memoria * no * reciben una penalización de rendimiento. – vidstige

+0

Gracias, entre esta respuesta y el comentario de vidstige tengo la información que necesito :) –

+2

@vidstige @Martin: o se cuelgan, incluso en x86 (ver movaps, por ejemplo). – Bahbar

2

Esa salida es muy extraña.

¿Estás seguro de que el archivo c no era:

void func() { 
    int a=1,b=2,c=3,d=4,e=5; 
} 

?

contrario ¿por qué las líneas

mov DWORD PTR [ebp-16], 4 
mov DWORD PTR [ebp-20], 5 
+0

Estoy de acuerdo contigo, pero eso no debería ser una respuesta. Esa es en realidad una pregunta para la pregunta del OP. – andreee

Cuestiones relacionadas