レジスタ (コンピュータ)
一般に、論理回路において、フリップフロップなどにより状態を保持する装置をレジスタと呼ぶ。コンピュータにおいては、プロセッサが内蔵しているそれを指す。プロセッサには、命令セットで明示的に操作するレジスタ以外に、プロセッサ自身が動作するためのレジスタがあり、内部レジスタなどと呼ばれる。
論理回路において使われるレジスタという用語としては、たとえばレジスタ転送レベルなどがある。
プロセッサ内部のレジスタは、計算結果を一時的に保持したり、RAMやROMなどのメインメモリにアクセスする際のアドレスを保持したり、プロセッサや周辺機器の動作状態を保持・変更したりする。プロセッサの動作とは、極端にいえば、プログラムコードに従ってメインメモリとレジスタの間でデータを移送することだと表現できる。
プロセッサ内部にはたいてい数個から数十個のレジスタがあり、内部バスや演算回路などと密接に結びついているため、高速に動作する。
プロセッサについて「○○ビットプロセッサ(あるいは○○ビットCPU、○○ビットDSPなど)」と表現する場合、その目安の一つがレジスタの幅、特にそのプロセッサの汎用レジスタの幅である。また、MC68000のようにプロセッサ自体の設計は32ビットだが外部データバスは16ビット、といった設計の場合、「内部32ビット・外部16ビットCPU」のように言うこともある。こだわる人もいるが、そもそも厳密に定義できるわけでもないのでこだわる意味はない。
プロセッサの内部にどのようなレジスタがあるかということは、そのプロセッサの構造(アーキテクチャ)と命令セットに密接に関わる。
何を書き込んでもその結果は保存されず、読み出すと常に全ビットがゼロである、というレジスタを持つプロセッサがある。一見意味がないようであるが、RISCアーキテクチャの様に命令セットを単純化した際に、演算命令とゼロレジスタを組み合わせて実質的に別の命令を実現できる。
例えば、加算命令において、A=B+Z (ここでA,Bは汎用レジスタとしZはゼロレジスタとする)に相当する命令をプログラムすると、Bの値がAに入り、BレジスタからAレジスタへの転送(MOVやLD)命令と等価になる。
また、比較命令は、演算そのものは減算命令と同じだが、その演算結果(大小関係や結果がゼロか否か)をフラグに反映させれば目的は達するが減算結果の数値は不要である。この場合に、Z=A-B に相当する命令をプログラムすると、減算に伴いフラグレジスタの値が更新される一方で、減算結果はどこにも保存されず、AレジスタとBレジスタの比較(CMP)命令と等価になる。
その他、アドレッシングにおいて必ずオフセットを指定する必要がある場合にゼロレジスタをオフセットに指定することで、オフセット無しでメモリにアクセスできる。
この様に、ゼロレジスタと演算命令を組み合わせることで、実質的に別の命令と同等の処理を行わせることができる。
読み出すと常に全ビットがゼロになっている R0 レジスタを持つMIPS がある一方で、読み出すと常に全ビットがゼロということではなく命令とオペランド位置との組み合わせによって、ゼロレジスタの内容が読めたり、ゼロとみなされたりするレジスタ r0 を持つPowerPCのようなプロセッサもある。