アセンブリ言語#

学習目標#

  • アセンブリ言語の概念を理解する。

  • アセンブリ言語と機械語の違いを理解する。

  • 簡単な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を付ける。オペランド部の後ろに、idなどのアルファベットを付けることで、アドレス指定方式を示す。

以下はPep/9アセンブリ言語のアドレス指定方式の一部である。

アドレス指定方式

意味

i

即値アドレス指定

d

直接アドレス指定

以下は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

STWASTBAは、即値アドレス指定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

このプログラムは、以下の手順で実行する。

  1. ソースコードを「Source Code」に入力する。

  2. Build > Run Source を選択し、プログラムを実行する。

  3. Outputに「Hi」と出力されることを確認する。

一文字を受け取り、ターミナルに出力するPep/9アセンブリ言語のプログラム#

以下は、Pep/9アセンブリ言語で一文字を受け取り、ターミナルに出力するプログラムの例である。

LDBA 0xFC15,d  ; レジスタAにキーボードから入力した文字をロード
STBA 0xFC16,d  ; レジスタAの値をターミナルに出力
STOP           ; プログラムを停止
.END

練習問題#

  1. 二つの文字を受け取り、位置を入れ替え、ターミナルに出力するPep/9アセンブリ言語のプログラムを作成せよ.

    1. Hint: Pep/9の入力アドレスはFC15、出力アドレスはFC16