アセンブリ言語 CASL2 アセンブラ命令とマクロ命令の種類
アセンブリ言語でプログラムを組むときに知っておきたい命令が「アセンブラ命令」と「マクロ命令」です。
アセンブラ命令は、プログラミングの際に最初と最後に必ず記述し、マクロ命令は、キーボードで入力した情報を使用するために知っておかなければなりません。
今回は、アセンブラ命令とマクロ命令についてその内容を紹介します。
アセンブラ命令
アセンブラ命令とは、アセンブラ(assembler)というプログラムが認識するための命令のことです。
アセンブラとは、アセンブリ言語で書かれたプログラムを機械語に対応させるプログラムのことをいいます。
C言語でいうコンパイラが、アセンブリ言語でいうアセンブラです。
アセンブラ命令は、アセンブラが認識するための命令なので対応する機械語はありません。
CASL2の機械語については「CASL2に対応する機械語はどうなっているのか?」も参考にしてみてください。
START命令
名称 | オペコード | 第1オペランド |
START | START | --- |
ラベル |
使用例1: START
プログラムを開始せよ。
使用例2: START MAIN
ラベルMAINから始まるプログラムを開始せよ。
プログラムの始めに必ず記述する命令ですから、何も考えず書いておけばOKです。
END命令
名称 | オペコード | 第1オペランド |
END | 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を定義しても同じ意味になります。
【同じ意味の記述】- CHR DC 'A'
- CHR DC #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
RPUSH・RPOP命令もアセンブラ命令に含まれます。
マクロ命令
マクロ命令とは、予(あらかじ)め記述された複数の命令によって実現している何らかの機能を、名前を呼ぶだけでその機能を果たせる命令のことです。
丁度、高級言語でいうところの「ライブラリ」に似ているでしょう。
例えば、ディスプレイに文字を出力する機能を持ったプログラムを毎回書こうとするなら膨大な手間がかかってしまいます。
そこで、あらかじめディスプレイに文字を出力する機能をプログラムしておき、名前をつけます。
そして、その名前を呼ぶだけで機能を使えるようにしてプログラマに楽してもらいましょうよというのがこのマクロ命令です。
入力命令
名称 | ラベル | オペコード | 第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」と定義すればいい、ということになります。
さいごに
今回はアセンブラ・マクロ命令について内容を共有しました。
マクロ命令というのはプログラマーの負担が軽減されるのは助かりますよね。
それでは次回にお会いしましょう。