54  アセンブリ言語

54.1 学習目標

  • アセンブリ言語の概念を理解する.
  • アセンブリ言語と機械語の違いを理解する.
  • 簡単なPep/9アセンブリ言語のプログラムを作成できる.
  • Pep/9のシミュレータを使って,アセンブリ言語プログラムを実行できる.

54.2 アセンブリ言語とは

機械語をより人間に理解しやすい形で記述したものがアセンブリ言語である.アセンブリ言語(Assembly Language)は,機械語命令に人間が理解しやすいニーモニック(mnemonic)という符号を付ける.ニーモニックは,機械語の命令を英単語や略記,10進法数字などに置き換えて表現するものである.

例えば,機械語でC0009Aという命令があったとすると,アセンブリ言語ではLDWA 0x009Aのように記述する.ここで,LDWAは「ワードをレジスタAにロードする」という意味のニーモニックである.

コンピューターが直接理解できるのは機械語であるため,アセンブリ言語で記述されたソースコードをアセンブラ(Assembler)と呼ばれるプログラムを使って機械語に変換する必要がある.

flowchart LR
   アセンブリ言語 --> アセンブラ
   アセンブラ --> 機械語

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

STWASTBAは,メモリにワードやバイトをストアする命令である.そのため,即値アドレス指定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

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

  1. ソースコードを「Source Code」に入力する.
  2. Build > Run Source を選択し,プログラムを実行する.
  3. Outputに「Hi」と出力されることを確認する.

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

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

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

54.6 練習問題

  1. 即値アドレス指定を使用し,「Hosei」と出力するPep/9アセンブリ言語のプログラムを作成せよ.
  2. 2つの文字を受け取り,位置を入れ替え,ターミナルに出力するPep/9アセンブリ言語のプログラムを作成せよ.Hint: Pep/9の入力アドレスはFC15,出力アドレスはFC16