逆アセンブルで遊んでみる(4)自動変数に値をセット

「自動変数に値をセット」です。

/* asm004.c */
void func(void)
{
	int n = 0x7F;
}
   0:	55                   	push   %ebp
   1:	89 e5                	mov    %esp,%ebp
   3:	83 ec 10             	sub    $0x10,%esp
   6:	c7 45 fc 7f 00 00 00 	movl   $0x7f,-0x4(%ebp)
   d:	c9                   	leave  
   e:	c3                   	ret

3行目で、スタックポインタ(esp)の値から0x10を減算しています。これは、スタックを16バイト伸張して、その空き領域を自動変数の領域として確保しているのでしょうか。実際、アセンブリコードを見ると、空いた領域に即値(0x7F)をツッコんでいます(int型変数=4バイトなので、ベースポインタで示されるアドレスから-4バイトの場所にツッコんでいる)。スタックというのは、メモリアドレスの高位から低位に向かって伸張するので、スタックポインタの値を減少=スタックを伸長、スタックポインタの値を増加=スタックを縮小、ということだと思います。

なお、自動変数の領域はスタックに確保するので、シンボルテーブルを確認しても、自動変数のシンボル(n)は存在しません。

$ nm asm004.o
00000000 T func
$

ところで、自動変数はint型の一変数のみ…つまり領域としては最低4バイト分あればいいのに、なぜ16バイト分も確保するんでしょうか。