KDOC 172: 関数呼び出しで起きていること
この文書のステータス
- 作成
- 2024-06-01 貴島
- レビュー
- 2024-06-05 貴島
概要
関数呼び出しを理解する。
1: 関数呼び出し時、呼び出し側。
- rbpをスタックに保存して、呼び出し元に戻れるようにしておく
- rbpのアドレスでrspをセットする
- スタックフレームを初期化する。rspをrbp-16にして上に伸ばす
- 引数をレジスタにセットする
- callする
2: 呼び出される側。
- rbpをスタックに保存して、呼び出し元に戻れるようにしておく
- rbpのアドレスでrspをセットする
- 元のレジスタの値をスタックフレームに保存する
- スタックフレームからレジスタに値をセットする
- 演算する
- 先ほど保存したrbpを元に戻して、呼び出し元に戻る
3: 呼び出し側に戻る。
- 関数呼び出ししたとき返り値がレジスタに入っているので、スタックフレームに保存する
- leaveでスタックフレームを破棄する。rspにrbpの値をコピーしてrspを復元 + スタックに保存したrbpのアドレスからrbpを復元
図。
Figure 1: スタックフレームの図
メモ
- main関数もretで元に戻る。どこに戻るのだろう
関連
- KDOC 140: 『自作エミュレータで学ぶx86アーキテクチャ』。で出てきた例を詳しく考えた