はじめに
勉強する習慣を付けたいということで1日1項目1時間勉強していこうと思います。
そして学習した内容をまとめていきます。
学ぶ項目は自分が興味あること、面白そうだと思った項目を選んでいこうと思います。
今回がその第1回目となります。
今回は基本情報技術者試験でも序盤で学習する「CPUの仕組みとレジスタの役割」について学習しました。
CPUとは
CPUはCentral Processing Unit (中央処理装置)の略です。
数値計算、情報処理、機器の制御といった処理を担い、コンピュータの心臓とも言える重要な部分です。
CPUにできること
-
四則演算・論理演算
-
データのコピー
-
プログラムの制御
-
入出力(I/O)処理の管理
レジスタとは
レジスタは、CPU内部に組み込まれている非常に高速な記憶装置で、データや命令を一時的に保存するために使用されます。また、メモリのアドレスを指し示して読み書きを行う際にも使用されます。CPUの動作中、頻繁に使用されるデータをレジスタに保持することで、処理の高速化を実現しています。
1つ1つのレジスタは、8ビット、16ビット、32ビット、64ビットなどの単位でデータを保持することができます。ビット数が大きいほど、より多くの情報を一度に取り扱うことができるため、処理の性能に影響を与えます。
CPUとレジスタの関係
レジスタは、CPU内でのデータ処理の中心として重要な役割を果たしています。CPUは、プログラムの実行中に必要なデータや命令を一時的にレジスタに保存し、そこから直接操作を行います。
もしレジスタが存在しなければ、CPUは処理のたびにメインメモリ(RAM)からデータを読み書きする必要がありますが、これは非常に遅いため、全体の処理速度が大幅に低下します。レジスタはCPU内部にあるため、メモリと比べてはるかに高速にアクセスできるのが特徴です。
CPUとレジスタのイメージ
- CPU:指揮官のように全体の処理をコントロールする
- レジスタ:指揮官の手元のメモ帳として、今必要な情報を即座に書いたり読んだりする場所
レジスタの主な種類
1.汎用レジスタ(General Purpose Register)
用途:演算処理やプログラム実行時に、特定の用途に限定せず幅広く使用されます。
役割:数値演算や論理演算、データの一時保管など、多目的に活用されます。
2.プログラムカウンタ(Program Counter, PC)
用途:実行する次の命令のアドレスを保持するレジスタ。
役割:プログラムの命令が実行されるたびに、プログラムカウンタの値が更新され、次に実行する命令のメモリアドレスを指し示します。これにより、命令が順番に正しく実行されます。
3.命令レジスタ(Instruction Register, IR)
用途:現在実行中の命令を一時的に保持します。
役割:メモリから取得した命令がこのレジスタにロードされ、CPUがそれを解釈し、実行します。CPUの処理サイクルの中心となるレジスタです。
4.アキュムレータ(Accumulator)
用途:演算結果を一時的に保存するレジスタ。
役割:例えば、領域1から領域2にデータを移動する際、アキュムレータを介してデータを転送します。
例:
領域1 → アキュムレータ → 領域2
5.スタックポインタ(Stack Pointer, SP)
役割:スタック領域の管理を行う。
特徴:関数呼び出し時にデータの保存や復元を行い、CPUは後入れ先出し(LIFO)でスタックを操作します。
6.フラグレジスタ(Flag Register)
役割:演算後の結果に応じたフラグを保持する。
特徴:条件分岐命令で使われ、演算結果に基づいてプログラムの流れを制御します。
主なフラグ:
OF(オーバーフロー):演算結果が範囲を超えた場合
ZF(ゼロフラグ):演算結果が0の場合
SF(サインフラグ):演算結果が負の値だった場合
プログラムの処理とレジスタの動き
プログラムを実行すると、CPU内部のレジスタでどのような処理が行われるのかを理解していきます。以下のようなシンプルなコードを例に、レジスタが裏でどのように働くかを見ていきましょう。
int a = 5;
int b = 3;
int c = a + b;
プログラムの処理
int a = 5;
レジスタの処理
命令:
メモリに5という数を保存する命令が実行される。
レジスタ動作:
1、レジスタR1に5を一時的に格納する。
2、R1からメモリに5を保存する。
プログラムの処理
int b = 3;
レジスタの処理
命令:
メモリに3という数を保存する命令が実行される。
レジスタ動作:
1、レジスタR2に3を一時的に格納する。
2、R2からメモリに3を保存する。
プログラムの処理
int c = a + b;
レジスタの処理
命令:
メモリから変数aとbの値を読み取り、それらを加算する命令が実行される。
レジスタ動作:
1、メモリから変数a(=5)を汎用レジスタR1にロード。
2、メモリから変数b(=3)を汎用レジスタR2にロード。
3、ALU(演算装置)がR1とR2の値を加算し、その結果8をアキュムレータ(ACC)に保存。
4、アキュムレータの値(=8)をレジスタR3に移します。
5、レジスタR3にある結果8をメモリの変数cに保存します。
全体の流れ
R1 = 5 (変数aの値を保持)
R2 = 3 (変数bの値を保持)
ACC(アキュムレータ) = R1 + R2 = 8 (加算結果を一時保持)
R3 = 8 (結果を変数cに保存)
このように、普段意識することのないレジスタの動きが、プログラムの裏で高速に行われています。レジスタを活用することで、CPUは不要なメモリアクセスを減らし、プログラムを効率的に実行します。
こうした仕組みを理解することで、メモリの無駄遣いを避け、より効率的なプログラム設計ができるようになります。これを知ることで、CPUとメモリの動きを意識したプログラミングを心がけることも可能になります。
調べれば調べるほどもっと詳しい内容を知れるがとりあえず1時間で学べたことはここまで。
参考