逆アセンブルで遊んでみる(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バイト分も確保するんでしょうか。