FE EXAM

プログラムカウンタ(PC)

次に実行する命令のアドレスを保持するレジスタ

INTERACTIVE VISUALIZATION
PCが指す命令
実行中
分岐先
現在のPC値
0x100
命令長
4 バイト
現在のフェーズ
IDLE
プログラムの実行

▶ または「次へ」を押すと、フェッチ → 実行 → PC更新 を繰り返します。JUMP命令に来るとPCが指定番地へジャンプします。

ステップ 1 / 15
STEP 1/15初期状態:PCがプログラム先頭を指すプログラムカウンタ(PC)には、最初に実行する命令の番地 0x100 がセットされます。PC=「次に実行する命令のアドレスを覚えておくレジスタ」のことです。CPUはこの値を見て、どの命令を取り出すかを決めます。
メモリ(命令列)PC0x100LOAD R1, 100x104ADD R1, 50x108JUMP 0x118分岐0x10CSUB R1, 30x110MUL R1, 20x114NOP0x118STORE R1, X0x11CHALT0x100
解説

📌
プログラムカウンタとは

PC0x1040x100 LOAD0x104 ADD0x108 JUMPPCが「次に読む命令の番地」を指している

プログラムカウンタ(PC:Program Counter)とは、次に実行する命令が置かれているメモリ上のアドレス(番地)を保持しておく小さな記憶装置(レジスタ)のことです。「命令アドレスレジスタ」とも呼ばれます。CPUはこのPCの値を見て「次はどの命令を取りに行けばいいか」を判断します。

身近な例で言うと、本を読むときの「しおり(ブックマーク)」に似ています。しおりは「次に読むページ」を覚えておく道具ですよね。PCも同じで「次に実行するべき命令の場所」をいつも覚えていて、CPUが迷わず次の命令へ進めるようにしています。

上のツールで▶ボタンを押すと、青いPCがメモリ上の命令を1つずつ指し示しながら進んでいく様子が見られます。命令を実行するたびにPCの値が変化することに注目してください。

⚙️
自動更新の仕組み

PCの最大の特徴は、命令を1つフェッチ(取り出し)するたびに、自動で次の命令の番地に進む点です。プログラムは原則として上から順番に並んでいるので、PCを命令の長さぶんだけ足せば、自然に次の命令を指すようになります。

PC ← PC + 命令長

ここで命令長とは「1つの命令が占めるバイト数」のこと。たとえば命令長が4バイトなら、PCは毎回4ずつ増えていきます。

例: 命令長 = 4 バイトのとき
0x100 を実行 → PC = 0x100 + 4 = 0x104
0x104 を実行 → PC = 0x104 + 4 = 0x108
0x108 を実行 → PC = 0x108 + 4 = 0x10C

重要なのは、この「PCに命令長を足す」更新が命令のフェッチ段階で自動的に行われること。
① フェッチ:PCが指す番地から命令を取り出す
② PC更新:取り出した直後にPCへ命令長を加算(次に備える)
③ 実行:取り出した命令を実行する
こうしてプログラマが何もしなくても、命令が上から順に流れていきます。

🔀
分岐命令での動き

0x108 JUMP 0x1140x10C SUB飛ばす0x110 MUL飛ばす0x114 STOREJUMPPCに分岐先0x114を直接書き込む

プログラムはいつも上から順に流れるわけではありません。条件によって処理を飛ばしたり、繰り返したりするために分岐命令(JUMP・条件分岐など)が使われます。このとき活躍するのもPCです。

分岐命令の正体は、「PCに別の番地を直接書き込む」という操作です。通常は「PC + 命令長」で1つ先へ進みますが、分岐命令では代わりに指定された番地(分岐先)をPCにセットします。すると次のフェッチはその番地から始まり、処理の流れがジャンプします。

分岐には大きく2種類があります。
無条件分岐:必ずジャンプする(例:JUMP)
条件分岐:条件が成立したときだけジャンプする(例:ゼロなら飛ぶ)。成立しなければ通常どおり PC + 命令長 で次へ進む
サブルーチン呼び出し:戻り番地を保存してから分岐先へジャンプする

身近な例で言うと、本を読みながら「○○ページへ進め」という指示に従ってページを飛ばすゲームブックのようなものです。PCというしおりに別のページ番号を書き込むことで、読む順番を自在に変えられるわけです。つまり分岐命令とはPCの値を書き換える命令だと言えます。

📌
PCとほかのレジスタの違い

主なレジスタの種類と役割PC次の命令のアドレスを保持(自動更新)IR取り出した命令語を一時保存ACC演算結果(アキュムレータ)を保持PCだけが「アドレス専用・自動インクリメント」という特殊な役割を持つ

レジスタ(Register)とは、CPU内にある超高速な一時記憶の小部屋です。レジスタにはいくつか種類がありますが、それぞれ役割が決まっています。
PC(プログラムカウンタ):次の命令のアドレスを保持。命令フェッチのたびに自動で更新される
IR(命令レジスタ):フェッチした命令語(「何をしろ」という指示そのもの)を一時保存する
ACC(アキュムレータ):ALUの演算結果を蓄える汎用レジスタ(=値を足し続けられる「累積器」)

PCが特別な理由は、「アドレスを入れるための専用レジスタで、しかも自動でインクリメント(増加)される」という点です。他のレジスタは制御装置やプログラムの指示で値が変わりますが、PCは命令フェッチの仕組みに組み込まれた「自動更新装置」です。プログラマが意識しなくても命令を順番に実行できるのは、PCが勝手に次のアドレスに進んでくれるからです。

身近な例で言えば、楽譜のページをめくる機能付きの本立てです。演奏が終わるたびに自動で次のページに進む仕組みがあれば、奏者はページをめくることを意識しなくて済みます。PCもまったく同じ発想で、CPU(奏者)が命令実行に集中できるように、「次はどこを見ればよいか」を自動で管理します。

📌
CPU全体の流れの中でPCはどう動くか

PC番地メモリ命令を格納命令IR命令保存制御装置PC → メモリ → IR → 制御装置PCのアドレスからフェッチが始まり命令サイクルが回る

CPUの命令サイクルはPCからスタートします。流れをまとめると次のとおりです。
① PC が次の命令のアドレスを提示する
② メモリ からそのアドレスの命令を取り出す(フェッチ)
③ IR(命令レジスタ) に命令語を一時保存する
④ 制御装置 が命令を解読(デコード)して各装置に指令を出す
⑤ PCが更新され(+命令長)、また①に戻る

この流れを見ると、PCは命令サイクルの「起点」であることがわかります。PCがなければ「どの命令を取りに行くか」がわかりません。つまりPCは「プログラムの実行順序を管理する司書」のような存在で、メモリという本棚から正しい順番でページを取り出す役割を担っています。

上のビジュアライザーで▶を押して実行を進めると、PCの値(青い数字)が命令の長さぶんずつ自動で増え、JUMP命令のときだけ別の番地に飛ぶことが確認できます。通常の「PC + 命令長」か「分岐先アドレスの書き込み」か、どちらになるかを制御装置が命令を解読して決めているのです。

関連コンテンツ