標準サブルーチンプロローグ/エピローグ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/12/25 15:34 UTC 版)
「呼出規約」の記事における「標準サブルーチンプロローグ/エピローグ」の解説
サブルーチンに制御が渡った点で、標準的には次のような処理を行う: _function: push ebp ;ベースポインタを保存 mov ebp, esp ;現在のスタックフレームを指すようベースポインタを変更 sub esp, x ;局所変数(Cでいう自動変数)の大きさの分スタックポインタを減らす この結果、EBPはスタック上の引数の頭を指し、局所変数を格納する領域をスタック上に確保することができる。元のEBPの値はスタックに保存されている。このように局所変数は引数と同様にサブルーチン呼び出し毎にスタック上に確保されるので、再帰呼び出しが可能になる。 このサブルーチンから抜け出す際は、次のシーケンスを実行する: mov esp, ebp ;局所変数を除去 pop ebp ;ベースポインタを復帰 ret ;サブルーチンから戻る これはcdeclの例であって、Pascal 呼出規約では次のように引数データをサブルーチン側が掃除する。 ret n ;nは引数データのバイト数 次のC関数は int _cdecl MyFunction(int i) { int k; return i + k;} 次のアセンブラコードと同等である。 ;エントリシーケンス push ebp mov ebp, esp sub esp, 4 ;整数型変数kの領域に相当 ;関数のコード mov eax, [ebp + 8] ;引数iを加算器(アキュムレータ)に移動 add eax, [ebp - 4] ;kをiに加える ;結果はEAX(加算器)に残る ;終了シーケンス mov esp, ebp pop ebp ret
※この「標準サブルーチンプロローグ/エピローグ」の解説は、「呼出規約」の解説の一部です。
「標準サブルーチンプロローグ/エピローグ」を含む「呼出規約」の記事については、「呼出規約」の概要を参照ください。
- 標準サブルーチンプロローグ/エピローグのページへのリンク