int square() {
char test[50];
}
The above code produces
square():
push rbp
mov rbp, rsp
When i change the code a little to
int square() {
char test[150];
}
The assembly generated is
square():
push rbp
mov rbp, rsp
sub rsp, 40
Which is still weird because I cannot understand why it does not allocate for previous creations. I'm running at -O0 so gcc doesn't optimize it out. Why is gcc creating code for wrong sized arrays?
int square() {
char a[50];
char b[50];
}
square():
push rbp
mov rbp, rsp
sub rsp, 8
Similarly for x86
int square() {
char a[500];
}
compiled with -m32 gives me:
square():
push ebp
mov ebp, esp
sub esp, 512
Where is this extra 12 bytes from? And why does -m32 have an sub instruction for char test[50] but x86_64 doesn't?
GCC is using the x86-64 System V ABI's 128-byte Red Zone below the stack pointer for the variables, only reserving some extra stack space when that's not sufficient
For the last example, GCC sub
s 512
to keep the stack (and the array) aligned.
The i386 System V ABI does not have a red zone so it has to reserve space for the whole array (neither does Windows x64, for that matter).