パラメーター3...として呼ばれたプログラムは上記のフォーマットでパラメーターが渡ってくる。パラメーターは1つであれ、複数であれ、その値が格納された領域のアドレスを、渡す順番にフルワードの領域に並べて格納します。パラメーターのアドレスが格納された領域を「アドレスパラメーターリスト」と呼びます。C言語におけるポインターです。ポインターと聞いてもくじけないで下さい。S/370アセンブラーでのアドレスの使い方は、C言語のポインター演算や定義よりはるかにシンプルかつ単純です。C言語のポインターに挫折した方はS/370アセンブラーでのアドレスの使い方を覚えた後、再度チャレンジして見て下さい。次は理解できると思います。アドレスパラメーターリストは可変長のフルワード領域で、パラメーターの個数*4バイトの長さを持ちます。最後(1つであれば最初の)のパラメーター領域のアドレスを示すワードの先頭ビットを1にすることで、呼び出されたプログラムは何個のパラメーターが指定されたかを知ることが出来ます。呼び出し元プログラムはアドレスパラメーターリスト自身のアドレスをレジスター1に入れて、サブルーチンを呼び出します。アセンブラープログラム同士であれば、レジスター0に追加のパラメーターを入れて通知することもあります。MVSやDFPのAPIサービスではこのようなパラメーター通知の方法を採るものもあります。リンケージ規約の中でもこれまでに出てきたGR13からGR15で指定する、入口点アドレスと復帰アドレスの通知、レジスター保管域の使用、に比べるとアドレスパラメーターリストによるパラメーターの通知方法は絶対に守らなければならないものではありません。アプリケーションなら独自のパラメーター通知方法を使ってもかまいませんし、4バイト以下のパラメーターなら、アドレスではなく値そのものを、アドレスパラメーターリストの中に入れてしまうことも行われます。他言語から呼び出されるアセンブラールーチンや、汎用的なAPIルーチンやユーティリティのようなプログラムを作るなら、できるだけこのフォーマットによるパラメーター通知方法を設計した方がいいでしょう。COBOLなどの言語環境プログラム、OSの各種ユーティリティなどもこのフォーマットに沿ってパラメーターを処理しています。可変長JCLのEXEC文のPARMパラメーターで指定したパラメーター文字列はこの図のように渡されます。PARMパラメーターが省略されても同じです。その場合、文字列の長さが0で通知されます。これは必ず必要になりますから是非覚えてください。復帰コードの通知(GR15)プログラム処理の結果の1つである復帰コードはレジスター15に入れて呼び出し元に通知します。レジスター15は入口点アドレスで使われますが、呼び出し元へ帰る際は不要です。よってMVSではGR15を復帰コードの通知レジスターとして使用します。COBOLなどのコンパイラー言語から呼び出された場合でもレジスター15へ復帰コードを設定します。復帰コードはコンパイラーの実行時ライブラリによって、然るべき変数(RETURN-CODEなど)に設定されます。プログラムがEXEC文のPGMパラメーターで指定されて実行されたジョブステップタスクのメインプログラムであれば、レジスター15に設定された値は完了コードとなります。リンケージ規約で使用するGR0,1およびGR13,14,15の各レジスターはリンケージレジスターとも呼ばれます。これらのレジスターはプログラム間リンケージで重要な役割を果たすため、壊してはならないと後生大事に抱えているビギナー・プログラマーをたまに見かけますが、プログラムの冒頭で保管域にセーブしているのですから自由に使ってかまいません。それにMVSやDFPのサービスを呼び出せばどうせ壊れます。レジスター13以外の0,1,14,15番レジスターは作業用のワーキング・レジスターです。積極的に使いましょう。:&#9312呼び出し元レジスター14,15,0から12を保管。&#9313入口点アドレスを自分のベースレジスターにセット。&#9314呼び出し元の保管域アドレスを退避。(この時点でGR15は不要となっている)&#9315レジスター13に自分のレジスター保管域のアドレスをセット。&#9316呼び出し元保管域のアドレスを、自分のレジスター保管域の第2ワードに退避。(呼び出し元レジスター13の保管)&#9317自分の保管域アドレスを呼び出し元保管域の第3ワードにセット。PARMパラメーター領域のアドレスをロード、GR14と15にパラメーター文字列のアドレスと長さをセット。&#9319復帰コード(完了コード)をレジスター15にセット。&#9320呼び出し元レジスター保管域のアドレスをロード。(レジスター13の復元)&#9321レジスター15を除く呼び出し元レジスターを保管域から復元。(レジスター14,0?12)&#9322呼び出し元プログラムへ戻る。&#9323自分のレジスター保管域の定義。例では初期値-1としているが0でもかまわない。このプログラムはEXEC文のPARMパラメーターで指定されたパラメーター文字列を、コンソールに表示する簡単なプログラムです。10,SHOWPARM命令でSHOWPARMサブルーチンを呼び出してパラメーターをコンソールに表示し、復帰コード0を設定して呼び出し元(MVSのジョブ管理ルーチン)に戻ります。CSECTアセンブラー命令以下、&#9317までの処理がリンケージ規約に基づく最初のセットアップ処理です。ハウスキーピング処理とも呼ばれます。何種類かの方法がありますが、リンケージ規約に合っていれば、使う命令や順序などに決まりはありません。&#9319以降は呼び出し元への復帰処理ですが、これも重要なのは、レジスターを呼び出された時の状態に復元する、と言うことです。レジスターを元に戻さずに復帰してしまうと、呼び出し元は正しく処理を継続できません。リンケージ規約によるハウスキーピングの処理には複雑な命令は必要ありません。「マシン命令入門」で紹介した基本となる何種類かの命令でロジックが作れます。プログラムの規模や内容に関係なく、とにかく絶対必要な処理なのでしっかりと覚えて下さい。ここまでくれば、実際にMVSで動かすプログラムを書き始めることができます。使ってない命令やOSのサービスAPIなどたくさんありますが、残りは必要に応じて調べて行けばいいのです。次回からは計算や文字処理、分岐とループなどプログラミングっぽいテーマで解説します。