「メインフレーム・コンピューター」で遊ぼうこんな時代に今さらメインフレーム・コンピューターに取り組むハメになったみんなが助けあうサイトです。RSSWordPress.orgコスパのいい社内システムの作り方メインフレームを扱っていると、軽い開発やメンテナンスにリソースを割けない、しかし、BPCも考えねば。解決策のひとつがクラウドにおくFileMakerです。convention)とはプログラム間の呼び出しに関する取り決めです。規模の大きいプログラムはいくつかのモジュールに分割して、異なる人によって作成されたりします。各人が好き勝手に作っては上手く動きません。そこでプログラム間のインタフェースに共通のルールを作ります。MVSでもプログラム間のインタフェースに関して標準的な約束事を取り決めています。MVSで動作するプログラムはこの約束事に従って作ることが重要ですし、知っていなければ(守らなければ)正しく動くプログラムを作ることができません。タイトルには(サブルーチンを作る)とありますが、メインルーチンを作る場合でも同じ事です。アプリケーションとしてはメインルーチンであっても、MVSからは一種のサブルーチンとして扱われるのです。リンケージ規約はアーキテクチャーで定められたものではなく、使用するオペレーティング・システムによって取り決められます。MVSやVSE(MSP,VOS3,XSPも)などIBMメインフレーム系アーキテクチャーで動くOSは基本的に同じリンケージ規約が使われています。アプリケーションのみならず言語処理プログラムやユーティリティなどもリンケージ規約に従って作られています。OSや多くのミドルウェアなどもユーザープログラムに制御を渡す(呼び出す)際はリンケージ規約を守ります。リンケージ規約が取り決めているのは以下のプログラム間インタフェースです。入口点アドレス(GR15)他のプログラムを呼び出す際、呼び出し元プログラムは、呼び出すプログラムの入口点アドレスをレジスター15に格納して呼び出さなければなりません。呼び出されたプログラムはレジスター15に自分の入口点アドレスが格納されているものとして処理を行うことができます。(ペースアドレスの設定)入口点アドレスの先頭ビットは呼び出し先プログラムのアドレスモード(AMODE)を示します。正しいリンケージ手順であれば、呼び出された時点でPSWのアドレスモードは呼び出されるプログラムのAMODEに切り替わっています。復帰アドレス(GR14)他のプログラムを呼び出す際、呼び出し元プログラムは、呼び出すプログラムが自分に戻ってくるための復帰アドレスをレジスター14に格納して呼び出さなければなりません。呼び出されたプログラムは、処理終了後に呼び出し元へ戻る際、呼ばれた時点のレジスター14に格納されているアドレスを使って呼び出し元へ帰ることができます。復帰アドレスの先頭ビットは呼び出し元プログラムのアドレスモード(AMODE)を示します。正しいリンケージ手順であれば、呼び出された時点でレジスター14の先頭ビットには、呼び出し元のアドレスモードがセットされています。学習として24ビットモードのプログラムを作る場合、とりあえずアドレスモードについては意識しなくてもかまいません。GR15に入口点、GR14に復帰先のアドレスがセットされるのだ、と覚えて下さい。呼び出し元レジスター保管域(GR13)レジスターの保管はリンケージ規約の中でも重要です。呼び出されたプログラムは汎用レジスターを自分の処理のために自由に使ってかまいませんが、呼び出し元に戻る際には一部を除き復元しなければなりません。このためにリンケージ規約では「レジスター保管域」(またはレジスター退避領域)と呼ばれる18ワード(72バイト)の領域を使って使用するレジスターを保管することになっています。(CALLする方が用意する)呼び出されたプログラム側が保管する(サブルーチン側で使う(保管する))となります。(親が用意した領域を子供が使う)レジスター保管域は呼び出し元で用意し、その先頭アドレスをレジスター13に設定しておきます。呼び出されたプログラムは呼び出された時点のレジスター13が示すアドレスへ、自分のプログラムで使用するレジスターを保管しておき、戻る際にそこから復元しなければなりません。使うレジスター/使わないレジスターをいちいち選んで保管・復元するのは面倒なので、よほどの理由がない限りレジスター13以外のすべての汎用レジスターを保管します。レジスター15以外のすべてのレジスターを復元して呼び出し元へ戻ります。レジスター保管域は複数のプログラムで共用することはできません。呼び出されたプログラムがさらに別のプログラムを呼び出すならば、別のレジスター保管域を用意してレジスター13にて指し示す必要があります。通常は別のプログラム(サブルーチン)を呼ぶ/呼ばないに関わらず、新たなレジスター保管域を用意します。新たに用意した保管域の2番目のワードに、呼び出し元の保管域アドレスをセーブします。これは呼び出し元レジスター13の保管となります。新たな保管域のアドレスを呼び出し元保管域の3番目のワードにセーブします。このように呼び出し元と呼び出し先のレジスター保管域はチェインされます。プログラムに問題が発生した時、このチェインをたどることによって、どのモジュールがどういうレジスター内容で呼び出されたかを追跡することができるようになっています。+-------------------------------------------+パラメーターの通知(GR1およびGR0)パラメーターは個々のプログラムの処理内容によって大きさ、個数、内容がバラバラなので、規約として取り決めることはできません。パラメーターの通知については汎用的な方法が標準化されています。|↑記号は「○○○のアドレス」を示す。