次に実行する命令のアドレスを保持するレジスタ
プログラムカウンタ(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へ命令長を加算(次に備える)
・③ 実行:取り出した命令を実行する
こうしてプログラマが何もしなくても、命令が上から順に流れていきます。
プログラムはいつも上から順に流れるわけではありません。条件によって処理を飛ばしたり、繰り返したりするために分岐命令(JUMP・条件分岐など)が使われます。このとき活躍するのもPCです。
分岐命令の正体は、「PCに別の番地を直接書き込む」という操作です。通常は「PC + 命令長」で1つ先へ進みますが、分岐命令では代わりに指定された番地(分岐先)をPCにセットします。すると次のフェッチはその番地から始まり、処理の流れがジャンプします。
分岐には大きく2種類があります。
・無条件分岐:必ずジャンプする(例:JUMP)
・条件分岐:条件が成立したときだけジャンプする(例:ゼロなら飛ぶ)。成立しなければ通常どおり PC + 命令長 で次へ進む
・サブルーチン呼び出し:戻り番地を保存してから分岐先へジャンプする
身近な例で言うと、本を読みながら「○○ページへ進め」という指示に従ってページを飛ばすゲームブックのようなものです。PCというしおりに別のページ番号を書き込むことで、読む順番を自在に変えられるわけです。つまり分岐命令とはPCの値を書き換える命令だと言えます。
レジスタ(Register)とは、CPU内にある超高速な一時記憶の小部屋です。レジスタにはいくつか種類がありますが、それぞれ役割が決まっています。
・PC(プログラムカウンタ):次の命令のアドレスを保持。命令フェッチのたびに自動で更新される
・IR(命令レジスタ):フェッチした命令語(「何をしろ」という指示そのもの)を一時保存する
・ACC(アキュムレータ):ALUの演算結果を蓄える汎用レジスタ(=値を足し続けられる「累積器」)
PCが特別な理由は、「アドレスを入れるための専用レジスタで、しかも自動でインクリメント(増加)される」という点です。他のレジスタは制御装置やプログラムの指示で値が変わりますが、PCは命令フェッチの仕組みに組み込まれた「自動更新装置」です。プログラマが意識しなくても命令を順番に実行できるのは、PCが勝手に次のアドレスに進んでくれるからです。
身近な例で言えば、楽譜のページをめくる機能付きの本立てです。演奏が終わるたびに自動で次のページに進む仕組みがあれば、奏者はページをめくることを意識しなくて済みます。PCもまったく同じ発想で、CPU(奏者)が命令実行に集中できるように、「次はどこを見ればよいか」を自動で管理します。
CPUの命令サイクルはPCからスタートします。流れをまとめると次のとおりです。
・① PC が次の命令のアドレスを提示する
・② メモリ からそのアドレスの命令を取り出す(フェッチ)
・③ IR(命令レジスタ) に命令語を一時保存する
・④ 制御装置 が命令を解読(デコード)して各装置に指令を出す
・⑤ PCが更新され(+命令長)、また①に戻る
この流れを見ると、PCは命令サイクルの「起点」であることがわかります。PCがなければ「どの命令を取りに行くか」がわかりません。つまりPCは「プログラムの実行順序を管理する司書」のような存在で、メモリという本棚から正しい順番でページを取り出す役割を担っています。
上のビジュアライザーで▶を押して実行を進めると、PCの値(青い数字)が命令の長さぶんずつ自動で増え、JUMP命令のときだけ別の番地に飛ぶことが確認できます。通常の「PC + 命令長」か「分岐先アドレスの書き込み」か、どちらになるかを制御装置が命令を解読して決めているのです。