アセンブリ言語とは(その2)

アセンブリ言語とは で、機械語とアセンブリ 言語が(ほぼ)1対1で対応することを見ました。でも、「何でそんなし ちめんどくさいことしないといかんのや?」と思うのももっともでしょう。 そこで、ここではアセンブリ言語を逆の方から(?)みてみることにしま しょう。

はじめに課題ありき

ということで、まずは例です。
「1+2+3+4+5を GMC-4 上で計算しなさい」
という問題が与えられたとします。ここで、GMC-4 上で計算するということは、 GMC-4 が処理できる形でプログラムを書くということで、言い方を変えると GMC-4 のの制限(縛り)にしたがって計算する方法を考える、ということです。 ここでの縛りとは のようなものです。とりあえず、ここではデータは元のもの(この場合、1〜 5)も、計算後のもの(結果)もメモリに置かれるとしてください(後で自分 でカウントアップする例も考えます)

すると、

  1. 最初に1〜5を適当な場所 (50-54) においておいて、
  2. 適当なレジスタにまず最初の1(50 の中身)をのっけて、
  3. 上のレジスタと、2(51 の中身)を足して、
  4. 上のレジスタと、3(52 の中身)を足して、
  5. 上のレジスタと、4(53 の中身)を足して、
  6. 上のレジスタと、5(54 の中身)を足して、
  7. 全部足された上のレジスタの中身を表示する。
という流れになるのが理解できるか、と思います。それをアセンブリ言語で書け ば以下のようになるわけです。
  TIY 0
  MA
  TIY 1
  M+
  TIY 2
  M+
  TIY 3
  M+
  TIY 4
  M+
  AO
...
50: 1
51: 2
52: 3
53: 4
54: 5

アルゴリズムということ

上のプログラムでももちろん計算は出来るわけですが、なんか冗長というか 「そのままやんか」的な感じがあります。そこで、もう少し考えてみます。

元の問題は要するに「1から5までの数を足せ」ということですから、問題を 整理し、要領のよいプログラムを組んでみます。ただし、加算はAレジスタし かできないし、Yレジスタはデータメモリのインデックスですから、作業用レ ジスタはAでしか有り得ない、だけど、作業領域も必要だし…等の制約がある なかで、かなりの工夫が必要です。

世間に普通に使われている CPU である x86( = Core i, ATOM, ...), ARM, ... は、もっと命令セットが大きい(沢山の命令がある)ので、もっと柔軟に プログラムが組めます。
ここでは、まず、データメモリ 50 を合計のバッファ(仮に覚えておくところ) とします。そして、データメモリ 51 を足し合わせる数のバッファとします。
  1. Aを1にしておきます
  2. Yを0にして、
    Aの値をデータメモリ (50 番地)におきます(最初は1)
  3. Yを1にして、
    Aの値をデータメモリ (51 番地)におきます(最初は1)
  4. ループ:(ラベル=アドレスに付ける名前、を置いておきます)
    Yを1にして、
    データメモリ (51 番地)の値をAにおきます
  5. Aに1を足します(カウンタのインクリメント)
  6. Aと6と比べて、
    偽なら(5まで足していないので)「中間」へとびます
    そうじゃない=真なら(5まで既に足したことになるので)「結果の表示部」へとびます
  7. 中間:
    Aの値をデータメモリ (51 番地)におきます
  8. Yを0にして、
    Aとデータメモリ 50 番地の値を足して、
    結果(Aの値)をデータメモリ 50 番地に保存します。
  9. 「ループ」に飛びます(繰り返しの意)
  10. 結果の表示部:
    Yを0にして、
    データメモリ(50 番地)の値をAにおいて、
    Aを表示します。
  11. 終了:「終了」(自分自身)に飛びます(無限ループ)
これを実装すると、下のようになります。
	TIA 1
	TIY 0
	AM
	TIY 1
	AM
LOOP:	
	TIY 1
	MA
	AIA 1
	CIA 6
	JUMP MID
	JUMP RESULT
MID:	
	AM
	TIY 0
	M+
	AM
	JUMP LOOP
RESULT:	
	TIY 0
	MA
	AO
END:	
	JUMP END
以下は、アセンブル後のものです。左からアドレス・機械語・ニーモ ニックとなります。 gmc4cc のアセンブラを利用させてもらいました。
00:	8 1		TIA 1
02:	A 0		TIY 0
04:	4		AM
05:	A 1		TIY 1
07:	4		AM
08:		LOOP:	
08:	A 1		TIY 1
0A:	5		MA
0B:	9 1		AIA 1
0D:	C 6		CIA 6
0F:	F 1 5		JUMP MID
12:	F 1 D		JUMP RESULT
15:		MID:	
15:	4		AM
16:	A 0		TIY 0
18:	6		M+
19:	4		AM
1A:	F 0 8		JUMP LOOP
1D:		RESULT:	
1D:	A 0		TIY 0
1F:	5		MA
20:	1		AO
21:		END:	
21:	F 2 1		JUMP END
このような、手順(の工夫?)がアルゴリズムというもので、並び替え (sort) や探索 (search) などでは過去の蓄積がいろいろあります。
  目次にもどる
講義用スタイル
印刷用スタイル