这是一个简单的测试。在Stack allocation, padding, and alignment中已经讨论了类似的主题,但是当我编译以下两个源代码时,我的结果相互矛盾。
#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)? 在Stack allocation, padding, and alignment中说SSEx系列指令要求打包128位向量以对齐到16个字节。所以,我希望第一个代码的堆栈帧有一个subl $ 32,%esp和subl $ 16,%esp用于第二个,或者subl $ 24,%esp用于第一个和subl $ 8,%esp用于第二个代码,因为保留并保留8个字节,如上所述。然而,事实是第一个代码使用'subl $ 24,%esp',第二个使用'subl $ 16,%esp'感谢您的兴趣。