戻る アセンブラ プログラム

アセンブラ プログラムは、ラベル (label)、命令コード (operation code)、 オペランド (operand) からなっています。

アセンブラの命令文 (statement) は 「○○ に ◇◇ を ◎◎ せよ」 という形式で表され、 ○○ と ◇◇ に相当するのがオペランド、◎◎ に相当するのが命令コードです。

ラベルは、条件分岐や サブルーチン の分岐先等の名前として、 プログラムの任意の行につけることができます。

コメント文 (comment) はプログラムの動作などを説明するために書かれる注釈で、 プログラム自体には無関係です。


次の例は 1 から 10 まで (実は 10 から 1 まで) の整数を加算するプログラムです。

この計算をするために、CPU 内部の レジスタ を 2個使用します。

レジスタ B は、 「10 から 1 までの整数」 を数える カウンタ として、 レジスタ A は、加算の結果を記憶する メモリ として使用します。

ラベル 命令コード オペランド コメント文
LDB, 10; レジスタ B に 10 を代入する
LDA, 0; レジスタ A に 0 を代入する
LOOP:ADDA, B; A に B を加える。加算結果はレジスタ A に。
DECB; B の値から 1 を引く
JRNZ, LOOP; 引いた結果が 0 でなければ LOOP に分岐する
STOP:JRSTOP;プログラム終了。 加算結果はレジスタ A に残る。


LD  B, 10 LD  B, 10 は 「レジスタ B に 10 を LOAD(代入・転送)しなさい」 という命令です。
10進数の 10 という数値は、レジスタには2進数 (0000 1010) で記憶されます。

LD  A, 0 では、レジスタ A の値は (0000 0000) になります。
ADD   A, B ADD  A, B は、 「レジスタ A の値にレジスタ B の値を加算した結果を、レジスタ A に格納しなさい」 という命令です。

レジスタ A の値は (0000 0000)、レジスタ B の値は (0000 1010) ですから、 加算の結果は (0000 1010) になります。
これが レジスタ A に格納されます。


2度目にこの命令が実行されるときには、レジスタ A の値は (0000 1010)、 レジスタ B の値は (0000 1001) に変わっています。
これを加算すると (0001 0011) になります。
レジスタ A の値は、 この命令が実行されるたびに 更新を繰り返します。
DEC    B DEC  B は、 「レジスタ B の値から 1 を引いたものをレジスタ B に格納しなさい」 という命令です。

レジスタ B の値は (0000 1010) ですから、1 を引くと (0000 1001) になります。

"DEC" は、decrement の略です。
Flow Chart JR  NZ, LOOP はこの場合、 「レジスタ B の値が 0 でなければ、"LOOP" という ラベル がついている行に 分岐しなさい」 という命令です。

レジスタ B の値は 9 (0000 1001) ですから、0 ではありません。
CPU は "LOOP" の行に戻って加算命令以下をもう一度実行します。

"ADD  A, B",  "DEC  B",  "JR   NZ, LOOP"

この3つの命令を繰り返し実行すると、レジスタ B の値は順次 10→9→8……2→1→0 と減少します。レジスタ B の値が 0 になると、プログラムは終了します。

"JR" は、Jump Rerative の略です。
最後の行の STOP:  JR  STOP は、 「無条件に "STOP" という ラベル がついている行に分岐しなさい」 という命令です。
"STOP" は分岐命令自身に付けられている ラベル ですから、このような命令に遭遇すると、 CPU は永遠にこの命令の実行を繰り返します。
このように、特定のループを永遠に繰り返すプログラムを 「無限ループ」 といいます。 多くの場合、コンピュータは止まってしまったように見えます。

この例のような極端なプログラムを、普通書くことはありませんが、 プログラマの予期に反してできてしまた無限ループに陥ることもあります。 「ハングアップ」 や 「フリーズ」 と称する現象の大半は、 このような原因によるものと思われます。

なお、ここで使用しているアセンブラ言語は、"Z80" という8ビット CPU のものです。

情報処理概論 に戻る   講義資料 に戻る   アセンブラ言語 に戻る   戻る

1998.10.23   ueyama@infonet.co.jp