RMODE=64

z/OS V2R3から実行プログラムのロード・モジュール(プログラム・オブジェクト)も2GBバーの上に配置できるようになっています。ソース・コードではCSECTに対してAMODE命令とRMODE命令で64を明示します。

ロード・モジュールの生成時はCSECTに対するAMODEとRMODE命令での64を明示しただけではだめで、バインダー・オプションでもRMODE=64もしくはRMODEX=64TRUEを追加指定します。

上記のサンプル・コードでは実行開始直後に故意にS0C3ABENDさせていますが、ベース・レジスターに設定したGR12の内容を見ると、入口点アドレスはx00000050_00010000になっていて確かに2GBバーの上の64ビット領域(HV-PRIVATE)にローディングされていることがわかります。

    AMODE=64ではGR15には入口点アドレスは格納されない

    AMODE=64が指定されたプログラムがタスクの最初のプログラムとして実行される時、その実行開始時のGR15には入口点アドレスは入っていません。RMODEに関わらずAMODE=64であればです。従来のリンケージ規約に基づいてGR15に入口点アドレスが入っているものとしてベース・レジスター内容を確立することはできません。LARL命令等でベース・アドレスを直接格納します。なお、AMODEが31または24の他のモジュールから呼び出される場合のGR15には64ビットで入口点アドレスが入っていますが、その最下位ビット(ビット63)は1になっています。そのままではベース・アドレスとしては使用できません。ビットを落とせばベース・アドレスにできますが、そのようなことをするならLARL命令で自らベース・アドレスを確立する方がいいでしょう。