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

リンケージ

z/OS 上では、リンケージに関して次の 2 つの重要な事実があります。

パラメーターがすべて byaddr である従来の PL/I アプリケーション の場合、関数にデフォルト・リンケージが使用される場合に生成される コードと、システム・リンケージが使用される場合に生成されるコードの 違いは、通常は問題になりませんでした。 ただし、パラメーターが byvalue である場合 (C および JAVA では これが通常) は、この違いによってコードが使えなくなる可能性があります。

実際には、パラメーターが byaddr である場合の違いは ほんの小さなものです。 図 80 では、デフォルト・リンケージを使用する 関数に対して生成されたコードと、 システム・リンケージを使用する関数に対して生成されたコードの違いは、 システム・リンケージ呼び出しの最終パラメーターの高位ビットがオン になっていることだけです。

この違いは、ほとんどのプログラムには透過的です。

図 80. パラメーターが BYADDR である場合のコード
      dcl dftv  ext entry( fixed bin(31) byaddr
                          ,fixed bin(31) byaddr );
      dcl sysv  ext entry( fixed bin(31) byaddr
                          ,fixed bin(31) byaddr )
                 options( linkage(system) );

      *      call dfta( n, m );
      *
                LA    r0,M(,r13,172)
                LA    r2,N(,r13,168)
                L     r15,=V(DFTV)(,r3,126)
                LA    r1,#MX_TEMP1(,r13,152)
                ST    r2,#MX_TEMP1(,r13,152)
                ST    r0,#MX_TEMP1(,r13,156)
                BALR  r14,r15
      *
      *      call sysa( n, m );
      *
                LA    r0,M(,r13,172)
                LA    r2,N(,r13,168)
                O     r0,=X'80000000'
                L     r15,=V(SYSV)(,r3,130)
                LA    r1,#MX_TEMP1(,r13,152)
                ST    r2,#MX_TEMP1(,r13,152)
                ST    r0,#MX_TEMP1(,r13,156)
                BALR  r14,r15

ただし、パラメーターが byaddr でなく byvalue の 場合は、大きな違いがあります。 図 81 で、デフォルト・リンケージを使用する関数 の場合は、レジスター 1 は渡される整数の値を指します。一方、 システム・リンケージを使用する関数の場合は、 レジスター 1 はこれらの値のアドレスを指します。

この違いは、ほとんどのプログラムに透過的ではありません

図 81. パラメーターが BYVALUE である場合のコード
      dcl dftv  ext entry( fixed bin(31) byvalue
                          ,fixed bin(31) byvalue );
      dcl sysv  ext entry( fixed bin(31) byvalue
                          ,fixed bin(31) byvalue )
                 options( linkage(system) );

      *      call dftv( n, m );
      *
                L     r2,N(,r13,168)
                L     r0,M(,r13,172)
                L     r15,=V(DFTV)(,r3,174)
                LA    r1,#MX_TEMP1(,r13,152)
                ST    r2,#MX_TEMP1(,r13,152)
                ST    r0,#MX_TEMP1(,r13,156)
                BALR  r14,r15
      *
      *      call sysv( n, m );
      *
                L     r1,N(,r13,168)
                L     r0,M(,r13,172)
                ST    r0,#wtemp_1(,r13,176)
                LA    r0,#wtemp_1(,r13,176)
                ST    r1,#wtemp_2(,r13,180)
                LA    r2,#wtemp_2(,r13,180)
                O     r0,=X'80000000'
                L     r15,=V(SYSV)(,r3,178)
                LA    r1,#MX_TEMP1(,r13,152)
                ST    r2,#MX_TEMP1(,r13,152)
                ST    r0,#MX_TEMP1(,r13,156)
                BALR  r14,r15

Terms of use | Feedback

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