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);
}

バッファと get の引数の間に 3 語の余分なスペースがあるのはなぜですか?

スタック

4

1 に答える 1

11

本 Computer Systems には 2 つの文があります。「gcc は、関数によって使用される合計スタック領域が 16 バイトの倍数でなければならないという x86 プログラミング ガイドラインに準拠しています。」および「保存された %ebp の 4 バイトと戻りアドレスの 4 バイトを含む」

于 2013-01-11T13:59:49.550 に答える