前回は,
今回は,
- ※1)
- 前回同様今回も,
「サブルーチン」 (sub-routine)/ 「手続き」 (procedure) などをまとめて 「関数」 (function) と呼びます。
引数と戻り値
引数
関数の呼び出し元は,
- 自身の局所変数の値
- 自身に指定された引数
- 他の関数の呼び出し結果
- 上記の値から導出された値
(例: 四則演算/ 構造体参照等)
一方で
そのため,
リスト1 呼び出し元での引数格納
movl $1, 0(%esp)
movl $15, 4(%esp)
引数格納用のスタック領域確保は大別すると,push
”
本稿では,
呼び出し先の関数は,
リスト2 呼び出し先での引数参照
movl 8(%ebp), %eax # eax には 1 が格納
movl 12(%ebp), %eax # eax には 15 が格納
格納時のESPレジスタに対する即値指定と,
- 関数復帰の際の呼び出し元アドレス格納領域
(+4) - 旧EBP値の格納領域
(+4)
上記の分だけスタック上に領域が確保されているためです。
関数が呼び出された際のスタックは以下のような構成となっています。
戻り値
関数引数が複数の値を扱う必要があったのに対して,
プログラミング言語によっては,
Intel x86アーキテクチャで関数呼び出しを実現する場合,
リスト3 戻り値格納と復帰
movl $1, %eax # 戻り値は 1
leave
ret