アセンブリ言語でプログラムを組むときに知っておいて欲しい命令が
「アセンブラ」命令と
「マクロ」命令です。
アセンブラ命令は、プログラミングの際に最初と最後に必ず記述し、マクロ命令は、キーボードで入力した情報を使用するために知っておかなければなりません。
今回は、アセンブラ命令とマクロ命令を見てみたいと思います。
アセンブラ命令
アセンブラ命令とは、アセンブラというプログラムが認識するための命令のことです。
アセンブラとは、アセンブリ言語で書かれたプログラムを機械語に対応させるプログラムのことをいいます。C言語でいうコンパイラが、アセンブリ言語でいうアセンブラです。
アセンブラ命令は、アセンブラが認識するための命令で、直接対応する機械語があるわけではありません。
CASL2の機械語については「
CASL2に対応する機械語はどうなっているのか?」も参考にしてみてください。
アセンブラ命令には以下のような命令があります。
START命令
名称 | オペコード | 第1オペランド
|
START | START | ---
|
ラベル
|
使用例1: START
プログラムを開始する。
使用例2: START MAIN
ラベルMAINから始まるプログラムを開始する。
プログラムの始めに必ず記述する命令です。
END命令
使用例1: END
プログラムを終了する。
プログラムの終わりに必ず記述する命令です。
DC命令
名称 | ラベル | オペコード | 第1オペランド
|
Define Constant | ラベル | DC | 定数
|
使用例1: A DC 1
A番地に
定数1を設定せよ。
使用例2: B DC #FFFF
B番地に
16進定数FFFFを設定せよ。
※ 数値の前に「#」をつけると16進数扱いになります。
使用例3: CHR DC 'A'
CHR番地に
文字定数「A」を設定せよ。
※ 文字を「'」(シングルクォーテーション)で囲んで記述すると文字コードがメモリに格納されます。
使用例3では
「A」なので、JIS-X-0201コード表に基づき、CHR番地に
(0041)16が格納されるということです。つまり、
「A」という文字を定義したければ、
「#0041」を定義しても同じ意味になります。
【同じ意味の記述】
このように文字コードを直接定義しても同じ意味になります。
使用例4: STR DC 'ABC'
STR番地に
文字定数「A」を、
STR + 1番地に
文字定数「B」を、
STR + 2番地に
文字定数「C」を設定せよ。
使用例5: STR DC 'A', 'B', 'C'
STR番地に
文字定数「A」を、
STR + 1番地に
文字定数「B」を、
STR + 2番地に
文字定数「C」を設定せよ。
使用例6: STR | DC 'A'
|
| DC 'B'
|
| DC 'C'
|
STR番地に
文字定数「A」を、
STR + 1番地に
文字定数「B」を、
STR + 2番地に
文字定数「C」を設定せよ。
使用例4~6は3例とも同じ意味になります。
文字コード表
DS命令
名称 | ラベル | オペコード | 第1オペランド
|
Define Storage | ラベル | DS | 容量(語数)
|
使用例1: A DS 1
A番地に
1語(16ビット)の容量を設定せよ。
使用例2: B DS 5
B番地から
B + 4番地まで、計
5語(80ビット)の容量を設定せよ。
DC命令との違いは、具体的な値をメモリに設定するのではなく、メモリ上に容量だけ確保したいときに使用します。
容量だけ確保したいというのは、具体的な数値は決まってないけど兎に角この番地は近い内に使用するから場所取りだけしておこう、というイメージです。
以上の命令以外にも...
RPUSH・RPOP命令もアセンブラ命令に含まれます。
マクロ命令
マクロ命令とは、予(あらかじ)め記述された複数の命令によって実現している何らかの機能を、名前を呼ぶだけでその機能を果たせる命令のことです。
丁度、高級言語の「ライブラリ」に似ているでしょう。例えば、ディスプレイに文字を出力する機能を持ったプログラムを毎回書こうとするなら膨大な手間が掛かってしまいます。そこで、予めディスプレイに文字を出力する機能をプログラムしておき、名前をつけておきます。
↑予めプログラムを作ってくださった開発者様は偉大です。
そして、その名前を呼ぶだけで機能を使えるようにし、プログラマに楽してもらいましょうよ、というのがこのマクロ命令です。
CASL2には以下のようなマクロ命令があります。
入力命令
名称 | オペコード | 第1オペランド | 第2オペランド
|
INput | IN | ラベル | ラベル
|
使用例1:
|
| | IN WORDS, LENGTH
|
| | :
|
| WORDS | DS 1
|
| LENGTH | DC 1
|
| | :
|
ラベル
WORDSで定義されるメモリ上の領域にラベル
LENGTHで定義される語数分の文字を格納せよ。
WORDS DS
1 と LENGTH DC
1
であるため、
1語分の文字列がメモリに格納できます。
ちなみに、
1語の領域に1文字格納できます。
1語 = 1文字
したがって、使用例1は、1文字しか入力できないということになります。
出力命令
名称 | オペコード | 第1オペランド | 第2オペランド
|
OUTput | OUT | ラベル | ラベル
|
使用例1:
|
| | OUT WORDS, LENGTH
|
| | :
|
| WORDS | DC 'abc'
|
| LENGTH | DC 1
|
| | :
|
ラベル
WORDSで定義されるメモリ上の領域からラベル
LENGTHで定義される語数分の文字を出力せよ。
WORDS DC 'abc' で
3語の文字定数を定義していますが、
LENGTH DC 1 であるため、出力される値は
「a」文字だけです。
もし、
abcと表示したければ、
LENGTH DC 3 と定義すればいい、ということになります。
最後に
今回はアセンブラ・マクロ命令についてご紹介いたしました。
マクロ命令というのは本当にありがたいですね。CPU設計者の心遣いに感謝ですね。
続きはまた次回にご期待を!