アセンブリ言語 CASL2 データ転送命令
アセンブリ言語のソースプログラムによく登場する命令がロード命令とストア命令です。
特にロード命令は、プログラムの始め付近に必ず記述されています。
というのも、コンピュータは一度メモリからCPUにデータを転送しないと計算処理ができないからです。
今回はロード命令とストア命令に加え、ロードアドレス命令について情報を共有したいと思います。
ロード命令
ロード命令は、メモリからCPUの汎用レジスタにデータをロードする命令です。
名称 | オペコード | 第1オペランド | 第2オペランド | 第3オペランド |
LoaD | LD | レジスタ | アドレス or レジスタ | --- |
レジスタ | アドレス | レジスタ |
使用例1: LD GR0, A
メモリA番地の値を、汎用レジスタGR0に転送(ロード)せよ。
使用例2: LD GR0, 1
メモリ1番地の値を、汎用レジスタGR0に転送せよ。
使用例3: LD GR0, 1, GR1
メモリ「汎用レジスタGR1の値 + 1」番地の値を、汎用レジスタGR0に転送せよ。
使用例4: LD GR0, GR1
汎用レジスタGR1の値を、汎用レジスタGR0に転送せよ。
ロードアドレス命令
ロードアドレス命令は、メモリからCPUの汎用レジスタにアドレス値を転送する命令です。
名称 | オペコード | 第1オペランド | 第2オペランド | 第3オペランド |
Load ADdress | LAD | レジスタ | アドレス | --- |
レジスタ | アドレス | レジスタ |
使用例1: LAD GR0, A
メモリA番地のアドレス値を、汎用レジスタGR0に転送(ロード)せよ。
使用例2: LAD GR0, 1
メモリ1番地のアドレス値を、汎用レジスタGR0に転送せよ。
使用例3: LAD GR0, 1, GR1
メモリ「汎用レジスタGR1の値 + 1」番地のアドレス値を、汎用レジスタGR0に転送せよ。
LAD命令は第2オペランドに汎用レジスタを指定できない点が、LD命令との違いです。
似ているようで使い方が若干違うので注意してください。
- LAD命令は第2オペランドに汎用レジスタを指定できない
LAD命令で定数の設定
LAD命令は定数の設定にも使用できます。
CASL2でメモリに定数を設定するときには、DC命令を使用しますが、LAD命令でも定数を設定できるのです。
LAD命令はメモリの節約になる
LAD命令を使用することでメモリの容量を節約できます。
LAD命令は、第2オペランドで指定した値を、そのままレジスタに転送できる仕様になっています。
つまり、アドレス値そのものを定数として使用できることを意味しています。
この仕様によって
じゃあ、どうやってメモリを節約するの?
それについて以下の例を見てみます。
例1: GR1に値3をロードしたいときに使う記述の種類① | LD | GR1, A | |
A | DC | 3 | |
|| | 同じ | ||
② | LD | GR1, =3 | |
|| | 同じ | ||
③ | LAD | GR1, 3 | |
上記の例1における①~③の記述はすべて同じ意味です。
まず①はDC命令を使用した方法です。
「A DC 3」という記述により、A番地に3という値を設定してから「LD GR1, A」でA番地からGR1に3をロードしています。
次に②はリテラルを使用した方法です。「LD GR1, =3」は、3の前に「=」が記述されていますがこれがリテラルという機能です。
リテラルは、わざわざDC命令でメモリに定数を設定しなくても3という値をGR1にロードできますが、DC命令を記述することを省略しているだけなので、コンピュータ内部では既にメモリに定数を設定済みです。
したがって、メモリの節約にはなりません。
DC命令でも、リテラルでもメモリに定数を設定するときには必ず1語の容量が必要になります。
一方で、③のLAD命令は直接アドレス値をロードできるため、DC命令やリテラルによる定数の設定が不要です。
つまり、LAD命令を使えばメモリの容量を1語分節約ができるということになります。
ストア命令
ストア命令は、CPUの汎用レジスタからメモリにデータを格納する命令です。
ロード命令と反対の動きをする命令となります。
名称 | オペコード | 第1オペランド | 第2オペランド | 第3オペランド |
STore | ST | レジスタ | アドレス | --- |
レジスタ | アドレス | レジスタ |
使用例1: ST GR0, A
汎用レジスタGR0の値を、メモリA番地に格納せよ。
使用例2: ST GR0, 1
汎用レジスタGR0の値を、メモリ1番地に格納せよ。
使用例3: ST GR0, 1, GR1
汎用レジスタGR0の値を、メモリ「汎用レジスタGR1の値 + 1」番地に格納せよ。
ただし、ST命令は第2オペランドに汎用レジスタ名を指定することはできません。
また、この命令だけ第1オペランドと第2以上のオペランドとの関係が他の命令と逆なことに注意してください。
例2: LD命令とST命令におけるデータの流れ- ST GR0, A・・・GR0のデータをA番地に格納
(データの流れ GR0 --> A) - LD GR0, A・・・A番地のデータをGR0に転送
(データの流れ GR0 <-- A)
さいごに
今回は、ロード、ロードアドレス、そしてストア命令について紹介いたしました。
特に、ロードアドレス命令は、メモリの節約ができる優秀な命令ですが、それ以外に加算や減算を行うことができる機能も有しています。
それでは次回にお会いしましょう。