メモ

x86 なスタックフレームについて。
例えば以下な関数を呼び出す場合

int add (int x, int y) {
    return x + y;
}

あ、呼び出すナニは以下。

    z = add(2, 3);
  • 3 が push
  • 2 が push
  • 戻り番地が push
  • %ebp が push

されて %esp が %ebp に代入されてローカル変数な領域を確保するはず。ローカル変数がポインタ変数な一つのみだった場合は

  • ローカル変数は -4(%ebp) で取り出せる
  • 直前の %ebp の値は %ebp を参照すれば OK
  • 戻り番地は 4(%ebp) で取り出せる
  • 第一引数は 8(%ebp) で取り出せる

基本的には

引数を push して call すればベースポインタとかスタックポインタとかなナニは処理してくれるみたい。戻る時にも %eax に戻りを設定して ret すれば OK との事。

ええと

アセンブラなナニもですし、Linux の仕様という所でもリハビリが必要で大変。