2. "1+2の計算" の詳細

"1+2の計算" をするプログラムが,実際にどのように動いているのか,詳しく見てみましょう.

0. "STEP"によるプログラムの実行

実行速度は"OPTIONS"メニュで変更できます.動作を確実に観察するためには"default slow"としておくと良いでしょう.通常の速度は"default normal"です.

速度設定を確認したら,"STEP" をクリックして,1命令ごとにプログラムを実行しましょう.

"STEP" によるプログラムの実行

1. "PROGRAM COUNTER"の値「0」からの実行開始

実行開始にあたっては"PROGRAM COUNTER"と"ACCUMURATOR"の値は,ともに「0」となっています.CPUはメインメモリの0番地の命令を読み込むとともに,"PROGRAM COUNTER"の値を1つ増やす操作を始めます.

1. "PROGRAM COUNTER" の値「0」からの実行開始

2. "PROGRAM COUNTER" の値を増やし,メインメモリ上の命令を読み込む

まず"PROGRAM COUNTER"の値が1つ増やされて「1」になります.また当初の"PROGRAM COUNTER" の値「0」にしたがって,メインメモリの0番地の命令を読込みに行きます.

"PROGRAM COUNTER" の値を増やし,メインメモリ上の命令を読み込む

3. "INSTRUCTION REGISTER" の更新

メインメモリの0番地にあった命令 "504 (LDA 4)" が "INSTRUCTION REGISTER" に読み込まれます.

"INSTRUCTION REGISTER" の更新

4. "INSTRUCTION REGISTER" の命令 "504 (LDA 4)" の実行

"INSTRUCTION REGISTER" に読み込まれた命令 "504 (LDA 4)" を実行します.

"INSTRUCTION REGISTE" の命令 "504 (LDA 4)" の実行

5. "LDA 4" の結果を "ACCUMULATOR" に格納する

LDA命令は

という命令です.ここでは "LDA 4" なので,4番地の値である「1」を "ACCUMULATOR" にコピーします.

"LDA 4" の結果を "ACCUMULATOR" に格納する

"STEP"の最初のクリックで,ここまで実行が進みます.

6. "PROGRAM COUNTER"の値「1」での実行

改めて "STEP" をクリックして,次の命令を実行しましょう."PROGRAM COUNTER"の値は「1」ですので,CPUはメインメモリの1番地の命令を読み込むとともに,"PROGRAM COUNTER"の値を1つ増やす操作をします.

1. "PROGRAM COUNTER" の値「1」での実行

7. "PROGRAM COUNTER" の値を増やし,メインメモリ上の命令を読み込む

"PROGRAM COUNTER"の値が1つ増やされて「2」になります.また直前の"PROGRAM COUNTER" の値「1」にしたがって,メインメモリの1番地の命令を読込みに行きます.

"PROGRAM COUNTER" の値を増やし,メインメモリ上の命令を読み込む

8. "INSTRUCTION REGISTER" の更新

メインメモリの1番地にあった命令 "105 (ADD 5)" が "INSTRUCTION REGISTER" に読み込まれます.

"INSTRUCTION REGISTER" の更新

9. "INSTRUCTION REGISTER" の命令 "105 (ADD 5)" の実行

"INSTRUCTION REGISTER" に読み込まれた命令 "105 (ADD 5)" を実行します.

"INSTRUCTION REGISTE" の命令 "105 (ADD 5)" の実行

10. "ADD 5" の結果を "ACCUMULATOR" に格納する

ADD命令は

という命令です.ここでは "ADD 5" なので,5番地の値である「2」 を "ACCUMULATOR" の値である「1」に加えた値,すなわち「3」を"ACCUMULATOR"に格納します.

"ADD 5" の結果を "ACCUMULATOR" に格納する

"STEP"の2回目のクリックで,ここまで実行が進みます.

11. "PROGRAM COUNTER"の値「2」での実行

改めて "STEP" をクリックして,次の命令を実行しましょう."PROGRAM COUNTER"の値は「2」ですので,CPUはメインメモリの2番地の命令を読み込むとともに,"PROGRAM COUNTER"の値を1つ増やす操作をします.

1. "PROGRAM COUNTER" の値「2」での実行

12. "PROGRAM COUNTER" の値を増やし,メインメモリ上の命令を読み込む

"PROGRAM COUNTER"の値が1つ増やされて「3」になります.また直前の"PROGRAM COUNTER" の値「2」にしたがって,メインメモリの2番地の命令を読込みに行きます.

"PROGRAM COUNTER" の値を増やし,メインメモリ上の命令を読み込む

13. "INSTRUCTION REGISTER" の更新

メインメモリの2番地にあった命令 "306 (STA 6)" が "INSTRUCTION REGISTER" に読み込まれます.

"INSTRUCTION REGISTER" の更新

14. "INSTRUCTION REGISTER" の命令 "306 (STA 6)" の実行

"INSTRUCTION REGISTER" に読み込まれた命令 "306 (STA 6)" を実行します.

"INSTRUCTION REGISTE" の命令 "306 (STA 6)" の実行

15. "STA 6" により "ACCUMULATOR" の値をメインメモリに格納する

STA命令は

という命令です.ここでは "STA 6" なので,"ACCUMULATOR" の値である「3」をメインメモリの6番地に格納します.

"STA 6" により "ACCUMULATOR" の値をメインメモリに格納する

"STEP"の3回目のクリックで,ここまで実行が進みます.

16. "PROGRAM COUNTER"の値「3」での実行

改めて "STEP" をクリックして,次の命令を実行しましょう."PROGRAM COUNTER"の値は「3」ですので,CPUはメインメモリの3番地の命令を読み込むとともに,"PROGRAM COUNTER"の値を1つ増やす操作をします.

1. "PROGRAM COUNTER" の値「3」での実行

17. "PROGRAM COUNTER" の値を増やし,メインメモリ上の命令を読み込む

"PROGRAM COUNTER"の値が1つ増やされて「4」になります.また直前の"PROGRAM COUNTER" の値「3」にしたがって,メインメモリの3番地の命令を読込みに行きます.

"PROGRAM COUNTER" の値を増やし,メインメモリ上の命令を読み込む

18. "INSTRUCTION REGISTER" の更新

メインメモリの3番地にあった命令 "000 (HLT)" が "INSTRUCTION REGISTER" に読み込まれます.

"INSTRUCTION REGISTER" の更新

19. "INSTRUCTION REGISTER" の命令 "000 (HLT)" の実行

"INSTRUCTION REGISTER" に読み込まれた命令 "000 (HLT)" を実行します.

HLT命令は

という命令で,プログラムが終了します."STEP"の4回目のクリックで,ここまで実行が進んで,プログラムの実行は終わります.

"INSTRUCTION REGISTE" の命令 "000 (HLT)" の実行

プログラム実行の流れ

このようにプログラムの実行は,以下の1〜3のサイクルを繰り返します.

  1. "PROGRAM COUNTER" の値を見て,メインメモリ上の対応する番地の命令を "INSTRUCTION REGISTER" に読み込む
  2. "PROGRAM COUNTER" の値を 1増やす
  3. メインメモリから読み込んだ "INSTRUCTION REGISTER" 上の命令を実行する
    主な命令は以下のとおり
    • メインメモリの値を"ACCUMULATOR"にコピーする
    • メインメモリの値と"ACCUMULATOR"の値で計算し,"ACCUMULATOR"に格納する
    • "ACCUMULATOR"の値をメインメモリに格納する
    • プログラムの実行を終了する(この場合,実行のサイクルは止まる)

使われている命令のまとめ

ここまでに利用された命令をまとめると,以下のとおりです.