z/OS V2R3から実行プログラムのロード・モジュール(プログラム・オブジェクト)も2GBバーの上に配置できるようになっています。ソース・コードではCSECTに対してAMODE命令とRMODE命令で64を明示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
&MDLNM SETC 'MAINPROG' SET THIS MODULE NAME &MDLNM CSECT , DEFINE CONTROL SECTION &MDLNM AMODE 64 DEFINE DEFAULT AMODE=64 &MDLNM RMODE 64 DEFINE DEFAULT RMODE=64 USING &MDLNM,R12 DEFINE OUR BASE REGISTER=R12 BAKR R14,0 STACK(SAVE) ALL GPRS AND PSW LARL R12,&MDLNM ESTABLISH OUR BASE REGISTER + GR12 --> OUR BASE ADDRESS + GR13 --> RSA(POINTED BY TCBFSA) *********************************************************************** * MAIN LINE PROCESSING * *********************************************************************** MAINPROC DS 0H EX 0,* ABENDS0C3 AT HERE : *********************************************************************** ENDPROC DS 0H SLR 15,15 SET CC=0 PR , RESTORE GR2-GR14 FROM STACK AND+ RETURN TO CALLER *********************************************************************** * DATA AREA * *********************************************************************** DS 0D DC CL8'DATAAREA' EYE-CATCHER DWORD DC F'0' DOUBLE WORD WORKAREA WORKAREA DC XL256'00' 256BYTES WORKAREA : *********************************************************************** YREGS , EXPAND GPR EQUATIONS END |
ロード・モジュールの生成時はCSECTに対するAMODEとRMODE命令での64を明示しただけではだめで、バインダー・オプションでもRMODE=64もしくはRMODEX=64TRUEを追加指定します。
1 2 |
//LKD EXEC PGM=IEWL, // PARM=('LIST,LET,MAP,XREF,RMODE=64') |
上記のサンプル・コードでは実行開始直後に故意にS0C3ABENDさせていますが、ベース・レジスターに設定したGR12の内容を見ると、入口点アドレスはx00000050_00010000になっていて確かに2GBバーの上の64ビット領域(HV-PRIVATE)にローディングされていることがわかります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SYSTEM COMPLETION CODE=0C3 REASON CODE=00000003 TIME=15.28.53 SEQ=00034 CPU=0000 ASID=0025 PSW AT TIME OF ERROR 07850001 80000000 00000050_0001000E ILC 4 INTC 03 ACTIVE MODULE ADDRESS=00000050_00010000 OFFSET=0000000E NAME=ASMRM64 DATA AT PSW 00000050_00010008 - FFFE4400 C00A1FFF 01010000 GR 0: 00000000_00000064 1: 00000000_00006FF8 2: 00000000_00000040 3: 00000000_00BD9D6C 4: 00000000_00BD9D48 5: 00000000_00BF8588 6: 00000000_00BC3FC8 7: 00000000_00F97380 8: 00000000_00BFC7F8 9: 00000000_00BF8190 A: 00000000_00000000 B: 00000000_00000000 C: 00000050_00010000 D: 00000000_00006F60 E: 00000000_00FD8E28 F: 00000000_FFFFF002 END OF SYMPTOM DUMP |
AMODE=64ではGR15には入口点アドレスは格納されない
AMODE=64が指定されたプログラムがタスクの最初のプログラムとして実行される時、その実行開始時のGR15には入口点アドレスは入っていません。RMODEに関わらずAMODE=64であればです。従来のリンケージ規約に基づいてGR15に入口点アドレスが入っているものとしてベース・レジスター内容を確立することはできません。LARL命令等でベース・アドレスを直接格納します。なお、AMODEが31または24の他のモジュールから呼び出される場合のGR15には64ビットで入口点アドレスが入っていますが、その最下位ビット(ビット63)は1になっています。そのままではベース・アドレスとしては使用できません。ビットを落とせばベース・アドレスにできますが、そのようなことをするならLARL命令で自らベース・アドレスを確立する方がいいでしょう。