z/OS 上では、リンケージに関して次の 2 つの重要な事実があります。
パラメーターがすべて byaddr である従来の PL/I アプリケーション の場合、関数にデフォルト・リンケージが使用される場合に生成される コードと、システム・リンケージが使用される場合に生成されるコードの 違いは、通常は問題になりませんでした。 ただし、パラメーターが byvalue である場合 (C および JAVA では これが通常) は、この違いによってコードが使えなくなる可能性があります。
実際には、パラメーターが byaddr である場合の違いは ほんの小さなものです。 図 80 では、デフォルト・リンケージを使用する 関数に対して生成されたコードと、 システム・リンケージを使用する関数に対して生成されたコードの違いは、 システム・リンケージ呼び出しの最終パラメーターの高位ビットがオン になっていることだけです。
この違いは、ほとんどのプログラムには透過的です。
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 はこれらの値のアドレスを指します。
この違いは、ほとんどのプログラムに透過的ではありません。
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