プログラムカウンター
読み:プログラムカウンター
外語:PC: Program Counter
マイクロプロセッサー
が、次に命令を読み込むアドレスを保持している
レジスター
。
プロセッサーによっては、インストラクションポインター(IP)とも呼ぶ。
目次
概要
特徴
68000シリーズ
SuperH
ARM
x86
概要
典型的な
マイクロプロセッサー
では、
リセット
時に0にクリアされるか、またはアドレスのテーブルを用意し、そのテーブルから読み出された番地がセットされる。
従ってプログラムは、前者ならアドレス0から実行が開始され、後者ならテーブルに書き込まれたアドレスから実行が開始されることになる。テーブル式の場合、テーブルのアドレスはCPUごとに規定があり、そのアドレスにはROMを配置するのが一般的である。
特徴
68000シリーズ
680×0
シリーズでは、アドレス0から1023番地までは
割り込みベクターテーブル
となっており、32ビットのアドレスが256個存在する。
このうちベクター0番(アドレス$000)がリセット初期SSP、ベクター1番(アドレス$004)がリセット初期PCとなっており、メモリーに書き込まれたアドレスからプログラム(一般にはBIOSやIOCSと呼ばれるシステムプログラム)が開始される。
68000シリーズではアドレス0からのページにはROMを配置することもあるが、シャープの
X68000
シリーズでは、リセット時のみ、$000000‐$00ffffに$ff0000〜のIPLを配置する方法を採用しており、このため、起動時以外は$0からRAMが配置可能となっている。
SuperH
SuperH
シリーズもアドレス0から1023番地までは割り込みベクターテーブルとなっており、32ビットのアドレスが256個存在する。
SuperHはベクター0番が初期プログラムカウンターとなっており、メモリーに書き込まれたアドレスからプログラムが開始される。
このため、SuperHはアドレス0からのページにはROMが配置されることが多い。
ARM
ARM
には例外ベクターと呼ばれるテーブルが用意されており、ここにブランチ命令を並べて置くことになる。例えばARMv7ではリセット時のプログラムカウンターのありかは、このテーブルの最初(オフセット0x00)である。
この配置アドレスは通常は0x00000000だが、一部のARMコアでは0xFFFF0000から開始するように設定できる。0x00000000はノーマルベクターまたはローベクター、0xFFFF0000はハイベクターまたはHivecsと呼ばれている。仕様書によれば、Hivecsの使用はあまり推奨されていないようで、
ARMv7-R
では非推奨で、ARMv7で用いるのであれば
ARMv7-A
を推奨するとしている。
ROMの場合遅くなりがちなので、通常は別のアドレスにあるROMをリセット時だけ0x00000000からに見せ、その処理にてベクターをRAMに複写し、以降は0x00000000から配置されたRAMを使用する、というような技巧を使う実装も多い。
x86
x86
は、16ビット、32ビット、64ビットと歴史のあるプロセッサーだが、リセット時のプログラムカウンターは、プロセッサーの最上位にある物理アドレスの16バイト下と決まっている。
8086 ‐ FFFF0H (F000H:FFF0H)
80286 ‐ FFFFF0H
80386〜 ‐ FFFFFFF0H
アドレス0からはRAMが配置されることを想定しており、それを邪魔しないよう可能な限り高位のアドレスとなるよう配慮した結果らしい。
このアドレスに、実際の初期化処理ルーチンへのジャンプ命令が書かれていることが多い。
再検索