アセンブラー学習用ひな型プログラム

By 神居 - Posted: 2008/10/15 Last updated: 2017/01/09 - Leave a Comment

これから汎用機のアセンブラーに関してプログラミングを覚えようとする方向けに、基本的な命令の動きや、レジスターやメモリーに設定した内容を簡単に見るためのひな型プログラムを用意しました。JCLと一体になっているので必要な命令とデータを記述してサブミットすれば、実行結果をSYSOUTに出力できます。
z/OS(MSPやVOS3を含む)で実際に動かせるアセンブラープログラムを作るには、単に実行させたい命令やデータを書くだけでは済みません。OSから呼び出された時点での最低限必要な手続きや、実行結果の編集・出力が必要になります。そのためには、OSやデータ管理のAPIも合わせて学ばねばなりません。あるいは、実行させたい命令の直後でわざとABENDさせてダンプを出力し、そのダンプリストからレジスターやメモリーの内容を見るかです。どちらの方法も、全くのビギナーには少々敷居が高いです。
このひな型を使えば、純粋に試して見たい命令やデータを書くだけでテストすることができます。そのため、基本的な命令の動きを実際に動かして理解してから次のステップへ進むことが出来ます。書いたプログラムに誤りがあればそのプログラムは異常終了しますが、どの命令が誤っているのかなどを調べるにはダンプの解析が必要で、これも面倒な作業です。このひな型では基本的な機械命令の使用誤りに関しては、異常終了をトラップしてメッセージで通知します。正常であれ、エラーであれ、記述した命令とデータによってCPUが何を行い、メモリー内容がどう変わったかを簡単に見ることができるようにしてあります。


z/OSの他、フリーで利用できるMVS3.8、MSPおよびVOS3でも実行できます。z/OS以外で試したい方は、ダウンロード後にJCLのアセンブラーとローダーのステップを、各OSに合わせて修正してください。制御部分のコードが使っているOSのAPIは古典的なものなので互換OSであるMSPとVOS3でもプログラム自体はそのまま動かすことができます。


ひな型プログラムJCLの使い方

このひな型自身はJCLになっています。JCLのストリーム内データセットとしてアセンブラー言語のプログラムが記述してあり、その中の指定された部分に試してみたい命令とデータを書いてサブミットすれば実行されます。コーディングの構文に誤りがあれば、アセンブルのステップでエラーになりジョブは終了します。アセンブルが通れば続いてローダーが実行されロードモジュールが作成されてプログラムが実行されます。
予め用意されたひな型コードの先頭、最後の命令の直後、プログラムの終わり、の3箇所にアセンブラー学習用として動くための制御コードを埋め込むマクロ命令が記述されています。このマクロ命令の記述は変更しないで下さい。マクロ命令とひな型プログラムJCLのメンバー・データをダウンロードして適当なデータセットに格納すれば実行できます。

このひな型プログラムは、基本的な命令の動きを学習するレベルのプログラムを前提に作ってあります。OSのAPIを呼び出したり、データセットのアクセスをしたりの少しレベルの高いプログラムも記述は可能ですが、そのような箇所でエラーが起きても正しくトラップしたり、実行結果を出力させたりすることはできません。自力でABENDダンプなどを解析する必要があります。おそらくそのようなプログラムが書けるレベルになればこのひな型はもう不要でしょう。また、このひな型で制御できるのは24ビット・モードのプログラムです。ひな型をそのまま使えば24ビット・モードのプログラムになります。プログラム内で直接アドレッシング・モードを変更するような命令を使わない限りアドレッシング・モードは気にしなくてもいいです。


アセンブル・リストと実行結果の見方

アセンブラー言語でのプログラミングにおいてはアセンブル・リストは非常に重要です。細かな見方はマニュアルを見るとして、まずは自分が書いた命令やデータがプログラム内のどの位置に置かれ、どのようなバイナリーコードに変換されたかぐらいはわかるようにしてください。このぐらいはマニュアルを見なくてもリストを見れば簡単にわかります。COBOLやC言語などと違ってアセンブラーではアセンブル・リストがなければデバッグできないと言っても過言ではありません。アセンブル・リストはASMステップのDD名SYSPRINTのSYSOUTに出力されます。

このひな型プログラムにおける実行結果は、プログラム(@EDUCNTL EXITマクロの直前の命令)の終了時点における完了コード(GR15の値)、汎用レジスターの内容とメモリーの内容です。
メモリー内容は、書かれた命令コードとデータの部分がダンプ形式で出力されます。出力先はGOステップのDD名SYSPRINTのSYSOUTです。


プログラムが異常終了した場合

プログラムに誤りがあって異常終了(ABEND)すると、プログラムの実行は停止されます。

ABENDEDに続くS0CxがABENDコードです。システム・コードのマニュアルを見て原因を調べます。S0C4ならメモリーのアクセス違反、S0C7はデータ例外、S0C9なら0で除算しようとしたです。OFFSETが示す値はプログラムのどこでABENDしたかを示すオフセット値です。+073Aであれば、プログラムの先頭からx73A番地の直前の命令でABENDしたことを示します。分岐命令を間違えプログラム外のとんでもない所へジャンプしたような場合、オフセットは正しく表示されない場合があります。飛び先をラベルでなくレジスターで指定する場合は十分に注意して下さい。オフセットがどの命令に対応するかはアセンブル・リストを見れば簡単にわかります。なぜそれがエラーになるのかは、機械語命令のマニュアルやリファレンスなどを参考にして調べます。
ABENDして実行が停止しても実行結果は出力されています。汎用レジスター2から15の値やメモリーの内容はABENDした時点の内容です。


簡単なサンプル①(太字の部分が記述したコードとデータ)


簡単なサンプル②(ABENDする例)

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