カレントTCB、ASCBのポイント
カレントTCB、ASCBをポイントする方法
実行中のプログラムが自分自身のTCBもしくはASCBアドレスを求めるには次のようなコーディングが伝統的に行われてきた。
L R3,CVTPTR LOAD CVT ADDRESS USING CVTMAP,R3 ADDRESS IT : L R1,CVTTCBP LOAD TCB/ASCB POINTERS L R4,4(,R1) GR4 -> OUR TCB L R7,12(,R1) GR7 -> OUR ASCB : : CVT DSECT=YES :
これはCVTTCBPフィールドがポイントするダブルワードの領域(IEATCBP)に、次に実行されるタスクと現在実行中のタスクのTCBアドレス、続くフィールドに次に実行されるタスクと現在実行中のタスクのASCBアドレスが格納されているからである。このダブルワードの領域はPSA内に存在し、次のような構造になっている。
x218番地+----------------------------+ CVTTCBP --> +00 I 次に実行されるTCBアドレス I +----------------------------+ +04 I 現在実行中のTCBアドレス I +----------------------------+ +08 I 次に実行されるASCBアドレス I +----------------------------+ +12 I 現在実行中のASCBアドレス I +----------------------------+ なのでCVTTCBPを経由せずに直接PSAを参照する方法もある。 USING PSA,0 ADDRESS TO PSA L R4,PSATOLD GR4 -> OUR TCB L R7,PSAAOLD GR7 -> OUR ASCB : : IHAPSA DSECT=YES :
MSPにおける注意点
初期のMVSの頃からの仕様なので、MSPもVOS3も同じように思えるが、意外にもMSPでは若干の違いがある。MSPのCVTTCBPフィールドがポイントするダブルワードの領域(KAATCBP)には、次に実行されるタスクと現在実行中のタスクのTCBアドレスが格納されているが、ASCBに関しては続くダブルワードの領域ではなく、KAATCBPの直前のダブルワードの領域に格納されている。
MSPの場合 +----------------------------+ -08 I 次に実行されるASCBアドレス I +----------------------------+ -04 I 現在実行中のASCBアドレス I x218番地+----------------------------+ CVTTCBP --> +00 I 次に実行されるTCBアドレス I +----------------------------+ +04 I 現在実行中のTCBアドレス I +----------------------------+
そのためコーディングは次のように修正しなければならない。
L R3,CVTPTR LOAD CVT ADDRESS USING CVTMAP,R3 ADDRESS IT : L R1,CVTTCBP LOAD TCB/ASCB POINTERS L R4,4(,R1) GR4 -> OUR TCB SH R1,=H'4' CORRECT TO ASCB POINTER L R7,0(,R1) GR7 -> OUR ASCB : : CVT DSECT=YES :
CVTのマクロ名やCVTTCBPのフィールド名は同じだし、TCBとASCBのポインターフィールドは名前でなくオフセットで参照するので、アセンブルは通ってしまいますが、MSPではMVSと同じロジックでASCBを求めるとまったく違う領域(MSPではロックマネージャーの入口点アドレスが入っている)をポイントしてしまう。
CVTTCBPを経由せずに直接PSA(FLC)を参照する方法ならコーディング上は同じにできるが、PSAAOLDが示すPSA内のフィールド・アドレスはMVSとMSPでは異なることを知っておくべきである。そうしないとパッチ修正などの際に誤ったアドレスを指定しかねない。なお、VOS3に関してはMVSと同じである。
USING PSA,0 ADDRESS TO PSA L R4,PSATOLD GR4 -> OUR TCB L R7,PSAAOLD GR7 -> OUR ASCB : : IHAPSA , :
筆者が会社で担当していたプログラム製品はCVTTCBPを経由してポイントしていたが、筆者自身が開発したプログラムはほとんどが直接PSAを参照していた。どうせ同じならPSAを直に見る方がシンプルだと思っていたので。でもCVTTCBPを経由するのは理由があるはずで、昔聞いたときにはDOS/VSEとの違いを吸収するためとかでそうしてるみたいに言われた記憶があるけど今ひとつよく覚えていない。古くからアセンブラープログラミングしてる人ならご存じかも知れません。