なんかいろいろこんぴゅーたかんけいのなぐりがき

なんか勉強しているこんぴゅーた関係のことのメモやそれ以外のことを書こうかなあ...

logs

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

関数呼び出し時のスタックとレジスタの様子

TEHHを読んでいたら、スタックについて少し混乱してきた、ついでにレジスタについても。
以下は、基本的にはTEHHのC6とC7の記述を元にしたメモである。アーキテクチャはx86。ただし間違いがあるかもしれないので参考程度に。

レジスタについて


ジェネラル(汎用)レジスタ:EAX,EBX,ECX,EDX
データの操作に使う

セグメントレジスタ:CS,SS,DS,ES,FS,GS
コードセグメントやスタックセグメント等の開始アドレスを指す。16ビット

ソースインデックスレジスタ:ESI
データソースのオフセットを格納する

ディストネーションインデックスレジスタ:EDI
ディストネーションのオフセットを格納する

ベースポイントレジスタ:EBP
ローカル変数の開始位置を示す

スタックポイントレジスタ:ESP
スタックの先頭を示す

インストラクションポイントレジスタ:EIP
次に実行される命令のアドレスが格納される




関数呼び出しの流れ


PUSH,POPするとそれに応じてESPが減算されたり加算されることに注意。

・関数に与えられた引数を逆順で(第1引数が一番小さいアドレスになる)スタックにPUSHされる
・関数終了後の戻り先のアドレスとしてeipがスタックにPUSHされる
・eipに関数のアドレスが代入される
・ebpがPUSHされる
・現在のespの値をebpに代入する
・呼び出した関数内で用いるローカル変数をスタックに保存するための領域を確保するためにespの値をその分減算する
関数の処理が終了する
・leaveでうまい具合でesp,ebpを調整する(←よくわからん)
・retでeipをpopして関数を呼び出した直後の命令に移る

スポンサーサイト

トラックバックURL

http://ilovevim.blog42.fc2.com/tb.php/98-aacd32aa

この記事へのトラックバック

この記事へのコメント

コメント投稿フォーム

Paging Navigation

Navigations, etc.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。