10.SYSINとSYSOUTのI/O

By 神居 - Posted: 2008/11/12 Last updated: 2010/01/14 - Leave a Comment

CPU命令だけを使っていても、あまり面白くないし、実用的ではありませんね。それに「アセンブラーではI/Oをどうやって処理するのだろう?」と言うことにも触れなければなりません。誰かに呼ばれるだけのサブルーチンやOSの出口ルーチン(これもOSから呼ばれるサブルーチン)でなければ、プログラムにI/Oはつきものです。

プログラムの基本的なINPUTとOUTPUTはこう定義することができます。ここでは実際にこのように定義されたDD文に基づく入出力先に対するI/Oのやり方を覚えて下さい。基本的なI/Oはアセンブラーでも大して難しくありません。コードを書くことだけに関して言えばCOBOLと大差ないのです。


QSAM(待機順アクセス法)

QSAMは順次データセットをアクセスするためのMVSのAPIです。正確にはDFSMS/DFPと言うデータ管理コンポーネントが提供するAPIです。CPUには命令としてのI/O命令(SSCH:Start Sub CHannel)もあります。しかしこのI/O命令を使って一般のプログラムが入出力を行うことはありません。たとえ命令解説書を読んで理解したとしても決してやってはいけません。MVSではI/OはすべてOS自身が一元管理します。I/Oに関するOSの機能はいくつかの階層に分かれていますが、一般のプログラムは、DFPと言うもっともアプリケーション寄りのコンポーネントにQSAMなどのAPIを使ってI/Oを要求します。
このAPIを呼び出すために使われるのがマクロ命令です。マクロはアセンブラーの機能でいくつかの命令をまとめたもので、定型的な処理などを行うために使われます。マクロを使わず直接CPU命令でDFPのAPIルーチンを呼び出すこともできますが、一般的ではありません。最初は(ほとんどのケースで最後まで)マクロ命令を使って基本的なアクセスの仕方を覚えましょう。

QSAMではデータセットをレコード単位にアクセスできます。上のJCLではDD文でSYSINとSYSOUTを定義してますが、データセットそのものを定義してもかまいません。QSAMを使ってアクセスする限り、DD文から先の実際のデバイスに関してはプログラムで意識する必要がありません。
なお、ここで解説するQSAM APIは従来からある24ビットモードのAPIです。31ビットモード・サポートのAPIについては解説しません。24ビットモードAPIはMVS、MSPおよびVOS3それぞれ互換があります。


簡単ですがQSAMによるデータセット(SYSIN,SYSOUT)のアクセス方法を紹介しました。アセンブラービギナーがファイルのI/Oのために最初に使うのがQSAMです。理由はビギナーでもわかりやすい簡単なインターフェースだからです。そのためQSAMは初心者向きのEASYなアクセス法だと誤解されがちですが、決してそれだけではありません。QSAMはアクセス法の中でも高いI/Oパフォーマンスを持ちます。後ろへ戻ったり、レコードをスキップして読んだりなどの細かな制御はできませんが、順次にアクセスすれば良いのなら、初心者でもそれなりの高速で動くI/Oプログラムが作れます。中級レベルのスキルのプログラマーが作ったBSAMやEXCP(ブロック単位アクセス)のプログラムより、初心者が作ったQSAMのプログラム(レコード単位アクセス)の方が恐らく性能が高いでしょう。QSAMは手軽に利用できますが、実際は奥深いアクセス法でもあります。

ざっとまとめるとこんな感じのサンプルになります。処理したいデータをSYSINから読んで、実行結果をSYSPRINT(SYSOUT)に出すものです。
COBOLと比べてもOPENはOPEN、CLOSEはCLOSE、READがGET、WRITEがPUTとソースを書く手間は高級言語とほとんど変わりません。I/Oそのもののコードを書くこと自体はそれほどむずかしくないでしょう。

Posted in S/370アセンブラー講座 • • Top Of Page