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.
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
Gracias, entre esta respuesta y el comentario de vidstige tengo la información que necesito :) –
@vidstige @Martin: o se cuelgan, incluso en x86 (ver movaps, por ejemplo). – Bahbar