この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方)
出典検索?: "レジスタ" コンピュータ
レジスタ(英: register)はコンピュータのプロセッサなどが内蔵する記憶回路で、制御装置や演算装置や実行ユニットに直結した、操作に要する速度が最速の、比較的少量のものを指す[1]。 一般に、論理回路において、フリップフロップなどにより状態を保持する装置をレジスタと呼ぶ。コンピュータにおいては、プロセッサが内蔵しているそれを指す。プロセッサには、命令セットで明示的に操作するレジスタ以外に、プロセッサ自身が動作するためのレジスタがあり、内部レジスタなどと呼ばれる。 論理回路において使われるレジスタという用語としては、たとえばレジスタ転送レベルなどがある。 プロセッサ内部のレジスタは、計算結果を一時的に保持したり、RAMやROMなどのメインメモリにアクセスする際のアドレスを保持したり、プロセッサや周辺機器の動作状態を保持・変更したりする。プロセッサの動作とは、極端にいえば、プログラムコードに従ってメインメモリとレジスタの間でデータを移送することだと表現できる。 プロセッサ内部にはたいてい数個から数十個のレジスタがあり、内部バスや演算回路などと密接に結びついているため、高速に動作する。 プロセッサについて「○○ビットプロセッサ(あるいは○○ビットCPU、○○ビットDSPなど)」と表現する場合、その目安の一つがレジスタの幅、特にそのプロセッサの汎用レジスタの幅である。また、MC68000のようにプロセッサ自体の設計は32ビットだが外部データバスは16ビット、といった設計の場合、「内部32ビット・外部16ビットCPU」のように言うこともある。こだわる人もいるが、そもそも厳密に定義できるわけでもないのでこだわる意味はない。 プロセッサの内部にどのようなレジスタがあるかということは、そのプロセッサの構造(アーキテクチャ)と命令セットに密接に関わる。 プロセッサ内部のレジスタには、用途に応じていくつかの種類がある。 通常、レジスタには、マニュアルなどで使われる英字1?3文字程度の略称がある。 特定の目的を持つレジスタ。 演算装置の出力と片方の入力につながった、ただ1個のレジスタがあり、そのレジスタに演算の結果を溜め込むことができる、といった古い設計のコンピュータで使われた語である。現在でもx86のAXレジスタのような多用されるレジスタを指して言うことがある。 A, ACCと略すことが多い。 演算結果を置いたり、データを一時的に記憶するレジスタである。プロセッサの内部バスにより演算装置とデータをやりとりできる。また、外部データバスとデータをやりとりできる。 メモリをアクセスする場合のアドレスを指定するときに用いるレジスタである。この内容を外部アドレスバスに出す事により、メインメモリからデータを読み出す。また、プロセッサによっては、アドレスを計算するための演算回路が付属しており、実効アドレスの計算を行なうことができるようになっていることもある。 アドレスレジスタの一種で、配列のベースアドレスを示すために利用できるレジスタである。配列データにアクセスするコードが簡単に記述できる。 配列のインデックスを指すために利用できるレジスタである。前述のベースレジスタが示すアドレスをベースとしたオフセットを指すようにして使う。あるいは配列の要素1個のサイズ分(たとえば4バイト整数の配列でインデックスが3ならオフセットは12)スケーリングすることができる。配列データにアクセスするコードが簡単に記述できる。アーキテクチャによっては、ベースレジスタの代わりにインデックスレジスタが配列の基点を指し、これにデータレジスタの値をスケーリングしてアクセスするものもある。 IXなどと略すことが多い。 アドレスレジスタの一種で、コールスタックの先頭を指すポインタレジスタである。これが示すアドレスの内容を読み出すと同時にアドレスを増やす、逆に、示すアドレスに書き込むと同時にアドレスを減らす、といった動作を行えるものが多い(特にCISCでは)。 また、このような、アドレスを参照してロードあるいはストアと同時にアドレスレジスタのインクリメント、デクリメントを行えるモードを「ポストインクリメント」・「プリデクリメント」、または「プリインクリメント」・「ポストデクリメント」と言う(プリとポストの組み合わせは、通常このどちらかになる)。 SPと略すことが多い。 アドレスレジスタの一種で、現在のサブルーチンを開始した時点のスタックポインタ(すなわち、コールスタック中の、現在のスタックフレームの位置)を指すようにして使うためのポインタレジスタである。スタックポインタ相対アドレッシングがあれば必ずしも必要ではないが、便利ではある。x86の場合、BPを利用したアドレッシングではセグメントレジスタにSSが選択される。 BPと略すことが多い。 アドレスレジスタの一種で、実行する命令のアドレスを指し示すレジスタ。命令の読み込みを行なう際にはその内容がアドレスバス上に出力され、また命令を読み込む度に読み取った命令の分だけ値が増加するようになっている。分岐命令は、このプログラムカウンタに値を代入することで実現される。また、スタックポインタと組み合わせ、プログラムカウンタの内容をスタックに一時保存した後に新たな値を代入すると、サブルーチンの呼出しを実現する事になる。反対に、スタックから値を取り出してプログラムカウンタに代入すると、サブルーチンから呼出し元に制御を復帰させる事になる。 PCと略すことが多い。また、インストラクションポインタ (IP)、逐次制御カウンタ (Sequential Control Counter; SCC)、あるいはロケーション・カウンタ[2]と称される場合もある。 何を書き込んでもその結果は保存されず、読み出すと常に全ビットがゼロである、というレジスタを持つプロセッサがある。一見意味がないようであるが、RISCアーキテクチャの様に命令セットを単純化した際に、演算命令とゼロレジスタを組み合わせて実質的に別の命令を実現できる。 例えば、加算命令において、A=B+Z (ここでA,Bは汎用レジスタとしZはゼロレジスタとする)に相当する命令をプログラムすると、Bの値がAに入り、BレジスタからAレジスタへの転送(MOVやLD)命令と等価になる。 また、比較命令は、演算そのものは減算命令と同じだが、その演算結果(大小関係や結果がゼロか否か)をフラグに反映させれば目的は達するが減算結果の数値は不要である。この場合に、Z=A-B に相当する命令をプログラムすると、減算に伴いフラグレジスタの値が更新される一方で、減算結果はどこにも保存されず、AレジスタとBレジスタの比較(CMP)命令と等価になる。 その他、アドレッシングにおいて必ずオフセットを指定する必要がある場合にゼロレジスタをオフセットに指定することで、オフセット無しでメモリにアクセスできる。 この様に、ゼロレジスタと演算命令を組み合わせることで、実質的に別の命令と同等の処理を行わせることができる。 読み出すと常に全ビットがゼロになっている R0 レジスタを持つMIPS がある一方で、読み出すと常に全ビットがゼロということではなく命令とオペランド位置との組み合わせによって、ゼロレジスタの内容が読めたり、ゼロとみなされたりするレジスタ r0 を持つPowerPCのようなプロセッサもある[3]。 特定の目的を持たず、命令により各種機能を果たすレジスタ。特にデータレジスタとアドレスレジスタを兼ね備えたレジスタ。MC68000のように、データレジスタとアドレスレジスタを分けている例もあるが、ほとんどのプロセッサは汎用レジスタを持っている。また、汎用レジスタを多く用意しておけば、プログラミングの自由度が格段に増し、特にコンパイラが実行効率の良いオブジェクトコードを生成しやすくなる(多くの局所変数を汎用レジスタに割り当てることができる)。RISC系プロセッサでは全ての汎用レジスタが同等の機能を有している事が多い。そのような設計を「レジスタの直交性が高い」と表現する事がある。
概説
レジスタの種類
専用レジスタ
アキュムレータ詳細は「アキュムレータ (コンピュータ)」を参照
データレジスタ
アドレスレジスタ
ベースレジスタ
インデックスレジスタ
スタックポインタ
ベースポインタ
プログラムカウンタ
ゼロレジスタ
汎用レジスタ(ジェネラルレジスタ)
Size:29 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)』
担当:undef