条件分岐による反復処理を行うと,さまざまな計算が実現できます.
基本的な枠組み
以下の枠組みによって,指定された条件を満たすまで,反復処理を行います.- 計算をする
- 条件を満たしているならば,プログラムを終了する
- (条件を満たしていないので)1に戻る
条件分岐による反復処理を行うと,さまざまな計算が実現できます.
反復処理を使ったプログラムの例として, "1から10までの和" を計算するプログラムを考えてみます.下図の左側が ED21 で実行できるプログラムです.このプログラムは教科書 P.156 図7.2 (下の図の右側)のプログラムを ED21 用に書き直したものです.
各命令の対応関係は以下のようになっています.
LOAD | ADD | STORE | SUB | JZ | J | STOP |
load | add | store | subtract | jumpzero | jump | halt |
教科書では結果を出力する命令として write が用いられていますが,ED21では "アキュムレータ" の値を見ることができますので,そこで値を確認しましょう.
"1から10までの和" は,ED21に付属のサンプルプログラムにはありません.そこで,下のプログラムをエディタにコピー&ペーストします.
LOAD 10 ADD 11 STORE 10 LOAD 11 SUB 12 STORE 11 JZ 8 J 0 LOAD 10 STOP 0 0 10 1
コピー&ペーストは,以下の手順で行います.
スライドの青線を見るとわかるようにEE21の行番号がずれて表示されるかもしれませんが, 実行に影響はありません.
メインメモリに書き出したら,"ステップ実行"をクリックして,反復処理の過程を追いかけてみましょう.
LOAD命令により,"メインメモリ" の10番地の値 "0" を "アキュムレータ" に読み込みます.
ADD命令により,"アキュムレータ" の値である "0" に "メインメモリ" の11番地の値 "10" を加えて,結果の値を "アキュムレータ" に格納します.
STORE命令により,"アキュムレータ" の値 "10" を "メインメモリ" の10番地に書き出します.
LOAD命令により,"メインメモリ" の11番地の値 "10" を "アキュムレータ" に読み込みます.
SUB命令により,"アキュムレータ" の値 "10" から "メインメモリ" の12番地の値 "1" を引き,結果の値を "アキュムレータ" に格納します.
STORE命令により,"アキュムレータ" の値 "9" を "メインメモリ" の11番地に書き出します.
"STORE 11" なので "アキュムレータ" の値 "9" を11番地に書き込みます.
JZ命令により,"アキュムレータ" の値がゼロだった場合,"プログラムカウンタ" の値を8にして,プログラムの実行を8番地にジャンプします.
最初の実行では "アキュムレータ" の値は "9" であり,ゼロではないのでジャンプせずに次の命令を実行します.しかし,実行が進むにしたがって,5の "SUB 12" により11番地の値が1つずつ小さくなり,ゼロになるときがきます.
J命令により,無条件で "プログラムカウンタ" の値を0にして,プログラムの実行を0番地にジャンプします.
7に書いたように"メインメモリ" の11番地の値が "0" になるまで,1〜6の実行を反復します."メインメモリ" の11番地の値が "0" になると,"JZ 8" によりプログラムの実行は8番地にジャンプします.そこで "LOAD 10"が実行された後,9番地の"STOP 0" が実行されプログラムが終了します.終了状態は下のようになります.
このプログラムの実行によって,メインメモリ上の10〜12番地の値は,以下のようになることがわかります.