Это простой тест. Подобная тема обсуждалась в Распределение стека, заполнение и выравнивание , но когда я компилирую следующие два исходных кода, у меня возникают противоречивые результаты.
#include <stdio.h>
//first source code
void haha()
{
printf("HI");
}
int main()
{
int b = 2;
b = b << 1;
haha();
//printf("n = %d",b);
return 0;
}
#include <stdio.h>
//second source code
void haha3()
{
int c,a,b;
c=a+b;
}
void haha2()
{
int c,a,b;
c=a+b;
haha3();
}
int main()
{
int b = 2;
b = b << 1;
haha2();
//printf("n = %d",b);
return 0;
}
Для первого исходного кода я получил код сборки:
haha:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $.LC0, %eax
movl %eax, (%esp)
call printf
leave
ret
.size haha, .-haha
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $2, 12(%esp)
sall 12(%esp)
call haha
movl $0, %eax
leave
ret
Для второго исходного кода я получил код сборки:
haha3:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl -4(%ebp), %eax
movl -8(%ebp), %edx
leal (%edx,%eax), %eax
movl %eax, -12(%ebp)
leave
ret
.size haha3, .-haha3
.globl haha2
.type haha2, @function
haha2:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl -4(%ebp), %eax
movl -8(%ebp), %edx
leal (%edx,%eax), %eax
movl %eax, -12(%ebp)
call haha3
leave
ret
.size haha2, .-haha2
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $2, -4(%ebp)
sall -4(%ebp)
call haha2
movl $0, %eax
leave
ret
Мой вопрос: почему кадр стека первого кода выравнивается по 24 (subl $ 24,% esp), а второй - по 16 (subl $ 16,% esp)?
Как сказано в Распределение стека, заполнение и выравнивание семейство инструкций SSEx ТРЕБУЕТ упакованных 128-битных векторов для выравнивания до 16 байтов. Итак, я ожидаю, что кадр стека первого кода имеет subl $ 32,% esp и subl $ 16,% esp для второго или subl $ 24,% esp для первого и subl $ 8,% esp для второго из-за оставить и вернуть зарезервированные 8 байтов, как он сказал. Однако первый код использует 'subl $ 24,% esp', а второй использует 'subl $ 16,% esp' Спасибо за ваш интерес.