无用的分配堆栈空间?

13

为什么这个函数在调用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函数的缓冲区和参数之间会有额外的三个单词空格?

stack


8
对齐。无处不在的对齐! - user529758
1
@H2CO3 在 Linux 上使用 gcc,堆栈帧的对齐约定是什么? - phant0m
@phant0m 这取决于具体的处理器。i386可能是8字节(不确定),而AVX2可能是32字节(同样不确定)。链接到二进制文件中的静态库需要匹配。 - Potatoswatter
1个回答

11

在《计算机系统》一书中有两句话。

"gcc遵循x86编程指南,函数使用的总栈空间应为16字节的倍数。"以及"其中包括保存的%ebp所占用的4个字节和返回地址所占用的4个字节。"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接