"1+2の計算" をするプログラムが,実際にどのように動いているのか,詳しく見てみましょう.
0. "STEP"によるプログラムの実行
実行速度は"OPTIONS"メニュで変更できます.動作を確実に観察するためには"default slow"としておくと良いでしょう.通常の速度は"default normal"です.
速度設定を確認したら,"STEP" をクリックして,1命令ごとにプログラムを実行しましょう.
1. "PROGRAM COUNTER"の値「0」からの実行開始
実行開始にあたっては"PROGRAM COUNTER"と"ACCUMURATOR"の値は,ともに「0」となっています.CPUはメインメモリの0番地の命令を読み込むとともに,"PROGRAM COUNTER"の値を1つ増やす操作を始めます.
2. "PROGRAM COUNTER" の値を増やし,メインメモリ上の命令を読み込む
まず"PROGRAM COUNTER"の値が1つ増やされて「1」になります.また当初の"PROGRAM COUNTER" の値「0」にしたがって,メインメモリの0番地の命令を読込みに行きます.
3. "INSTRUCTION REGISTER" の更新
メインメモリの0番地にあった命令 "504 (LDA 4)" が "INSTRUCTION REGISTER" に読み込まれます.
4. "INSTRUCTION REGISTER" の命令 "504 (LDA 4)" の実行
"INSTRUCTION REGISTER" に読み込まれた命令 "504 (LDA 4)" を実行します.
5. "LDA 4" の結果を "ACCUMULATOR" に格納する
LDA命令は
- LDA n: n番地の内容を"ACCUMULATOR"にコピーする
という命令です.ここでは "LDA 4" なので,4番地の値である「1」を "ACCUMULATOR" にコピーします.
"STEP"の最初のクリックで,ここまで実行が進みます.
6. "PROGRAM COUNTER"の値「1」での実行
改めて "STEP" をクリックして,次の命令を実行しましょう."PROGRAM COUNTER"の値は「1」ですので,CPUはメインメモリの1番地の命令を読み込むとともに,"PROGRAM COUNTER"の値を1つ増やす操作をします.
7. "PROGRAM COUNTER" の値を増やし,メインメモリ上の命令を読み込む
"PROGRAM COUNTER"の値が1つ増やされて「2」になります.また直前の"PROGRAM COUNTER" の値「1」にしたがって,メインメモリの1番地の命令を読込みに行きます.
8. "INSTRUCTION REGISTER" の更新
メインメモリの1番地にあった命令 "105 (ADD 5)" が "INSTRUCTION REGISTER" に読み込まれます.
9. "INSTRUCTION REGISTER" の命令 "105 (ADD 5)" の実行
"INSTRUCTION REGISTER" に読み込まれた命令 "105 (ADD 5)" を実行します.
10. "ADD 5" の結果を "ACCUMULATOR" に格納する
ADD命令は
- ADD n: n番地の値を"ACCUMULATOR"の値に加える
という命令です.ここでは "ADD 5" なので,5番地の値である「2」 を "ACCUMULATOR" の値である「1」に加えた値,すなわち「3」を"ACCUMULATOR"に格納します.
"STEP"の2回目のクリックで,ここまで実行が進みます.
11. "PROGRAM COUNTER"の値「2」での実行
改めて "STEP" をクリックして,次の命令を実行しましょう."PROGRAM COUNTER"の値は「2」ですので,CPUはメインメモリの2番地の命令を読み込むとともに,"PROGRAM COUNTER"の値を1つ増やす操作をします.
12. "PROGRAM COUNTER" の値を増やし,メインメモリ上の命令を読み込む
"PROGRAM COUNTER"の値が1つ増やされて「3」になります.また直前の"PROGRAM COUNTER" の値「2」にしたがって,メインメモリの2番地の命令を読込みに行きます.
13. "INSTRUCTION REGISTER" の更新
メインメモリの2番地にあった命令 "306 (STA 6)" が "INSTRUCTION REGISTER" に読み込まれます.
14. "INSTRUCTION REGISTER" の命令 "306 (STA 6)" の実行
"INSTRUCTION REGISTER" に読み込まれた命令 "306 (STA 6)" を実行します.
15. "STA 6" により "ACCUMULATOR" の値をメインメモリに格納する
STA命令は
- STA n: "ACCUMULATOR"の値をn番地に格納する
という命令です.ここでは "STA 6" なので,"ACCUMULATOR" の値である「3」をメインメモリの6番地に格納します.
"STEP"の3回目のクリックで,ここまで実行が進みます.
16. "PROGRAM COUNTER"の値「3」での実行
改めて "STEP" をクリックして,次の命令を実行しましょう."PROGRAM COUNTER"の値は「3」ですので,CPUはメインメモリの3番地の命令を読み込むとともに,"PROGRAM COUNTER"の値を1つ増やす操作をします.
17. "PROGRAM COUNTER" の値を増やし,メインメモリ上の命令を読み込む
"PROGRAM COUNTER"の値が1つ増やされて「4」になります.また直前の"PROGRAM COUNTER" の値「3」にしたがって,メインメモリの3番地の命令を読込みに行きます.
18. "INSTRUCTION REGISTER" の更新
メインメモリの3番地にあった命令 "000 (HLT)" が "INSTRUCTION REGISTER" に読み込まれます.
19. "INSTRUCTION REGISTER" の命令 "000 (HLT)" の実行
"INSTRUCTION REGISTER" に読み込まれた命令 "000 (HLT)" を実行します.
HLT命令は
- HLT: プログラムを終了する
という命令で,プログラムが終了します."STEP"の4回目のクリックで,ここまで実行が進んで,プログラムの実行は終わります.
プログラム実行の流れ
このようにプログラムの実行は,以下の1〜3のサイクルを繰り返します.
- "PROGRAM COUNTER" の値を見て,メインメモリ上の対応する番地の命令を "INSTRUCTION REGISTER" に読み込む
- "PROGRAM COUNTER" の値を 1増やす
- メインメモリから読み込んだ "INSTRUCTION REGISTER" 上の命令を実行する
主な命令は以下のとおり- メインメモリの値を"ACCUMULATOR"にコピーする
- メインメモリの値と"ACCUMULATOR"の値で計算し,"ACCUMULATOR"に格納する
- "ACCUMULATOR"の値をメインメモリに格納する
- プログラムの実行を終了する(この場合,実行のサイクルは止まる)
使われている命令のまとめ
ここまでに利用された命令をまとめると,以下のとおりです.
- LDA n: n番地の内容を"ACCUMULATOR"にコピーする
- ADD n: n番地の値を"ACCUMULATOR"の値に加える
- STA n: "ACCUMULATOR"の値をn番地に格納する
- HLT: プログラムを終了する