読者です 読者をやめる 読者になる 読者になる

外資系戦略コンサルタントの思考と興味

デジタルとビジネスと人の関わりについて、考えごとをしています

IBMシステム・アセンブラ言語 学習メモ2

プログラミング

第1回のトピック

基本命令の種類を知る
PSWと命令の関係
ブランチ命令の役割
条件コード

以降、第2回分です。


まだまだ、コードは書けません。
といいつつ、そろそろサンプルを書いてみないと、まずそうです。
明日のUPDATEでは、いくつか実行したサンプルをご紹介できればと思います。

ブランチ命令と条件コード

内容としては、前回のおさらいです。

プログラムの流れを制御するには、条件ブランチをうまく使っていく必要がある。
この役目を負うのがPSW。条件コードとして、命令の実行結果についての状態を保持している。
そこを確認することで、プログラムをブランチさせたり順次で実行したりと、様々な判断ができる。

条件合致の表現には、マスクが使用できる。
6とすれば、4と2(条件コード1,2)の両方のステータスになった場合を指定できる。

命令のビット位置     8 9 10 11
マスク 8 4 2 0
条件コード 0 1 2 3

こうしてみると、FTPの権限設定みたいだな、と。

割り込み

IBMシステムでは、6種類の割り込みがある。

  • 外部割り込み
  • 監視プログラム呼び出し割り込み
  • プログラム割り込み
  • 機械チェック割り込み
  • 入出力割り込み
  • 再始動割り込み

割り込みが発生すると、CPUは現PSWを新PSWに置き換えて、割り込み処理を行う。
そのため、新PSW(6種類)はメモリー上の固定位置に配置されている。*1
PSWの命令アドレス部には、割り込み処理ルーチンの最初のアドレスがセットされている。
それでは、処理再開のための情報はどうするのかというと、現PSWをメモリー上に退避しておくわけだ。
置き換えられたPSW(旧PSWと呼ぶ)はメモリー上の固定位置に保管される。アドレス8-15と24-63が旧PSWのための区域である。
割り込み処理が完了すると、ここから旧PSWを持ってきて、現PSWとして、処理を再開できる仕組みになっている。

と書き綴ったものの、プログラマーがコードを書く際には、ハードウェア処理として機能されるため、これらに対して注意を払う必要はない。


記号コードとアセンブル*2

?原始プログラム ←ソースコード

?アセンブル機械語へ翻訳し、オブジェクトコード作成
|  エラーがあれば、メッセージを出力

?目的プログラム ←オブジェクトデータ

?連係編集 ←実行に必要なその他のモジュールを取り込む

?ロードモジュール ←実行可能なモジュール


アセンブル時に出力できるアセンブル・リストは記憶域のアドレスをリストしたもの。ソースコードと変換内容(16進数)も並ぶ。ソースコードに不具合がある場合には、これをヒントにデバッグすることに。

ただし、この記憶位置アドレスはアセンブリ段階の相対的なアドレスであるため、プログラムが動作するときのアドレスとは異なる。

コーディングルール

名前 演算 オペランド 継続

12345678910111213141516--------7172

※9、15行は記述しない

以下、用語のメモ。

アドレス * :現在いるアドレスを示す総称

Example1:自分のアドレスの8番地先のアドレスへブランチする

HAJIME EQU *+8


相対アドレス指定:「*」やラベルを基準にして、一緒に正または負の数を使用してアドレスを表現したもの

基底レジスタと変異の指定

  • 再配置可能とは?


各命令のアドレスがすべて基底アドレスと変位で表現されていれば、プログラムがメモリに配置されたアドレスを基底とすることで、どのアドレスにおかれても動作することができる

  • USING命令


☆第2オペランドで指定した汎用レジスタを基底レジスタとして使用することを、アセンブラに指示する命令
☆第1オペランドには、通常、再配置可能であれば*(プログラムの最初のアドレス)を指定する
アセンブラ命令であり、目的プログラムにならず、また記憶装置のスペースも取らない
USINGを使っただけでは、基底アドレスを定義しただけで、何の値も取り込めないので、別命令でセットする
→通常は、BALR命令を使用する

  • BALR命令


機械機会命令のアドレスを第1オペランドへセットした後、第2オペランドで指定したアドレスへブランチする
第2オペランドは0の場合は、次の機械命令を実行する
※この機能で、基底レジスタをセットする

  • START


通常、先頭に書き、プログラムに名前をつける
CSECTで制御セクションの開始としてもできる。
セクションを分断(途中に違うセクションを記述)することもできるが、煩雑なのでそれはないだろう。
そもそもサブルーチン開発もできる。

  • END


通常、プログラムをロードした後、最初に実行する命令のアドレスを入れる。

  • DS


記憶域の定義

  • DC


記憶域の定義と同時に定数をセットする。

DC CL5' ABCDE'
DC H' 100'
DC A(ITEM1)

  • ハウスキーピングとは?


一番最初のアドレス設定など、お約束コードのことだと思うが、後続でまた確認する。

データセット処理

これは、マクロを使用する。

  1. DCBマクロ
  2. OPENマクロ
  3. GETマクロ
  4. PUTマクロ
  5. CLOSEマクロ

ちなみに、オプションにNOMXREFを指定すると、マクロ関連のレポートが出てこない。

プログラムのデバッグ

アセンブリ時 → アセンブル・リストをもとに修正
実行時    → 記憶ダンプをもとに修正

サブルーチンでの開発

ブランチ連携命令を用いて、メインと連携させる。

BAL R1,D2(X2,B2)
BALR R1,R2


BAL命令の使用など、いくつもパターンがありケースバイケース。
この辺は次回以降に掘り下げていく。

総評

今回の範囲では、プログラムの実行される流れをおさえたという印象でした。
まだ、具体的にソースを書く段階ではないため、システムの挙動やアセンブラ言語の全体を確認したような内容でした。

明日から、やっとコードを書いて回して行ってみようかと思います。
さっさとサンプルかけばいいのに、という意見もあるとは思いますが、これくらいのペースで急ぎつつ、かつ一歩一歩進んでいくのが良さそうです。

それでは、また明日!!!

*1:※冊子に記述有り

*2:今さらやっと、この流れが腑に落ちた気がします。遅いんですけど