アセンブリ言語#
学習目標#
アセンブリ言語の概念を理解する。
アセンブリ言語と機械語の違いを理解する。
簡単なPep/9アセンブリ言語のプログラムを作成できる。
Pep/9のシミュレータを使って、アセンブリ言語プログラムを実行できる。
アセンブリ言語とは#
機械語をより人間に理解しやすい形で記述したものがアセンブリ言語である。アセンブリ言語(Assembly Language)は、機械語命令に人間が理解しやすいニーモニック(mnemonic)という符号を付ける。
ニーモニックコード:
機械語の命令を,人間に分かりやすいよう英単語や略記,10進法数字などに置き換えて表したもの。 – 大辞林(第2版)
Example
機械語でC0009A
という命令があったとすると、アセンブリ言語ではLDWA 0x0009A
のように記述する。ここで、LDWA
は「ワードをレジスタAにロードする」という意味のニーモニックである。
コンピューターが直接理解できるのは機械語であるため、アセンブリー言語で記述されたソースコードをアセンブラ(Assembler)と呼ばれるプログラムを使って機械語に変換する必要がある。
flowchart LR アセンブリ言語 --> アセンブラ アセンブラ --> 機械語
Pep/9アセンブリ言語#
ここでは、Pep/9アセンブリ言語を学び、アセンブリ言語でのプログラミングを体験する。
Pep/9アセンブリ言語では、命令部のオペコードをニーモニックで表現する。オペランド部は、16進数で書き、先頭に0x
を付ける。オペランド部の後ろに、i
やd
などのアルファベットを付けることで、アドレス指定方式を示す。
以下はPep/9アセンブリ言語のアドレス指定方式の一部である。
アドレス指定方式 |
意味 |
---|---|
|
即値アドレス指定 |
|
直接アドレス指定 |
以下はPep/9アセンブリ言語の命令部の一部である。
mnemonic |
意味 |
---|---|
STOP |
実行を停止する |
LDWA |
レジスタAにワードをロードする |
LDBA |
レジスタAにバイトをロードする |
STWA |
ワードをメモリにストアする |
STBA |
バイトをメモリにストアする |
ADDA |
レジスタAに加算する |
SUBA |
レジスタAから減算する |
例えば、LDWA 0x0009A,i
は、レジスタAに0009A
をロードする命令を表す。
LDWA
:レジスタAにワードをロードする0x0009A
:オペランド部i
:即値アドレス指定
LDWA 0x0009A,d
は、レジスタAにメモリのアドレス0009A
に格納されているワードをロードする命令を表す。
ADDA 0x0009A,i
は、レジスタAに0009A
を加算する命令を表す。
ADDA 0x0009A,d
は、レジスタAにメモリのアドレス0009A
に格納されているワードを加算する命令を表す。
Note
STWA
やSTBA
は、即値アドレス指定i
を使用することはできない。
「Hi」を出力するPep/9の機械語プログラム#
以下は、Pep/9アセンブリ言語で「Hi」を出力するプログラムの例である。.END
は,アセンブリ言語のプログラムの終わりを示す記号である。
LDBA 0x0048,i ; レジスタAに'H'のASCIIコードをロード
STBA 0xFC16,d ; レジスタAの値をターミナルに出力
LDBA 0x0069,i ; レジスタAに'i'のASCIIコードをロード
STBA 0xFC16,d ; レジスタAの値をターミナルに出力
STOP ; プログラムを停止
.END
このプログラムは、以下の手順で実行する。
ソースコードを「Source Code」に入力する。
Build > Run Source を選択し、プログラムを実行する。
Outputに「Hi」と出力されることを確認する。
一文字を受け取り、ターミナルに出力するPep/9アセンブリ言語のプログラム#
以下は、Pep/9アセンブリ言語で一文字を受け取り、ターミナルに出力するプログラムの例である。
LDBA 0xFC15,d ; レジスタAにキーボードから入力した文字をロード
STBA 0xFC16,d ; レジスタAの値をターミナルに出力
STOP ; プログラムを停止
.END
練習問題#
二つの文字を受け取り、位置を入れ替え、ターミナルに出力するPep/9アセンブリ言語のプログラムを作成せよ.
Hint: Pep/9の入力アドレスは
FC15
、出力アドレスはFC16
.