「レジスタ (コンピュータ)」の版間の差分

削除された内容 追加された内容
Dr jimmy (会話 | 投稿記録)
Okipow (会話 | 投稿記録)
m編集の要約なし
2行目:
 
== 概説 ==
一般に、[[論理回路]]において、[[フリップフロップ]]などにより状態を保持する装置をレジスタと呼ぶ。コンピュータにおいては、プロセッサが内蔵しているそれを指す。プロセッサには、プログラムが読み書きできるレジスタ以外に、プロセッサ自身がするためのレジスタがあり、内部レジスタなどと呼ばれる。
 
論理回路において使われるレジスタという用語としては、たとえば[[レジスタ転送レベル]]などがある。
 
プロセッサ内部のレジスタは、計算結果を一時的に保持したり、[[Random Access Memory|RAM]]や[[Read Only Memory|ROM]]などの[[記憶装置|メインメモリ]]を読み書きする際の[[メモリアドレス|アドレス]]を保持したり、プロセッサや周辺機器の状態を保持・変更したりする。プロセッサのとは、極端にいえば、プログラムコードに従ってメインメモリとレジスタの間でデータを移送することだと表現できる。
 
プロセッサ内部にはたいてい数個から数十個のレジスタがあり、内部[[バス (コンピュータ)|バス]]や演算回路などと密接に結びついているため、高速にする。
 
プロセッサについて「○○ビットプロセッサ(あるいは○○ビットCPU、○○ビットDSPなど)」と表現する場合、その目安の一つがレジスタの幅、特にそのプロセッサの汎用レジスタの幅である。また、[[MC68000]]のようにプロセッサ自体の設計は32ビットだが外部データバスは16ビット、といった設計の場合、「内部32ビット・外部16ビットCPU」のように言うこともある。こだわる人もいるが、そもそも厳密に定義できるわけでもないのでこだわる意味はない。
44行目:
 
===== スタックポインタ =====
アドレスレジスタの一種で、[[コールスタック]]の先頭を指すポインタレジスタである。これが示すアドレスの内容を読み出すと同時にアドレスを増やす、逆に、示すアドレスに書き込むと同時にアドレスを減らす、といったを行えるものが多い(特にCISCでは)。
 
また、このような、アドレスを参照してロードあるいはストアと同時にアドレスレジスタのインクリメント、デクリメントを行えるモードを「ポストインクリメント」・「プリデクリメント」、または「プリインクリメント」・「ポストデクリメント」と言う(プリとポストの組み合わせは、通常このどちらかになる)。
82行目:
== 特殊なアーキテクチャ ==
=== レジスタセット ===
レジスタの値は、プロセッサの内部状態そのものである。つまり、レジスタの値をそっくりそのままどこかに退避させ、後にそれをそっくり元に戻せば、プロセッサのを一時中断し、他の作業をさせ、中断前の状態に戻すことができる。
 
割り込み処理による高速応答性を要求されるアプリケーションを作る場合や、時分割などによる擬似的なマルチタスクを実現する時には、このはきわめて頻繁に行なわれる。この、プロセッサの状態をそっくり保存して他の状態に入れ替えるというは、[[コンテキストスイッチ]]と呼ばれる。
 
一般には、コンテキストスイッチはスタックを用いてレジスタの内容を外部のメインメモリの一定領域上に一時保存することで実現されている。しかし、コンテキストスイッチを高速化するために、主要なレジスタのコピーを保持する別のレジスタ群をプロセッサ内部に用意しておき、それを用いてコンテキストスイッチを行なう設計になっているプロセッサもある。つまり、プロセッサ内部のハードウェアにより、一瞬にしてアクセスするレジスタを切り替えられる。このようなレジスタ群を「レジスタセット」と呼ぶ。また、切り替えるレジスタ群が1セットしかない場合、それらのレジスタは「シャドーレジスタ」または「裏レジスタ」と呼ばれる。
93行目:
 
=== ビットの拡張 ===
ソフトウェア資産の有効活用を目的として、16ビットプロセッサの命令セットをそのままできる32ビットプロセッサなどがしばしば開発される。
 
この場合、プロセッサ内部のレジスタのビット長は大きく(たいていの場合2倍に)なっているのだが、互換性を保つために古いCPUの命令コードでする場合には下位のビットしか用いない。
 
インテル社の8086系列のCPUは、このように拡張してきた経緯を持つ代表的なプロセッサである。8086CPUが誕生する前のインテルの8ビットCPU、8080では汎用レジスタを“a”, “b”, “c”…と名付けていた。これを拡張した8086の汎用レジスタは“ax”, “bx”, “cx”…となった。(xはextendの略)ところが、80386で32ビット化したため、レジスタの名前は“eax”, “ebx”", “ecx”…となった。(eもextendの略)さらに、[[アドバンスト・マイクロ・デバイセズ|AMD]]社が[[x64|AMD64]]で64ビットに拡張した時には、レジスタ名は“rax”, “rbx”, “rcx”…とになった。
115行目:
 
== ペリフェラルデバイスのレジスタ ==
ペリフェラルデバイスのレジスタは、ペリフェラル([[プログラマブル・カウンタ]]や[[割り込み (コンピュータ)|割り込み]]制御、[[UART|シリアル通信ポート]]などのハードウェア)のを設定したり、状況を読み出したりするためのレジスタである。これらのレジスタは上記のプロセッサ内のレジスタとは異なり、プロセッサからアクセスできる[[アドレス空間]]の一部に配置される。プロセッサの種類によってはメモリ空間とは別に[[入出力ポート#I/O空間|I/O空間]]というアドレス空間が存在し、レジスタはここに配置される。I/O空間を持たないプロセッサの場合はメモリ空間にレジスタを配置して利用し、このことを[[メモリマップドI/O]]と言う。レジスタの各ビットのや配置はペリフェラルデバイス毎に異なり、ハードウェアのをよく理解して操作する必要がある。
 
[[組み込みシステム|組み込み機器]]用の[[マイクロコントローラ]]の場合、プロセッサだけでなく多数のペリフェラルデバイスも同一のチップ内に納められており、多くのレジスタがマイクロコントローラ内に存在する。