条件分岐による反復処理を行うと,さまざまな計算が実現できます.
基本的な枠組み
以下の枠組みによって,指定された条件を満たすまで,反復処理を行います.- 計算をする
- 条件を満たしているならば,プログラムを終了する
- (条件を満たしていないので)1に戻る
条件分岐による反復処理を行うと,さまざまな計算が実現できます.
反復処理を使ったプログラムの例として, "1から10までの和" を計算するプログラムを考えてみます.下図の左側が Little Man Computer CPUシミュレータ で実行できるプログラムです.このプログラムは教科書 図8.2 (下の図の右側)のプログラムを Little Man Computer CPUシミュレータ 用に書き直したものです.
LMCアドレス | LMC命令 | アドレス | 命令 | 意味 | 高水準言語 | 0 | LDA 11 | 1001 | load 2001 | AC←2001 | 1 | ADD 12 | 1002 | add 2002 | AC←AC+2002 | 2 | STA 11 | 1003 | store 2001 | 2001←AC | sum←sum+i | 3 | LDA 12 | 1004 | load 2002 | AC←2002 | 4 | SUB 13 | 1005 | subtract 2003 | AC←AC-2003 | 5 | STA 12 | 1006 | store 2002 | 2002←AC | i←i-1 | 6 | BRZ 8 | 1007 | jumpzero 1009 | 条件分岐(ジャンプ) | 7 | BRA 0 | 1008 | jump 1000 | 無条件ジャンプ | while i ≠ 0 | 8 | LDA 11 | 1009 | load 2001 | AC←2001 | 9 | OUT | 1010 | write | 結果の出力 | write(sum) | 10 | HLT | 1011 | halt | プログラム停止 | 11 | DAT 0 | 2001 | 0 | 変数 | sum←0 | 12 | DAT 10 | 2002 | 10 | 変数 | i←10 | 13 | DAT 1 | 2003 | 1 | 変数 | 1 |
各命令の対応関係は以下のようになっています.LMC(Little Man Computer)の命令セットについては,Little Man Computer CPUシミュレータの命令セットをみてください
LDA | ADD | STA | SUB | BRZ | BRA | HLT | OUT |
load | add | store | subtract | jumpzero | jump | halt | write |
"1から10までの和"を実行するために左側のテキストフィールドに以下のプログラムをコピー & ペーストして,「Submit」ボタンを押します.
LDA 11 ADD 12 STA 11 LDA 12 SUB 13 STA 12 BRZ 08 BRA 00 LDA 11 OUT HLT DAT 00 DAT 10 DAT 01
"RAM"と書かれた"メインメモリ" にプログラムが読み込まれたことを確認したら,"STEP" をクリックしてプログラムを実行し,反復処理の過程を追いかけてみましょう.実行速度は"OPTIONS"メニューの「default fast」, 「default normal」, 「default slow」の3つから選ぶことができます.
LDA命令により,"メインメモリ" の11番地の値 "0" を "アキュムレータ" に読み込みます.
ADD命令により,"アキュムレータ" の値である "0" に "メインメモリ" の12番地の値 "10" を加えて,結果の値を "アキュムレータ" に格納します.
STA命令により,"アキュムレータ" の値 "10" を "メインメモリ" の11番地に書き出します.
LDA命令により,"メインメモリ" の12番地の値 "10" を "アキュムレータ" に読み込みます.
SUB命令により,"アキュムレータ" の値 "10" から "メインメモリ" の13番地の値 "1" を引き,結果の値を "アキュムレータ" に格納します.
STA命令により,"アキュムレータ" の値 "9" を "メインメモリ" の12番地に書き出します.
"STA 12" なので "アキュムレータ" の値 "9" を12番地に書き込みます.
BRZ命令により,"アキュムレータ" の値がゼロだった場合,"プログラムカウンタ" の値を8にして,プログラムの実行を8番地にジャンプします.
最初の実行では "アキュムレータ" の値は "9" であり,ゼロではないのでジャンプせずに次の命令を実行します.しかし,実行が進むにしたがって,5の "SUB 13" により12番地の値が1つずつ小さくなり,ゼロになるときがきます.
BRA命令により,無条件で "プログラムカウンタ" の値を0にして,プログラムの実行を0番地にジャンプします.
7に書いたように"メインメモリ" の12番地の値が "0" になるまで,1〜6の実行を反復します."メインメモリ" の12番地の値が "0" になると,"BRZ 8" によりプログラムの実行は8番地にジャンプします.そこで "LDA 10"が実行された後,9番地の"OUT"が実行され,シミュレータのOUTPUTに"55"と表示されます.その後,10番地の"HLT" が実行されプログラムが終了します.
このプログラムの実行によって,メインメモリ上の11〜13番地の値は,以下のようになることがわかります.
ラベルを使うと,「1から10までの和」のプログラムは以下のように書くことができます.
LOOP LDA SUM ADD i STA SUM LDA i SUB ONE STA i BRZ L BRA LOOP L LDA SUM OUT HLT SUM DAT 0 i DAT 10 ONE DAT 1左側のテキストフィールドにプログラムをコピー & ペーストして,「Submit」ボタンを押します.得られる機械語プログラムは同一です.