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

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

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

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

プログラミング

【第3回の目的】
コーディングに向けて、instructionを具体的に覚えていく。
かなりケツかっちんだが、急がば回れということで、一つずつ潰していくことにしました。
あーもう、やりたいことをどうやってコーディングしたらいいのか、全然分からない!!!

調べていて分かったこと

やはり逆引きが非常に困難。
レジスタの気持ちがまだ分かりません…。
世の中のプログラミング言語の本で、
逆引き本が存在する意義が身に染みました。
Assembler版も是非欲しいところ(違

STM

モジュール頭のエントリー処理でお決まりのインストラクション。

The STORE MULTIPLE instruction allows the use of
just one instruction to store the contents of
the four registers:

マニュアルによると、なんと1インストラクションで
4つのレジスタに値がセットできると!
そういうOp codeだったのか…。

Assembler Format
Op Code R1,R3,D2(B2)

------- example ----------
STM R14, R1,X'50'(R6)

L(LR)

基本の基本、Lです。
これらの命令はPSWの条件コードにも何に影響も与えません。

Lは1ワードを記憶域からレジスタへロードします。
例えば、R5,R6が以下のような値を記録しているとき。

Register 5 contains 00 02 00 00.
Register 6 contains 00 00 10 03.

R6が基底
R5が変位
21003のアドレスには、00 00 AB CDが入っているとすると、

Assembler Format
Op Code R1,D2(X2,B2)

------- example ----------
L 10,0(5,6)

これで、R10には00 00 AB CDがロードされます。
なるほど…って、そんなに納得感はありませんが…。

その他、LRはレジスタからレジスタへ、
LHはハーフワードを記憶域からレジスタへロードします。

LR R1,R2 なので、簡単です。

LHの場合は、16bit〜31bit部分にロードするため、
レジスタの左側(0〜15)には、符号ビットが入ってきます(FFFFとか)。

半分だけ、といっても全体に影響するわけですね。

LA(Load Address)

汎用レジスタの中に、アドレスの値(データの中身でない)を入れます。
レジスタをカウンタとして使用する際にこの命令がよく使われるそうです。

LA R1,D2(X2,B2)

注意として、第2オペランドのアドレスが第1オペランドで指定された
汎用レジスタの8〜31ビットに挿入されるが、
レジスタの0〜7ビットは0がセットされる。

DS

記憶域の確保。
変数の宣言みたいなものですか。

DS CL80 アドレスとキャラクタ80バイトを割り当て
DS XL15 アドレスと長さ(15バイト)を割り当て(記憶位置カウンターを15だけ増やします→カーソルが先に進む感じか)

レコードをまとめて、という書き方もあります。

DS 5CL80 5レコード分まとめて、とか。

下記のようなレコードレイアウトを定義することもできます。

REC1




REC1 DS 0CL80
NO DS CL6
NAME DS CL20
DATE DS 0CL6
YY DS CL2
MM DS CL2
DD DS CL2
ADDR DS CL36
TEL DS CL10
DS CL2

上記の0の部分を複写因数と呼ぶそうですが、
要はアドレスは進めないで枠だけ宣言しているだけです。
次に続く宣言と同じポインタを指すことになるので、
レイアウトのような構造が表現できます。

ここで、ラベルを付けておけば、後続のコーディングの中で、
ラベルを指定することで、データをセットできるわけですね。

このへん、使いこなせると非常に早そうなのですが…。

あと、章分けはしませんが、DCは記憶域確保と同時に定数を定義します。

時間切れ

ということで、今日はここまで。
残りは家帰ってからやります。

まだ1行もコードに結びついていないので…。
でも、かなり頭は整理されてきた。やっぱり、どかーんという近道はないな。