AOBA's Information Processing Education
1998/01/25
注意1:このページは、回線を切断した後でゆっくりご覧になってください(テキストを印刷する場合は、その取り扱いに注意してくださるようお願いします)。
注意2:背景が白地の画面を長時間見つめていると頭が痛くなってしまいますので、ここは背景をグレーにしています。
先週は解説がシリキレトンボですみませんでした。今週こそ命令サイクルについての解説を行います。
命令サイクルとは、「CPUが主記憶装置から一つの命令を取り出してから、その命令の実行を終了するまでの過程」のことをいいます(これは先週もちょっとだけ触れました)。
ここでは、先週も用いた加算命令を例として、この命令を主記憶装置から取り出してから、その命令実行が終了するまでのCPUの動作を説明をしましょう(すべての命令でCPUが完全に同じ動作をするとは限らないのですが、とりあえずは同じ動作を行う、と考えて結構です)。
例にする加算命令の構成をもう一度以下に示します。
20 01 1000 (注1)すべて16進数で示しています。また、16進数で20を加算命令としましたので、この命令の意味は、GR1の内容と(16進数で)1000番地の内容を加算して、その結果をGR1に設定せよ、というものです。
(注2)命令部は8ビット、レジスタ指定も8ビット、番地指定は16ビットの合計32ビットで1命令を構成するとします。
(注3)一見、COMETの機械語に見えますが、ちょっと違います。COMETで同じ動作を行うには、(20101000)16でなければなりません。CPUは主記憶装置に格納してあるプログラムの若い番地(小さい数の番地)から順に命令を取り出して実行します(第10回講座を参照)。つまり、プログラムの先頭が16進数で0300番地ならば、まず0300番地の命令を取り出して実行し、次に0301番地、その次が0302番地....と順に実行するのです(プログラムの停止命令に出会うまで)。
ただしこの説明で用いるコンピュータは、16ビットごとに番地が振られると仮定しました。
すると、もしプログラムの先頭が16進数で0300番地ならば、最初の0300番地の命令を取り出して実行すると、次に実行する命令の番地は0302番地です。そして次が0304番地...と2番地づつ増加することになります。なぜだか分かりますか?。次の図を参考にして考えてみてください(一つの命令が32ビット構成ですよ)。
![]()
さて図1を見ると、制御装置の中に命令アドレスレジスタというものがあって、その値が16進数で0300になっていますね。
命令アドレスレジスタとは、これから実行する(または次に実行する)命令のアドレスを内容とするレジスタで、このレジスタでもってプログラムの流れを(どの番地の命令を実行するかを)制御しているのです。図1はプログラム開始直後の状態ですので、命令アドレスレジスタはプログラムの先頭の0300となっています。(注)命令アドレスレジスタは命令カウンタとか、プログラムカウンタとか、逐次制御カウンタ等と呼ばれることもあります。
ここまでが前置きで(いつもながら長いなー)、ここからが本題の命令サイクルの説明です。
今CPUは0302番地の命令の実行を終了したとします(0302番地の命令分の命令サイクルが終了したとします)。すると命令アドレスレジスタの内容は0304になっているはずで、ここから0304番地の命令分の命令サイクルが開始されます。
実は、命令サイクルはさらに、命令取り出し段階と命令実行段階の2段階に分けることができます(命令サイクル=命令取り出し段階+命令実行段階)。
命令取り出し段階における各装置の動作は次の通りですので、図2を見ながら動作を追ってください。
- 制御装置は命令アドレスレジスタの内容(つまり0304)を主記憶装置のアドレス選択機構に送る。
- 主記憶装置のアドレス選択機構は、送られた番地に存在する命令(つまり20011000)を制御装置内の命令レジスタに送る。
- 次の命令に備えて、制御装置は命令アドレスレジスタの内容を更新する(+2する。つまり0306にする)。
![]()
同じく図3を見ながら、命令実行段階における動作を追いましょう。
- 制御装置は命令部の値を命令デコーダで解釈し(ここで加算命令と分かる)、命令の種類に応じた動作を行う演算回路を選択する(つまり、加算回路が選択される)。
- 制御装置は命令の番地部からレジスタの番号(01だからGR1)を指定するとともに、データが存在する番地(つまり1000)を主記憶装置のアドレス選択機構に送る。
- 演算装置は(5)で指定された番地にあたるデータ(つまり0003)とGR1の内容(つまり0005)を演算回路に取り込む。
- 演算装置は(演算回路を用いて)演算を実行し、結果(つまり0008)をGR1に格納する。
![]()
ここまでで0304番地の命令分の命令サイクルが終了し、次に0306番地の命令分の命令サイクルが開始されます。
(注1)命令取り出し段階を、命令取り出しサイクルやフェッチサイクル等と呼ぶこともあります。
(注2)命令実行段階を、命令実行サイクルやエグゼキュートサイクル等と呼ぶこともあります。以上で命令サイクルの説明は終わりです。
今週はちょっとハードだったかもしれませんね。重要な用語もたくさん出てきました。しかも皆似た用語なので覚えずらいかもしれません。
来週はこれまで演習がなかった分、たくさん演習を行いますので、2〜3回前の講座から復習をしておくように。
ではまた来週。