【问题标题】:Useless allocated Stackspace?分配的堆栈空间没用?
【发布时间】: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 字节(再次不确定)。链接到二进制文件中的静态库需要匹配。

标签: c assembly x86 stack


【解决方案1】:

计算机系统一书中有两句话。 “gcc 遵循 x86 编程准则,即函数使用的总堆栈空间应为 16 字节的倍数。”和“包括保存的 %ebp 的 4 个字节和返回地址的 4 个字节,”

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2011-08-04
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    相关资源
    最近更新 更多