次に分岐を使ったプログラムの実行を見てみましょう.
0. プログラムの入力
以下のプログラムをプログラム領域にコピー&ペーストして,"Submit"ボタンを押して,メインメモリに読み込んでください.
1. "STEP"によるプログラムの実行
ここでも"STEP"をクリックして1命令ずつ実行して行きます.最初の状態では"PROGRAM COUNTER"と"ACCUMURATOR"の値は,ともに「0」となっています.
2. "SUB 4" の実行
0番地の命令は "205 (SUB 5)" です.SUB命令は
- SUB n: n番地の値を"ACCUMULATOR"の値から引く
という命令ですから,"ACCUMULATOR" の初期状態の値「0」から5番地の値である「-5」を 引いて,結果の「5」を"ACCUMULATOR"に格納します.
3. "BRP 3" による条件つきのジャンプ
1番地の命令は "803 (BRP 3)" です.BRP命令は
- BRP n: "ACCUMULATOR"の値が正または0の時に,"PROGRAM COUNTER"の値をnにする(プログラムの実行をn番地にジャンプする)
という命令です.ここでは "ACCUMULATOR" の値は「5」で正ですから,"PROGRAM COUNTER"の値が「3」になります.
仮に(5番地の値が正で)"ACCUMULATOR" の値が負になった場合は, "PROGRAM COUNTER" の値は1つ増えて「2」になります.
4. "STA 5" の実行
3番地の命令は "305 (STA 5)" です.したがって,"ACCUMULATOR" の値「5」をメインメモリの5番地に書き出します.
5. "HLT" によるプログラムの終了
3番地の命令は "000 (HLT)" です.HLT命令によって,プログラムが終了します.このとき4番地に格納されている値「5」は、プログラム開始時の4番地の値「-5」の絶対値となっています.
プログラムの終了時には,以下のようになります.
6. "RESET"によるプログラムの再実行
ここで"RESET"をクリックすると,"PROGRAM COUNTER"と"ACCUMURATOR"の値は,ともに「0」になります.1つ注意する必要があるのは,メインメモリの5番地が変わっていることです.元々のプログラムでは「-5」でしたが,1回実行したため「5」に書き換えられています.ここから"STEP"で1命令ずつ実行してみましょう.
7. "SUB 4" の実行
0番地の命令は "205 (SUB 5)" です."ACCUMULATOR" の初期状態の値「0」から5番地の値である「5」を引いて,結果の「-5」が"ACCUMULATOR"に格納されます.
8. "BRP 3" による条件つきのジャンプ
1番地の命令は "803 (BRP 3)" です.ここでは "ACCUMULATOR" の値は「-5」ですから,今回は"PROGRAM COUNTER"の値は「3」には書き換えられずに「2」となります.
5. "HLT" によるプログラムの終了
2番地の命令は "000 (HLT)" です.HLT命令によって,プログラムが終了します.このとき4番地に格納されている値「5」は、プログラム開始時の4番地の値「5」の絶対値となっています.
プログラムの終了時には,以下のようになります.
分岐命令
分岐を行う命令には,以下のようなものがあります.- BRA n: 無条件でn番地にジャンプ
- BRP n: "ACCUMULATOR"の値が非負(正またはゼロ)のときにn番地にジャンプ
- BRZ n: "ACCUMULATOR"の値がゼロのときにn番地にジャンプ
演習: 分岐命令の動きを確かめる
上で説明したサンプルプログラム"n番地の内容の絶対値をとる" の,4番地の値を自分の誕生月やその他の値に変えるとどうなるか,確かめてみましょう.