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を復元

図。

20240601-stack.drawio.svg

Figure 1: スタックフレームの図

メモ

  • main関数もretで元に戻る。どこに戻るのだろう

関連