「CPUの動きを知ると、コンピュータが身近になる!」と偉い学者さんが言ったか、言わなかったか分かりませんが、これは事実です!
コンピュータの動きはざっくり言うと、「メモリにあるプログラムを読み込んで、CPUがプログラムの命令に従って処理をする」だけです。
「簡単じゃん!」と思いますが、実際はそんなに単純な流れでは無く、主記憶装置の命令を一つずつ取り出して、丁寧に処理していく必要があり、その時にプログラムカウンタやレジスタ、ALUなどが活躍します。
そこで、今回はこのCPUでの命令実行の流れを解説し、コンピュータを身近に感じてもらいます!
CPUは色々な装置で構成されている!
まず、CPUは大きく「演算装置」と「制御装置」に分けることができますが、それらの装置を実現するものとして「レジスタ」と呼ばれる小さな記憶装置があります。
レジスタには色々な種類がありますが、代表的にものとしては以下の通りとなります。
レジスタの種類
- プログラムカウンタ : 次に実行すべき命令が入っているアドレスを記憶する
- 命令レジスタ : 取り出した命令を一時的に記憶する
- 汎用レジスタ : 一般的な値の保持や、他のレジスタの代用になる
- インデックスレジスタ : アドレス修飾に用いるためのレジスタで、連続したデータの取り出しに使うための増分値を保持する
- ベースレジスタ : アドレス修飾に用いるためのレジスタで、プログラムの先頭アドレスを保持する
- アキュムレータ : 演算の対象となる数や演算結果を記憶するレジスタ
これらのレジスタの他にCPUを構成する代表的な装置として、「ALU」と「命令デコーダ」があります。
◎ALU( Arithmetic and Logic Unit )
算術演算(四則演算)や論理演算などの計算を行う装置 のことで、加算器や論理演算器などの演算回路を持って様々な演算を行うことができる
◎命令デコーダ
命令レジスタに読み込まれた命令の内容を解読して、実行の準備をする装置のこと。
機械語の命令を解読して、他の装置へ制御信号を出す。
これらの装置を組み合わせてCPUができているのです。イメージとしては以下の図のようになりますね。
CPUの命令実行の流れを詳しく見てみよう!
例えば、加算処理として「3+5」を実行する際は「+」の加算をするという命令だけではなく、加算対象となる「3」と「5」の対象データが必要です。このデータは命令部(加算)と処理部(データ)で構成され、処理対象のデータの格納場所を示す場所をアドレス部といいます。
つまり、命令は【命令部】+【アドレス部】で構成されます。
アドレス部の中の処理対象となるデータはオペランドといい、オペランドの保存場所を導き出すことを実行アドレス計算と呼びます。因みに命令のことはオペコードと呼びます。
概念的に表すと、【命令部(オペコード)】【アドレス部(オペランド)】になります。
またオペランドの格納場所を計算することを実行アドレス計算と呼びます。
これらの言葉を理解した上で、命令実行サイクルを説明しますが、このサイクルには以下の5つの段階があります。
CPU命令実行サイクル
- 命令フェッチ(Fetch):命令を主記憶から取り出し、CPUの命令レジスタに取り込む
- 命令の解読(Decode):命令コードを解読する(デコード)
- 実行アドレス計算(Address Calculation):命令対象となるオペランドの格納場所を計算して求める
- オペランド読み出し(Read):主記憶の実行アドレスにアクセスし、オペランドを読み出す
- 命令の実行(Execution):命令を実行し、必要に応じて結果データを主記憶に書き込む
この流れを図に表すと以下のようになります。
では、続いてそれぞれの動作を細かく見てみましょう!
①命令の取り出し(フェッチ)
主記憶装置にロードされたプログラムから命令をCPU内に取り出すための動作となります。
ここでは、レジスタとして、プログラムカウンタと命令レジスタが活躍します。
②命令の解読
先程のフェッチで取り出した命令の解読作業になります。
ここでは、命令を格納した命令レジスタと命令デコーダが活躍します。
③実行アドレスの計算
先程のフェッチで取り出したオペランド部のアドレスを計算して、メモリ内の対象データの在りか(アドレス)を探し出します。
ここでは、命令を格納した命令レジスタ(オペランド部)が活躍します。
アドレスの計算方法としては、直接アドレス指定や間接アドレス指定、ベースアドレス指定など色々あり、これをアドレス修飾と呼びます。
④オペランド読出し
先程の実行アドレス計算によって導かれたメモリ上のアドレスから対象データを探し出して、CPU内のレジスタに記憶する作業です。
ここでは、命令を格納した汎用レジスタを使います。
⑤命令の実行
最後はオペランドを記憶した汎用レジスタから処理対象のデータを取り出して、ALU(演算装置)で演算し、結果をまた汎用レジスタに書き戻して終了となります。
ここまでの処理が完了したら、また最初の「①命令データの取り出し(フェッチ)」に戻って、命令実行サイクルを繰り返していきます。
まとめ
今回はCPUの内部の装置とそれらを使った命令実行サイクルの流れを解説してきました。
メモリとCPU間で5つの段階を使ってデータのやり取りを行い一つの演算結果を得ていますが、実際はこのサイクルが短時間で高速に行われていることが凄いことですよね。
普段我々がパソコンやスマホを使っている裏でこのサイクルが常に高速に行われていることで、違和感無く使えている訳ですから、CPUをここまで進化させて頂いた技術者の方に感謝ですね!
そして、このサイクルの裏で使われているレジスタやALUなどの装置も理解しておくことも大事ですね。
この記事でコンピュータが身近に感じられたら幸いです。
以下記事で「コンピュータの5大装置の解説」をしてますので、CPUの位置付けを理解する上でも併せて読んでみてください。
以上です!