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