【ぷろぐらむかうんた】

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

💡 CPUの「今どこ読んでる?」を常に覚えているしおり
📌 このページのポイント
プログラムカウンタ(PC)の動き CPU プログラムカウンタ 0x0004 参照 +1 自動加算 次のPC 0x0008 メモリ(命令列) 0x0000 ADD R1,R2 0x0004 MOV R3,R1 <-- 今ここ 0x0008 SUB R4,R3 0x000C JMP 0x0000 0x0010 STORE R4 分岐・ジャンプ時 JMP命令を実行すると PCがジャンプ先の アドレスに書き換わる PC = 0x0000
プログラムカウンタのイメージ
ひよこ ひよこ

プログラムカウンタって何なの?

ペンギン先生 ペンギン先生

本を読むときの「しおり」みたいなものだよ。CPUが今どの命令を実行していて、次にどの命令を読めばいいのかを記憶しているレジスタなんだ。

ひよこ ひよこ

命令を実行するたびに勝手に進むの?

ペンギン先生 ペンギン先生

そうだよ。1つの命令を実行し終わると、プログラムカウンタの値が自動的にインクリメントされて次の命令のアドレスを指すんだ。本のページを1枚ずつめくるようなイメージだね。

ひよこ ひよこ

じゃあ、if文みたいに条件で飛ぶときはどうなるの?

ペンギン先生 ペンギン先生

いい質問だね。分岐命令やジャンプ命令を実行すると、プログラムカウンタの値がジャンプ先のアドレスに書き換えられるんだ。しおりを別のページに一気に移すようなものだよ。

ひよこ ひよこ

割り込みが起きたときはどうなるの?

ペンギン先生 ペンギン先生

割り込みが発生すると、今のプログラムカウンタの値をスタックに退避してから割り込み処理に飛ぶんだ。処理が終わったら退避した値を戻して、元の続きから再開できるよ。

ひよこ ひよこ

プログラムカウンタってCPUの中に1つだけあるの?

ペンギン先生 ペンギン先生

基本的にはCPU(コア)1つにつき1つだよ。マルチコアCPUならコアごとにプログラムカウンタがあるんだ。ちなみにARMCPUではプログラムカウンタがr15という汎用レジスタと兼用されていて、プログラムから直接読み書きできるという面白い設計になっているんだよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「プログラムカウンタ」って出てきたら「CPUが次に実行する命令の場所を指すしおり」と思えればだいたいOK!
📖 おまけ:英語の意味
「Program Counter」 = プログラム計数器
💬 プログラムの命令を順番に「数えながら(count)」進んでいくレジスタだから、プログラムカウンタと呼ばれるんだよ
← 用語集にもどる