コンテンツにスキップ

プログラムカウンタ

出典: フリー百科事典『ウィキペディア(Wikipedia)』
1952年のIBM 701コンピュータのフロントパネル。中央にあるライトは様々なレジスタの中身を表示する。命令カウンタは左下に存在。

プログラムカウンタ: program counter、略してPC[1]とは、コンピュータプログラムの実行順序のどこに存在するかを示すレジスタである[2][nb 1]。PCはインテルx86およびItaniumマイクロプロセッサでは一般的に命令ポインタ (IP)[3][1]と呼ばれるが、まれに命令アドレスレジスタ (IAR)[3][1]命令カウンタ[4]、あるいは単に命令シーケンサーの一部[5]とも呼ばれる。

通常、PCは命令フェッチした後にインクリメントされ、次に実行される命令のメモリアドレス(またはそれを保存したポインタのメモリアドレス)が保存される[6][nb 2]

普段プロセッサはメモリから順番通りに次の命令をフェッチするが、制御転送命令によりPCへ新しい値が設定されると実行順序が変化する。これらの制御転送命令には、分岐命令(時々ジャンプ命令と呼ばれる)、サブルーチン呼び出し、そしてreturn命令などがあり、ある条件判定の真偽に応じて実行順序を変えるようにコンピュータを従わせる。

分岐命令は、次に実行すべき命令をメモリのどの場所からフェッチするかを規定する。サブルーチン命令は分岐命令を呼び出すだけでなく、直前のPCの値をどこかへ保存する。return命令は、サブルーチン命令により保存されたPCの値を取り出しそれをPCへと戻し、サブルーチン呼び出し直後の命令から順番通りに実行を再開する。

ハードウェア実装

[編集]

単純なCPUでは、PCは(「プログラムカウンタ」という用語の語源としての)デジタルカウンタである、さらにその場合、PCはハードウェアレジスタの中の1つかもしれない。命令サイクル英語版[8]の始まりはフェッチであり、これによってCPUはアドレスバスにPCの値を配置してそれをメモリに送信する。その送信を受けたメモリは、メモリ位置に存在する値を応答としてデータバスでCPUに送信する(これがプログラム内蔵方式モデルであり、単純なメモリ空間には実行命令と普通のデータの両方が含まれる[9])。CPUはフェッチが終わると次に実行へと遷移する。これによりCPUは応答として送信されたメモリの値に基づいて、何らかの動作を実行する。このサイクルのどこかで、次に実行する命令を異なるものとするようPCが修正される可能性がある(通常、PCはインクリメントされ、現在の命令メモリ位置の直後のメモリアドレスにある命令を次の命令として即座に開始する)。

PCは他のプロセッサレジスタのようにバイナリラッチのバンクであり、1つのラッチがPCの値の1ビットを表す[10]。ビットの数(PCの幅)はプロセッサのアーキテクチャと関係がある。例えば「32ビット」CPUは32ビットを使いメモリを232個の単位として指定できる。プロセッサの中には、PCの幅がアドレス指定可能なメモリに依存するものもある。例えば、AVRマイクロコントローラの中には12ビットでラップアラウンドするものもある[11]

PCがバイナリカウンタの場合、パルスがPCのCOUNT UP入力であればインクリメントされ、パルスがPCのLOAD入力であればCPUが他の値をいくつか演算した結果をPCへロードするなどが行われる[12]

現在の命令を特定するため、PCはセグメントページ英語版を特定する他のレジスタと組み合わされることもある。このアプローチでは関心のあるメモリ単位のほとんどが現在位置の近くにあると仮定することで、PCのビット数をより少なくできる。

機械アーキテクチャへの影響

[編集]

通常、インクリメントするPCの使用は、コンピュータは通常順序通りに命令を実行することを前提としている。このようなPCはノイマン型アーキテクチャの主流である。そのため、プログラマは例え順序通りに実行すべきではないアルゴリズムであっても、順序通りに実行するように制御構造を書く。その結果として生じた「フォン・ノイマン・ボトルネック」により、並列計算の研究が導かれた[13]。この研究成果には、PCを使用しない非ノイマン型やデータフローモデルなどがある。実行順序の順序を指定しない例としては、上層のプログラマによる希望の関数指定や、下層のプログラマによるコンビネータ論理使用の指定などがある。

並列計算の研究は、以下に示すような方法で従来のPCベースのCPUをより高速に動作させる方向へと導いた:

高水準プログラミングにおける結果

[編集]

現代の高水準プログラミング言語では未だに順序通りの実行モデルに従う。実際、プログラミングエラーを特定する一般的方法は、PC同様にプログラマの指が実行箇所を特定するという「手続き実行」で行う。高水準プログラミング言語は原則的に仮想機械機械語とされる[14]が、それをハードウェアとして構築するにはあまりに複雑なため、代わりにエミュレータインタプリタといったソフトウェアで構築する。

しかしながら新しいプログラミングモデルは、以下のように順序通りの実行プログラミングより優れている:

関連項目

[編集]

注釈

[編集]
  1. ^ 現代のプロセッサでは命令レベルの並列性アウト・オブ・オーダー実行が発生するため、「実行順序のどこに存在するか」という概念は単純化し過ぎである。
  2. ^ インクリメントがフェッチの前に行われるプロセッサでは、PCは現在実行されている命令を指し示す。プロセッサの中には、PCが現在の命令よりも少し離れた命令を指し示すものもある。例えばARM7では、プログラマから見えるPCの値は現在の命令や遅延スロットから離れた命令を指し示す[7]

脚注

[編集]
  1. ^ a b c Hayes, John P. (1978). Computer Architecture and Organization. McGraw-Hill. p. 245. ISBN 0-07-027363-4 
  2. ^ Bates, Martin (2011). “Microcontroller Operation”. PIC Microcontrollers. Elsevier. p. 27–44. doi:10.1016/b978-0-08-096911-4.10002-3. ISBN 978-0-08-096911-4. "Program Counter (PC) is a register that keeps track of the program sequence, by storing the address of the instruction currently being executed. It is automatically loaded with zero when the chip is powered up or reset. As each instruction is executed, PC is incremented (increased by one) to point to the next instruction." 
  3. ^ a b Introduction to VLSI Systems. Reading, USA: Addison-Wesley. (1980). ISBN 0-201-04358-0. https://archive.org/details/introductiontovl00mead 
  4. ^ Principles of Operation, Type 701 and Associated Equipment. IBM. (1953). http://bitsavers.org/pdf/ibm/701/24-6042-1_701_PrincOps.pdf 
  5. ^ Harry Katzan (1971), Computer Organization and the System/370, Van Nostrand Reinhold Company, New York, USA, LCCCN 72-153191
  6. ^ Silberschatz, Abraham; Gagne, Greg; Galvin, Peter B. (April 2018). Operating System Concepts. United States: Wiley. pp. 27, G-29. ISBN 978-1-119-32091-3. https://www.wiley.com/en-us/Operating+System+Concepts%2C+10th+Edition-p-9781119320913 
  7. ^ ARM Developer Suite, Assembler Guide. Version 1.2”. ARM Limited (2001年). 2019年10月18日閲覧。
  8. ^ John L. Hennessy and David A. Patterson (1990), Computer Architecture: a quantitative approach, Morgan Kaufmann Publishers, Palo Alto, USA, ISBN 1-55860-069-8
  9. ^ B. Randall (1982), The Origins of Digital Computers, Springer-Verlag, Berlin, D
  10. ^ C. Gordon Bell and Allen Newell (1971), Computer Structures: Readings and Examples, McGraw-Hill Book Company, New York, USA
  11. ^ “E. Predefined Symbols”. Macro Assembler AS – User's Manual (V1.42 ed.). (2020). p. Table E.3: Predefined Symbols – Part 3. オリジナルの2020-02-28時点におけるアーカイブ。. http://john.ccac.rwth-aachen.de:8000/as/as_EN.html#sect_E_ 2020年2月28日閲覧. "3.2.12. WRAPMODE […] AS will assume that the processor's program counter does not have the full length of 16 bits given by the architecture, but instead a length that is exactly sufficient to address the internal ROM. For example, in case of the AT90S8515, this means 12 bits, corresponding to 4 Kwords or 8 Kbytes. This assumption allows relative branches from the ROM's beginning to the end and vice versa which would result in an out-of-branch error when using strict arithmetics. Here, they work because the carry bits resulting from the target address computation are discarded. […] In case of the abovementioned AT90S8515, this option is even necessary because it is the only way to perform a direct jump through the complete address space […]" 
  12. ^ Introduction to Computer Engineering. London, UK: University of London Press. (1967). ISBN 0-340-06831-0 
  13. ^ F. B. Chambers, D. A. Duce and G. P. Jones (1984), Distributed Computing, Academic Press, Orlando, USA, ISBN 0-12-167350-2
  14. ^ Douglas Hofstadter (1980), Gödel, Escher, Bach: an eternal golden braid, Penguin Books, Harmondsworth, UK, ISBN 0-14-005579-7