アセンブリ言語とは(その2)
アセンブリ言語とは で、機械語とアセンブリ
言語が(ほぼ)1対1で対応することを見ました。でも、「何でそんなし
ちめんどくさいことしないといかんのや?」と思うのももっともでしょう。
そこで、ここではアセンブリ言語を逆の方から(?)みてみることにしま
しょう。
ということで、まずは例です。
「1+2+3+4+5を GMC-4 上で計算しなさい」
という問題が与えられたとします。ここで、GMC-4 上で計算するということは、
GMC-4 が処理できる形でプログラムを書くということで、言い方を変えると
GMC-4 のの制限(縛り)にしたがって計算する方法を考える、ということです。
ここでの縛りとは
- 演算(「+」とか「−」とか)は必ずAレジスタとデータメモリの
間で行われる。つまり、計算する対象のうち一方はあらかじめレジスタに
のせておかなくてはならない
- 上に関連して、1度には2つの数しか足したりできない
- さらに言うと加算はAレジスタしかできないし、Yレジスタはデータメ
モリのインデックス(指標、要するに今データメモリのどこを使おうとしてい
るかを覚えておくところ)としての役割がほぼ決め打ちになっている
- ………など
のようなものです。とりあえず、ここではデータは元のもの(この場合、1〜
5)も、計算後のもの(結果)もメモリに置かれるとしてください(後で自分
でカウントアップする例も考えます)
すると、
- 最初に1〜5を適当な場所 (50-54) においておいて、
- 適当なレジスタにまず最初の1(50 の中身)をのっけて、
- 上のレジスタと、2(51 の中身)を足して、
- 上のレジスタと、3(52 の中身)を足して、
- 上のレジスタと、4(53 の中身)を足して、
- 上のレジスタと、5(54 の中身)を足して、
- 全部足された上のレジスタの中身を表示する。
という流れになるのが理解できるか、と思います。それをアセンブリ言語で書け
ば以下のようになるわけです。
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 を足し合わせる数のバッファとします。
- Aを1にしておきます
- Yを0にして、
Aの値をデータメモリ (50 番地)におきます(最初は1)
- Yを1にして、
Aの値をデータメモリ (51 番地)におきます(最初は1)
- ループ:(ラベル=アドレスに付ける名前、を置いておきます)
Yを1にして、
データメモリ (51 番地)の値をAにおきます
- Aに1を足します(カウンタのインクリメント)
- Aと6と比べて、
偽なら(5まで足していないので)「中間」へとびます
そうじゃない=真なら(5まで既に足したことになるので)「結果の表示部」へとびます
- 中間:
Aの値をデータメモリ (51 番地)におきます
- Yを0にして、
Aとデータメモリ 50 番地の値を足して、
結果(Aの値)をデータメモリ 50 番地に保存します。
- 「ループ」に飛びます(繰り返しの意)
- 結果の表示部:
Yを0にして、
データメモリ(50 番地)の値をAにおいて、
Aを表示します。
- 終了:「終了」(自分自身)に飛びます(無限ループ)
これを実装すると、下のようになります。
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) などでは過去の蓄積がいろいろあります。
目次にもどる
講義用スタイル
印刷用スタイル