|
|
アセンブラ プログラム |
アセンブラ プログラムは、ラベル (label)、命令コード (operation code)、
オペランド (operand) からなっています。
アセンブラの命令文 (statement) は 「○○ に ◇◇ を ◎◎ せよ」 という形式で表され、
○○ と ◇◇ に相当するのがオペランド、◎◎ に相当するのが命令コードです。
ラベルは、条件分岐や サブルーチン の分岐先等の名前として、
プログラムの任意の行につけることができます。
コメント文 (comment) はプログラムの動作などを説明するために書かれる注釈で、
プログラム自体には無関係です。
次の例は 1 から 10 まで (実は 10 から 1 まで) の整数を加算するプログラムです。
この計算をするために、CPU 内部の レジスタ を
2個使用します。
レジスタ B は、 「10 から 1 までの整数」 を数える
カウンタ として、
レジスタ A は、加算の結果を記憶する メモリ として使用します。
| ラベル | 命令コード | オペランド | コメント文 |
|---|---|---|---|
| LD | B, 10 | ; レジスタ B に 10 を代入する | |
| LD | A, 0 | ; レジスタ A に 0 を代入する | |
| LOOP: | ADD | A, B | ; A に B を加える。加算結果はレジスタ A に。 |
| DEC | B | ; B の値から 1 を引く | |
| JR | NZ, LOOP | ; 引いた結果が 0 でなければ LOOP に分岐する | |
| STOP: | JR | STOP | ;プログラム終了。 加算結果はレジスタ A に残る。 |
| LD B, 10 は 「レジスタ B に 10 を
LOAD(代入・転送)しなさい」 という命令です。 10進数の 10 という数値は、レジスタには2進数 (0000 1010) で記憶されます。 LD A, 0 では、レジスタ A の値は (0000 0000) になります。 | |
| 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 は、
「レジスタ B の値から 1 を引いたものをレジスタ B に格納しなさい」
という命令です。 レジスタ B の値は (0000 1010) ですから、1 を引くと (0000 1001) になります。 "DEC" は、decrement の略です。 |
| 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 は永遠にこの命令の実行を繰り返します。 このように、特定のループを永遠に繰り返すプログラムを 「無限ループ」 といいます。 多くの場合、コンピュータは止まってしまったように見えます。 この例のような極端なプログラムを、普通書くことはありませんが、 プログラマの予期に反してできてしまた無限ループに陥ることもあります。 「ハングアップ」 や 「フリーズ」 と称する現象の大半は、 このような原因によるものと思われます。 | |
情報処理概論 に戻る 講義資料 に戻る アセンブラ言語 に戻る 戻る
1998.10.23 ueyama@infonet.co.jp