関数呼び出しのリンケージ規約

64 ビット・モードでは、1 つの ルーチンに、2 つのシンボルが関連付けられています。 それらは関数記述子 (name) と入り口点 (.name) です。 ルーチンが呼び出されると、プログラムはその入り口点に直接分岐します。 適切なレジスターへのパラメーター (存在する場合) のロードを除くと、 コンパイラーは関数への呼び出しを以下の 2 つの命令に文字列の形で 展開します。

       BL    .foo                # Branch to foo
       ORI R0,R0,0x0000          # Special NOP

リンカーは、BL 命令を検出すると、以下の 2 つの内のいずれかを行います。

  1. foo が (同一オブジェクト・モジュール外に) インポートされると、リンカーは .foo への BLfoo.glink (グローバル・リンケージ・ルーチン) への BL に 変更して、.glink をオブジェクト・モジュールに挿入します。 また、NOP 命令 (ORI R0,R0,0x0000) が BL 命令の直後にあると、 リンカーは LOAD 命令を NOP 命令 L R2, 20(R1) に置き換えます。
  2. foo が呼び出し元と同じオブジェクト・モジュールにバインドされていて、LOAD 命令 (32 ビットの場合は L R2,20(R1)、64 ビットの場合は L R2,40(R1)) または ORI R0,R0,0BL 命令の直後にあると、リンカーは LOAD 命令を NOP (ORI R0,R0,0) に置き換えます。
注:
エクスポートの場合は常に、リンカーはプロシージャーの 記述子をオブジェクト・モジュールに挿入します。

関数を指し示すポインター

64 ビット・モードでは、関数ポインターは、 値の範囲がプロシージャー名にまで及んでいるデータ型です。 このタイプの変数は、C や Fortran などのいくつかのプログラム言語に見られます。 Fortran で、EXTERNAL ステートメントにある仮引き数は関数ポインターです。 Fortran は、呼び出しステートメントのターゲット、またはこのようなステートメントの実引き数の文脈で、 関数ポインターの使用をサポートします。

関数ポインターは、関数記述子のアドレスである 1 フルワードです。 関数記述子は、3 ワードのオブジェクトです。 最初のワードはプロシージャーの入り口点のアドレスを含んでいます。 2 番目のワードはプロシージャーがバインドされるオブジェクト・モジュールの TOC のアドレスを持っています。 3 番目のワードは Fortran 以外の言語用の環境ポインターです。 関数記述子は、1 つの入り口点につき 1 つしかありません。 関数が外部関数である場合は、関数記述子は自分が識別するのと同じオブジェクト・モジュールにバインドされます。 記述子は外部名を持っていて、この外部名は関数名と同じですが、それを一意に識別する異なるストレージ・クラスを 持っています。 この記述子名が、すべてのインポートまたはエクスポート操作で使用されます。

関数値

関数は型に従って値を戻します。

スタック・フロア

64 ビット・モードでは、 スタック・フロアとは、スタックがそれより下に広がることが できないシステム定義のアドレスです。 システム内のすべてのプログラムは、スタック・フロアより下にあるスタック・セグメント内の位置へのアクセスを 回避する必要があります。

すべてのプログラムは、スタックに関連した他のシステム不変量を保守する必要があります。

スタック・オーバーフロー

リンケージ規約では、オーバーフローのための明示的なインライン・チェックは必要ありません。 オペレーティング・システムは、記憶保護機構を使用して、スタック・セグメントの終わりを超える保管を検出します。 IBM Copyright 2003