Rational Developer for System z
PL/I for Windows, Version 7.6, プログラミング・ガイド

SYSTEM リンケージの使用例

以下の例は、わかりやすく例示するためにのみ記載されたものであり、最適化されていません。この例では、ユーザーがアセンブラーのプログラミングに習熟している ことが前提になっています。この例では、スタックはページの下方へ伸びていきます。また、ESP は常に、スタックの上部を指します。

以下の例は、2 つのローカル変数 x および y (両方とも fixed bin(31)) を持つ 関数 FUNC3 に対する呼び出しのときの、コード・シーケンスおよびスタックの図を示しています。次の呼び出しの場合、

 dcl func3 entry( fixed bin(31),
                  fixed bin(31),
                  fixed bin(31) )
     returns( fixed bin(31) )
     options( byvalue nodescriptor linkage(system) );

  m = func3(a,b,c);

FUNC3 に対する呼び出しのスタックは次のようになります。

                                     スタック

                           .------------------------.       上位メモリー
                           |           c            |
                           |------------------------|
                           |           b            |
                           |------------------------|
                           |           a            |
                           |------------------------|
                           |     呼び出し側の EIP     |
                           |------------------------|
                           |     呼び出し側の EBP     |
           EBP  ------>    |------------------------|
                           |           x            |
                           |------------------------|
                           |           y            |
                           |------------------------|   <-.
                           |       保管 EDI          |     |
                           |------------------------|     | これらは、この
                           |       保管 ESI          |     | 関数で使用される
                           |------------------------|     | 場合のみプッシュ
                           |       保管 EBX          |     | されます。
           ESP  ------>    .------------------------.   <-.
                                                            下位メモリー

スタック上にこの活動化レコードを作成するのに使用される命令は、呼び出し側では次のようになります。

      PUSH    c
      PUSH    b
      PUSH    a
      MOV     AL, 3H
      CALL    func3
          .
          .
      ADD     ESP, 12    ; Cleaning up the parameters
          .
          .
      MOV     m, EAX
          .
          .

呼び出し先では、コードは次のようになります。

func3 PROC
      PUSH    EBP
      MOV     EBP, ESP           ;  Allocating 8 bytes of storage
      SUB     ESP, 8             ;   for two local variables.
      PUSH    EDI                ; These would only be
      PUSH    ESI                ;  pushed if they were used
      PUSH    EBX                ;  in this function.
      .
      .
      MOV     EAX, [EBP - 8]    ; Load y into EAX
      MOV     EBX, [EBP + 12]   ; Load b into EBX
      .
      .
      XOR     EAX, EAX           ; Zero the return value
      POP     EBX                ; Restore the saved registers
      POP     ESI
      POP     EDI
      LEAVE                      ; Equivalent to  MOV   ESP, EBP
                                 ;                POP   EBP
      RET
func3 ENDP

保管レジスター・セットは EBX、ESI、および EDI です。その他のレジスター (EAX、ECX、および EDX) は、呼び出し先ルーチンによって変更された内容を持つことができます。

状況によっては、コンパイラーは、EBP を使用せずに自動値またはパラメーター値に アクセスするため、アプリケーションの効率が向上する場合があります。使用されるかされないかに 関係なく、EBP は呼び出しを超えては変更されません。

値によって集合を受け渡す場合、コンパイラーは、80386 スタック上に集合をコピーするコードを生成します。 集合のサイズが 80386 のページ・サイズ (4K) より大きい場合、コンパイラーは、集合を逆方向にコピーするコードを生成します (つまり、集合の最後のバイトが最初にコピーされます)。

集合はスタック上には戻されません。呼び出し側は、戻される集合が置かれるアドレスを、最初の隠しパラメーター字句としてプッシュします。 集合を戻す関数は、すべてのパラメーターが、集合が戻されない場合のパラメーターよりも、EBP から 4 バイト遠くに 離れるように注意する必要があります。戻される集合のアドレスは、EAX に戻されます。


Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)