allocaの謎解決
allocaってローカル変数の配置をどうするのか謎に思っていた。
例えば以下のようなコードがあるとき
void testfunc(int sz) { int a; int b; int c; void* vp = alloca(sz); int d; int e; }
&a : -4(%ebp)
&b : -8(%ebp)
&c : -12(%ebp)
&vp: -16(%ebp)
alloca(sz) : -???(%ebp)
&d : ???
&e : ???
とかなってしまうのではないかと。(x86でスタックが下に伸びるのを想定)
しかしよくよく考えてみると、コンパイラはコンパイル時に既に変数の位置を確定するので、
&a : -4(%ebp)
&b : -8(%ebp)
&c : -12(%ebp)
&vp: -16(%ebp)
&d : -20(%ebp)
&e : -24(%ebp)
となって、実行時にローカル領域の下限を指しているesp=-28(%ebp)szをvpに代入してsz分(+ヘッダ分)ずらせばいいだけなのであった。