RENT オプションを指定してコードをコンパイルした場合、 静的変数は、現行のロード・モジュールの WSA (書き込み可能静的区域) に配置されます。 WSA 内での変数のオフセットは、MAP オプションを指定した出力から検出することができ、WSA は CAA という言語環境プログラム制御ブロックの中に保持されます。 WSA の値は、言語環境プログラム・ダンプにもリストされます。
ただし、NORENT オプションを指定してコードをコンパイルした場合、EXTERNAL STATIC は通常どおり (リンカー・リストおよびコンパイラーの MAP オプションの出力を使用して) 検出されます。 INTERNAL STATIC は、言語環境プログラム・ダンプの一部としてダンプされます (PLIDUMP が B オプションを指定して呼び出された場合)。
旧 PL/I コンパイラーと異なり、STATIC のアドレスは、いずれか 1 つのレジスターを占有することは ありません。
例えば、上記のプログラムで、変数を STATIC に変更したとします。
Compiler Source
Line.File
2.0 test: proc options(main);
3.0
4.0 dcl a fixed bin(31) static;
5.0 dcl b fixed bin(31) static;
6.0
7.0 on error
8.0 begin;
9.0 call plidump('TFBC');
10.0 end;
11.0
12.0 a = 0;
13.0 b = 29;
14.0 b = 17 / a;
NORENT オプションを指定してコンパイルすると、このプログラムに対するコンパイラー MAP オプションの結果は、実際には右側にもう 1 つ列 があること、列の間のスペースはもっと離れていることを除き、以下のようになります。
* * * * * S T O R A G E O F F S E T L I S T I N G * * * * * IDENTIFIER DEFINITION ATTRIBUTES A 1-0:4 Class = static, Location = 0 : 0x0 + CSECT ***TEST2 B 1-0:5 Class = static, Location = 4 : 0x4 + CSECT ***TEST2
したがって、A はコンパイル単位 TEST の静的 CSECT の中の 16 進オフセット 00 の位置にあり、B は 16 進オフセット 04 の位置にあることになります。
このプログラムでは PLIDUMP が B オプションを指定して呼び出されているため、 現行の呼び出しチェーン内のそれぞれのコンパイルごとに、静的ストレージ の 16 進ダンプが含まれています。 これは、以下のようになります(これも、右側の列が 省略されています)。
Static for procedure TEST Timestamp: 2004.08.12
+000000 0FC00AA0 00000000 0000001D 0FC00DC8 0FC00AC0
+000020 0FC00AC0 0FC00AA8 00444042 00A3AE01 0FC009C8
+000040 0FC00AE0 6E3BFFE0 00000000 00000000 00000000
+000060 0FC00B00 00000000 00000000 00000000 00000000
+000000 0AD963C8 10000000 0AD96188 00000000 00000000
したがって、16 進オフセット 00 にある A は (予想通りの) 16 進値 00000000 を持ち、16 進オフセット 04 にある B は (これも予想通りの) 16 進値 0000001D、つまり 10 進値 29 を持つことになります。