基本情報技術者〜CPU[2]〜



f:id:potato_head0809:20210116010233p:plain




こんにちは!ポテトヘッド(@potato_head0809)です!



今回はCPUの命令実行手順について触れていこうと思います!



前回の記事をまだ読んでいない方はこちらから!



CPUの命令実行手順



前回にもCPUが命令を実行する順序について触れましたが、



今回はもう少し詳細を見ていこうと思います。



まずは以下の図を見てください。



f:id:potato_head0809:20200707151536p:plain




前回は、CPUが実行するまでの順序を見ましたが、



今回は、そのCPUが実行している中身を見ていきます!



CPUが命令を実行するためには、主記憶装置にプログラムを移し、



そこから、1つずつ取り出して実行しましたよね?



しかし、この「取り出した」命令というのはどこにあるのでしょうか。



そして「次はどの命令を取り出すのか」というのはどうやって覚えているのか。



そこで、必要になるのが「レジスタ」というものです!



レジスタはCPU内部にある記憶装置です。



レジスタの種類と役割



「プログラムカウンタ」


次に実行するべき命令が入っているアドレスを


記憶するレジスタ



   

「命令レジスタ


取り出した命令を一時的に記憶するためのレジスタ



   

「インデックス(指標)レジスタ


アドレス装飾に用いる為のレジスタ


連続したデータの取り出しに使う為の増分値を保持。



   

「ベースレジスタ


アドレス装飾に用いる為のレジスタ


プログラムの先頭アドレスを保持。



   

「アキュムレータ」


演算の対象となる数や演算結果を記憶するレジスタ



   

「汎用レジスタ


特に機能を限定していないレジスタ


一時的な値の保持や、アキュムレータなどの代用に使用。



このような感じで、それぞれに役割があります。



そしてCPUの中身を表したものが以下の図になります。



f:id:potato_head0809:20200707153937p:plain



ここで注意が必要なことは、あるレジスタで他のレジスタの代用をすることがあるので、



必ずしも、先程説明したレジスタが全てあるというわけではありません。



それでは、レジスタについて触れたところで、



一番始めに説明したCPUの実行する中身について順番に見ていきましょう!



①命令の取り出し



まずは1番目です。



ここで使用するレジスタは「命令レジスタ」と「プログラムカウンタ」です。



f:id:potato_head0809:20200707154414p:plain



この最初に行われる命令の取り出しのことを「フェッチ」と言います。



その手順がこちらです。



f:id:potato_head0809:20200707154527p:plain



図にも書いてありますが、簡単に説明すると、



取り出すべき命令はプログラムカウンタが知っており、



そのプログラムカウンタが示すアドレスを参照して命令を取り出します。



その取り出した命令を命令レジスタに記憶させて、



次に備えてプログラムカウンタの値を1つ増加させるというものです。



②命令の解読



ここでは「命令レジスタ」と「命令デコーダ」を使用します。



f:id:potato_head0809:20200707154928p:plain



早速ですが、まずは図を見てみましょう。



f:id:potato_head0809:20200707155013p:plain



ここで、「命令部」と「オペランド部」というワードが出てきました。



簡単に説明します。



   

「命令部」

   
   

実行させたい命令の種類を示すコード番号が入っているところ。



   

オペランド部」

   
   

処理対象となるデータを収めた、

   
   

メモリアドレスなどが入っているところ。



取り出してきた命令を命令部から命令デコーダに送り、



命令デコーダがそれを解読して、必要な装置に制御信号を送るというものです。



③対象データの読み出し



3番目になります。



もし、命令が演算処理だった場合その演算を行うための数字が必要ですよね?



それを読み取るための作業になります。



ここでは、「命令レジスタ」と「汎用レジスタ」を使います。



f:id:potato_head0809:20200707160215p:plain




読み取る作業はこのようにして行われています。



f:id:potato_head0809:20200707160324p:plain




オペランド部が処理の対象となるデータの場所を知っているということです。



しかし、図でも書きましたが、アドレスの指定方法は様々です。



ですので、オペランド部に直接メモリのアドレスそのものが記載されているとは限りません。



④命令実行



さぁ、最後です。



ここまできたら後は実行するだけです。



ここで使うのは「汎用レジスタ」と「ALU」です。



f:id:potato_head0809:20200707160711p:plain



そして、実行は以下のようになります。



f:id:potato_head0809:20200707160744p:plain




一周すれば終了ではありませんよ!



④まで終了したら、次の命令を取り出すので①に戻ります!



最後に。



どうだったでしょうか。



前回は大まかな流れを見ましたが、



今回は実行するまでのCPUの動作の中身を見ました。



始めての方には難しい内容かもしれませんねー。



私も理解出来ているのか...。



しかし、頑張るしかありません。



慣れてくればきっとイメージが持てて理解もしやすいと思います!



一緒に頑張っていきましょう!



最後までご覧頂きありがとうございました。