【发布时间】:2012-12-26 02:44:54
【问题描述】:
为什么这个函数在调用gets()之前分配的堆栈空间比它需要的多?
echo:
pushl %ebp
movl %esp, %ebp
pushl %ebx
leal -8(%ebp), %ebx
subl $20, %esp <-- Why so much space?
movl %ebx, (%esp)
call gets
...
对应的C代码:
void echo()
{
char buf[4];
gets(buf);
puts(buf);
}
为什么缓冲区和gets的参数之间有额外的三个单词的空间?
【问题讨论】:
-
对齐。到处对齐!
-
@H2CO3 假设 linux 上的 gcc,堆栈帧的对齐约定是什么?
-
@phant0m 取决于具体的处理器。 i386 可能是 8 字节(不确定),而 AVX2 可能是 32 字节(再次不确定)。链接到二进制文件中的静态库需要匹配。