サブルーチン・リンケージ規約は、サブルーチンの入り口と出口でのマシンの状態を指定し、同じ言語または異なる言語で別個にコンパイルされるルーチンのリンクを許可します。「AIX コマンド・リファレンス に記載されているサブルーチン・リンケージおよびシステム呼び出しに関する情報は、この項目に関する基本的な説明になっています。完全な詳細を知るために、この情報を参照してください。この項は、混合言語 Fortran およびアセンブラー・プログラムを作成したり、アセンブラー・レベルでデバッグするのに必要な情報を要約したもので、この種の基礎知識は持っておかなければなりません。
システム・リンケージ規約は、多数の浮動小数点レジスター (FPR) と汎用レジスター (GPR) を最大限に利用して、サブルーチンの入り口と出口でのレジスターの保管と復元を最小化して、レジスター内の引き数を渡します。このリンケージ規約は、引き数の引き渡しおよび戻り値が FPR か GPR、またはその両方に入ることが許可されます。
次の表は、浮動小数点レジスターと、それらの機能をリストしたものです。浮動小数点レジスターは、倍精度です (64 ビット)。
レジスター | 予約済み呼び出し間 | 使用法 |
---|---|---|
0 | いいえ | |
1 | いいえ | FP パラメーター 1、関数戻り 1 |
2 | いいえ | FP パラメーター 2、関数戻り 2 |
· · · | · · · | · · · |
13 | いいえ | FP パラメーター 13、関数戻り 13 |
14-31 | はい |
|
次の表は、汎用レジスターと、それらの機能をリストしたものです。
レジスター | 予約済み呼び出し間 | 使用法 |
---|---|---|
0 | いいえ | |
1 | はい | スタック・ポインター |
2 | はい | TOC ポインター |
3 | いいえ | 引き数リストの 1 番目のワード、戻り値 1 |
4 | いいえ | 引き数リストの 2 番目のワード、戻り値 2 |
· · · | · · · | · · · |
10 | いいえ | 引き数リストの 8 番目のワード、戻り値 8 |
11 | いいえ | 内部プロシージャー (Env) への DSA ポインター |
12 | いいえ | |
13-31 | はい | |
レジスターが保持すると示されていないものは、呼び出し中に内容を変更することができます。呼び出し元は責任を持って、後で値が必要になるレジスターを保管する責任があります。逆に言えば、レジスターが保持されると考えられる場合には、呼び出された側が呼び出し間で内容を保持する責任があり、呼び出し元は特別な処置を行う必要はありません。 |
次の表は、特殊目的のためのレジスター規約をリストしたものです。
レジスター | 予約済み呼び出し間 |
---|---|
条件レジスター ビット 0-7 (CR0,CR1) ビット 8-22 (CR2,CR3,CR4) ビット 23-31 (CR5,CR6,CR7) |
いいえ はい いいえ |
リンク・レジスター | いいえ |
カウント・レジスター | いいえ |
MQ レジスター | いいえ |
XER レジスター | いいえ |
FPSCR レジスター | いいえ |
スタックは、ローカル・ストレージ、レジスター保管域、パラメーター・リスト、呼び出しのチェーン・データを保持するのに使用されるストレージの一部です。スタックは高位アドレスから低位アドレスに向かって広がります。スタック・ポインター・レジスター (レジスター 1) は、スタックの現在の「最上位」を示すのに使用されます。
スタック・フレームは、1 つのプロシージャーで使用されるスタックの部分です。入力パラメーターは、現在のスタック・フレームの一部と見なされます。ある意味では、個々の出力引き数は、呼び出し元のスタック・フレームと呼び出される側のスタック・フレームの両方に属しています。どちらの場合にも、スタック・フレーム・サイズは呼び出し元のスタック・ポインターと呼び出される側のスタック・ポインターとの違いとして最適化を図って定義されます。
以下の図は、32 ビットおよび 64 ビット環境での典型的なスタック・フレームのストレージ・マップを示しています。
これらの図では、現行ルーチンは他の関数を呼び出しできるようにするスタック・フレームを獲得しました。ルーチンが呼び出しを行わず、ローカル変数または一時変数が存在しない場合、関数がスタック・フレームを割り振る必要はありません。必要であれば、呼び出し元のスタック・フレームの先頭にあるレジスター保管域をその後も使用することができます。
スタック・フレームは、ダブルワード境界に合わせられます。 FPR 保管域およびパラメーター域 (P1, P2,..., Pn) も、ダブルワード境界に合わせられます。その他の区域は、ワード境界合わせだけが必要です。
32 ビット環境の実行時スタック 低位 | | スタックはこの端 アドレス | | から広がっていきます |--------------------| 呼び出される --> 0 | 逆方向チェーン | 側のスタック・ 4 | 保管された CR | ポインター 8 | 保管された LR | 12-16 | 予約済み | <--- リンク域 20 | 保管された TOC | (呼び出される側) |--------------------| P1-P8 用のスペースは | P1 | 出力引き数域 常に予約されています | ... | <---(引き数リストを作成する | Pn | ために呼び出される側 |--------------------| が作成します) | 呼び出される側の | | スタック域 | <--- ローカル・ | | スタック域 |--------------------| | | (境界合わせのために浪費される |--------------------| 可能性のあるワード) -8*nfprs-4*ngprs --> | 呼び出し元の GPR 用| Rfirst = R13 (完全な 保管 | 保管域 | 保管の場合) | 最大 19 ワード | R31 |--------------------| -8*nfprs --> | 呼び出し元の FPR 用| Ffirst = F14 (完全な | 保管域 | 保管の場合) |最大 18 ダブルワード| F31 |--------------------| 呼び出し元の --> 0 | 逆方向チェーン | スタック・ 4 | 保管された CR | ポインター 8 | 保管された LR | 12-16 | 予約済み | <--- リンク域 20 | 保管された TOC | (呼び出し元) |--------------------| P1-P8 用のスペース 24 | P1 | 入力パラメーター域 は常に予約されています| ... | <---(呼び出される側の入力 | Pn | パラメーターがここに |--------------------| 入っています。また、 | 呼び出し元の | 呼び出し元の引き数域でも | スタック域 | あります) 高位 | | アドレス | | |
64 ビット環境の実行時スタック 低位 | | スタックはこの端 アドレス | | から広がっていきます |--------------------| 呼び出される --> 0 | 逆方向チェーン | 側のスタック・ 8 | 保管された CR | ポインター 16 | 保管された LR | 24-32 | 予約済み | <--- リンク域 40 | 保管された TOC | (呼び出される側) |--------------------| P1-P8 用のスペースは | P1 | 出力引き数域 常に予約されています | ... | <---(引き数リストを作成する | Pn | ために呼び出される側 |--------------------| が作成します) | 呼び出される側の | | スタック域 | <--- ローカル・ | | スタック域 |--------------------| | | (境界合わせのために浪費される |--------------------| 可能性のあるワード) -8*nfprs-8*ngprs --> | 呼び出し元の GPR 用| Rfirst = R13 (完全な 保管 | 保管域 | 保管の場合) |最大 19 ダブルワード| R31 |--------------------| -8*nfprs --> | 呼び出し元の FPR 用| Ffirst = F14 (完全な | 保管域 | 保管の場合) |最大 18 ダブルワード| F31 |--------------------| 呼び出し元の --> 0 | 逆方向チェーン | スタック・ 8 | 保管された CR | ポインター 16 | 保管された LR | 24-32 | 予約済み | <--- リンク域 40 | 保管された TOC | (呼び出し元) |--------------------| P1-P8 用のスペース 48 | P1 | 入力パラメーター域 は常に予約されています| ... | <---(呼び出される側の入力 | Pn | パラメーターがここに |--------------------| 入っています。また、 | 呼び出し元の | 呼び出し元の引き数域でも | スタック域 | あります) 高位 | | アドレス | | |
32 ビット環境では、リンク域は 6 ワードで構成され、プロシージャーへのエントリーの呼び出し元のスタック・ポインターからオフセット 0 にあります。最初のワードには、呼び出し元の逆方向チェーン (スタック・ポインター) が含まれています。 2 番目のワードは、必要な場合に呼び出される側が条件レジスター (CR) を保管する場所です。 3 番目のワードは、必要な場合に呼び出される側のプロローグ・コードがリンク・レジスターを保管する場所です。 4 番目のワードは、C SETJMP および LONGJMP 処理用に予約されていて、5 番目のワードは将来の使用に備えて予約されています。最後のワード (ワード 6) は、他のオブジェクト・モジュール (たとえば共用ライブラリー) 内のルーチンを呼び出す時に使用されるグローバル・リンケージ・ルーチン用に予約されています。
64 ビット環境では、この区域は 6 個のダブルワードで構成され、プロシージャーへのエントリーの呼び出し元のスタック・ポインターからオフセット 0 にあります。最初のダブルワードには、呼び出し元の逆方向チェーン (スタック・ポインター) が含まれています。 2 番目のダブルワードは、必要な場合に呼び出される側が条件レジスター (CR) を保管する場所です。 3 番目のダブルワードは、必要な場合に呼び出される側のプロローグ・コードがリンク・レジスターを保管する場所です。 4 番目のダブルワードは、C SETJMP および LONGJMP 処理用に予約されていて、5 番目のダブルワードは将来の使用に備えて予約されています。最後のダブルワード (ダブルワード 6) は、他のオブジェクト・モジュール (たとえば共用ライブラリー) 内のルーチンを呼び出す時に使用されるグローバル・リンケージ・ルーチン用に予約されています。
入力パラメーター域は、32 ビット環境では、呼び出される側の入力パラメーターのレジスター・イメージを表すために、呼び出し側プログラムによって予約されるストレージの連続部分です。入力パラメーター域は、ダブルワード境界に合わせられ、呼び出し元のリンク域の直後のスタックに入れられます。この区域のサイズは、最低でも 8 ワードあります。 8 ワードを超えたパラメーターが予期される場合は、入力スタック・ポインターからの正方向オフセット 56 から始まるレジスター・イメージとして保管されます。
最初の 8 ワードは、呼び出し点でレジスターに現れるだけで、スタックには現れません。残りのワードはスタックに常に入っていて、レジスターに入れることもできます。
入力パラメーター域は、64 ビット環境では、呼び出される側の入力パラメーターのレジスター・イメージを表すために、呼び出し側プログラムによって予約されるストレージの連続部分です。入力パラメーター域は、ダブルワード境界に合わせられ、呼び出し元のリンク域の直後のスタックに入れられます。この区域のサイズは、最低でも 8 ダブルワードあります。 8 ダブルワードを超えたパラメーターが予期される場合は、入力スタック・ポインターからの正方向オフセット 112 から始まるレジスター・イメージとして保管されます。
最初の 8 ダブルワードは、呼び出し点でレジスターに現れるだけで、スタックには現れません。残りのワードはスタックに常に入っていて、レジスターに入れることもできます。
レジスター保管域は、ダブルワード境界に合わせられます。呼び出される側のプログラムで使用されるすべての不揮発性 FPR および GPR を保管するのに必要なスペースを提供します。 FPR はリンク域の隣りに保管されます。 GPR は FPR の上 (低位アドレス) に保管されます。呼び出された関数は、新しいスタック・フレームを割り振る必要がない場合でも、ここにレジスターを保管することができます。システム定義のスタック・フロアには、以下のような可能な最大の保管域が含まれています。
32-bit platforms: 18*8 for FPRs + 19*4 for GPRs 64-bit platforms: 18*8 for FPRs + 19*8 for GPRs
スタック・フロアよりも数字的に低位のアドレスにある位置にはアクセスしてはいけません。
呼び出される側が行わなければならないことは、実際に使用する不揮発性レジスターの保管だけです。これは、常に、最も高い位置にレジスター 31 を保管します。
ローカル・スタック域は、ローカル変数および一時変数用に呼び出される側のプロシージャーが割り振るスペースです。
出力パラメーター域 (P1...Pn) は、このスタック・フレームを所有しているプロシージャーが呼び出すすべてのプロシージャーの最大のパラメーター・リストを保持できるだけの十分な大きさが必要です。
32 ビット環境では、この区域の長さは、引き数リストの長さや存在とは無関係に、最低でも 8 ワードあります。8 ワードを超えて渡される場合は、現行スタック・ポインターからのオフセット 56 から始まる拡張リストが作成されます。
最初の 8 ワードは、呼び出し点でレジスターに現れるだけで、スタックには現れません。残りのワードはスタックに常に入っていて、レジスターに入れることもできます。
64 ビット環境では、この域の長さは、引き数リストの長さまたは存在とは無関係に、最低でも 8 ダブルワードあります。 8 ダブルワードを超えて渡される場合は、現行スタック・ポインターからのオフセット 112 から始まる拡張リストが作成されます。
最初の 8 ダブルワードは、呼び出し点でレジスターに現れるだけで、スタックには現れません。残りのダブルワードはスタックに常に入っていて、レジスターに入れることもできます。