レジスタ
目次
レジスタとは
CPU(MPU)の内部にあるメモリのこと。(キャッシュメモリとは違う。)
非常に高速だが容量が小さい。でも、そうぞうよりは結構いろいろなレジスタがある。
メインメモリと違い、自由に使えるところが少ない。
特別な領域。
基本プログラム実行レジスタ
汎用データレジスタ
8つの汎用レジスタがあり、このレジスタは基本的には自由に使える。
しかし、汎用といいながらも制約が多い。
汎用順:eax > edx > ecx > ebx > esi > edi > ebp > esp
なにを使えばいいか迷ったら、a,b,c,dのどれかを使うといい。
C言語などによって特定の処理に使われているものもある。
スタックポインタは、スタックのためのレジスタで、汎用的に使用することはあまりない。
が、intelのアーキテクチャマニュアルには汎用レジスタとして定義されている。
8bitのhはHigh(上位)を、lはLow(下位)を表す。
16bitのxはeXtend(拡張)を表す。
32bitのeはExtendを、xはeXtendを表す。つまりeaxは、拡張の拡張。
| 8bit | 16bit | 32bit | 名前 | 特徴・用途 |
|---|
| - | - | EAX | Accumulator | 汎用レジスタ。特に用途なし。 |
| - |
| AH | AX |
| AL |
| - | - | EBX | Base | メモリのアドレスを指定する場合に使用する。 |
| - |
| BH | BX |
| BL |
| - | - | ECX | Counter | 転送や繰り返しの回数を数えるカウンタとして使用する。 |
| - |
| CH | CX |
| CL |
| - | - | EDX | Data | 汎用レジスタ。特に用途なし。 |
| - |
| DH | DX |
| DL |
| - | - | ESI | Source Index | ストリング命令(movsなど)で移動元(ソース)のアドレスとして使用する。 DSと併せて使用する。 |
| - |
| - | SI |
| - |
| - | - | EDI | Destination Index | ストリング命令(movsなど)で移動先(ディスティネーション)のアドレスとして使用する。 ESと併せて使用する。 |
| - |
| - | DI |
| - |
| - | - | ESP | Stack Pointer | スタックのトップのアドレスを示すポインタ。 |
| - |
| - | SP |
| - |
| - | - | EBP | Base Pointer | (c言語において、)スタックのベースのアドレスを示すポインタ。 |
| - |
| - | BP |
| - |
セグメントレジスタ
セグメント(領域)を指定するためのレジスタ。
リアルモードとプロテクトモードでは全く動作が異なるので注意が必要。
- リアルモード
- セグメントレジスタを4bit左シフトして足すだけという単純な方法で物理アドレスを指定する。
- プロテクトモード
- メモリ内のセグメント(分割した領域)を指し示す。
セグメントの情報はGDTに登録されている。
| 16bit | 名前 | 説明 |
|---|
| CS | Code Segment | 実行中の命令を格納するコードセグメント用のセグメント・セレクタを格納するレジスタ。 |
| DS | Data Segment | データセグメント用のセグメント・セレクタを格納するレジスタ。 |
| ES | Extra Segment | 追加の(Extra)データセグメント1 |
| FS | 正式名称無し(D,Eの続きと思われる。) | 追加のデータセグメント2(i386以降に導入) |
| GS | 正式名称無し(アメリカ人のユーモア。) | 追加のデータセグメント3(i386以降に導入) |
| SS | Stack Segment | スタックセグメント用のセグメントセレクタを格納するレジスタ。 |
命令ポインタ
次に実行する命令を指し示すポインタ。(現在のコードセグメント内)
基本的には順番に進められるが、jmp,call,retなどの命令でいろいろな場所に移動する。
EIPレジスタに直接アクセスすることはできないが、jmp,call,retなどで、暗黙的に制御することが可能。
やりようによっては読み取りもできる。
| 16bit | 32bit | 名前 | 説明 |
|---|
| - | EIP | Instruction Pointer | 次に実行する命令を指し示すポインタ。(現在のコードセグメント内のオフセット) |
| IP |
EFlagsレジスタ
全32bitで構成されれるレジスタで、各種演算結果、制御フラグ、システムフラグなどが格納される。
- S
- ステータスフラグを表す。
addやsubなどの演算結果の状態を表す。
- C
- 制御フラグを表す。
制御フラグは、bit10のDFのみに該当する。
- X
- システムフラグを表す。
OSやアプリケーションの動作を制御する。
このフラグはアプリケーションが変更してはいけない。
- 予約
- 干渉してはいけない領域。セットするときは、必ず読み込んだ値をセットすること。
| bit | 種別 | Flag | 名前 | 説明 | 関連命令 |
|---|
| 0 | S | CF | Carry Flag | キャリーフラグ | 最上位ビットでキャリーかボローが生じたときに1がセットされる。 | stc, clc, cmc |
| 1 | | 1 | | | 予約 | |
| 2 | S | PF | Parity Flag | パリティフラグ | 演算結果の最下位バイトで、値が1のビットが偶数個なら1がセットされる。 | |
| 3 | | 0 | | | 予約 | |
| 4 | S | AF | Auxiliary Carry Flag | 補助キャリーフラグ | ビット3でキャリーかボローが生じたときに1がセットされる。BCD演算で使用する。 | |
| 5 | | 0 | | | 予約 | |
| 6 | S | ZF | Zero Flag | ゼロフラグ | 演算結果が0のとき1がセットされる。 | |
| 7 | S | SF | Sign Flag | 符号フラグ | 演算結果の最上位ビットがそのままセットされる。 | |
| 8 | X | TF | Trap Flag | | | |
| 9 | X | IF | Interrupt Enable Flag | 割り込み許可フラグ | 1のときは割り込みを許可し、0なら割り込みを禁止する。 | sti, cli |
| 10 | C | DF | Direction Flag | 方向フラグ | ストリング命令を上位に向かって処理(0)するか、下位に向かって処理(1)するかを制御する。 | std, cld |
| 11 | S | OF | Overflow Flag | オーバーフローフラグ | 最上位ビットが変化した場合に1がセットされる。 | |
| 12 | X | IOPL | I/O Privilege Level | I/O特権レベル | | |
| 13 |
| 14 | X | NT | Nested Task Flag | | | |
| 15 | | 0 | | | 予約 | |
| 16 | X | RF | Resume Flag | | | |
| 17 | X | VM | Virtual-8086 Mode | 仮想8086モード | | |
| 18 | X | AC | Alignment Check | アライメント・チェック | このフラグとCR0のAMフラグを1にセットすると、アライメント・チェックが有効になる。有効にすると、CPLが3のときのみアライメント・チェック例外を発生させることができる。 | |
| 19 | X | VIF | Virtual Interrupt Flag | | | |
| 20 | X | VIP | Virtual Interrupt Pending | | | |
| 21 | X | ID | Identification Flag | 識別フラグ | このビットを変更することができれば、CPUID命令を実行することができる。 | |
| 22 | | 0 | | | 予約 | |
| 23 | | 0 | | | 予約 | |
| 24 | | 0 | | | 予約 | |
| 25 | | 0 | | | 予約 | |
| 26 | | 0 | | | 予約 | |
| 27 | | 0 | | | 予約 | |
| 28 | | 0 | | | 予約 | |
| 29 | | 0 | | | 予約 | |
| 30 | | 0 | | | 予約 | |
| 31 | | 0 | | | 予約 | |
CFとOFの違い
8bitのレジスタで処理する場合、
1111 1111から0000 0000になるときとその逆のときにキャリーフラグに1がセットされる。
それに対し、0111 1111から1000 0000になるときとその逆のときにオーバーフローフラグに1がセットされる。
つまり、
キャリーフラグは、符号なし整数を表すときに意味があり、
オーバーフローフラグは、符号あり整数を表すときに意味がある。
制御レジスタ
CPUを制御するためのレジスタ。
CR0~CR4まである。CR = コントロールレジスタ
CR0
| bit | Flag | 名前 | 説明 |
|---|
| 0 | PE | Protect Enable | プロテクトモードを有効にする。 |
| 1 | MP | Monitor Coprocesser | |
| 2 | EM | Emulation | |
| 3 | TS | Task Switch | |
| 4 | ET | Extension Type | 拡張タイプ。最近のCPUでは、1で予約されている。 |
| 5 | NE | Numerical Error | |
| 6 | | | 予約 |
| 7 | | | 予約 |
| 8 | | | 予約 |
| 9 | | | 予約 |
| 10 | | | 予約 |
| 11 | | | 予約 |
| 12 | | | 予約 |
| 13 | | | 予約 |
| 14 | | | 予約 |
| 15 | | | 予約 |
| 16 | WP | Write Protect | |
| 17 | | | 予約 |
| 18 | AM | Alignment Mask | このフラグとEFLAGSのACフラグを1にセットすると、アライメント・チェックが有効になる。有効にすると、CPLが3のときのみアライメント・チェック例外を発生させることができる。 |
| 19 | | | 予約 |
| 20 | | | 予約 |
| 21 | | | 予約 |
| 22 | | | 予約 |
| 23 | | | 予約 |
| 24 | | | 予約 |
| 25 | | | 予約 |
| 26 | | | 予約 |
| 27 | | | 予約 |
| 28 | | | 予約 |
| 29 | NW | Not Write through | |
| 30 | CD | Cash Disable | |
| 31 | PG | Paging | 1にセットすると、ページングを有効にする。PEフラグ(CR0-0)がセットされていないと、このフラグも有効にならない。 |
CR1
すべて予約。
CR2
ページ・フォールト・リニア・アドレス。
ページフォールトを発生させたリニアアドレスが入っている。
CR3( PDBR : ページ・ディレクトリ・ベース・レジスタ )
→Paging
| bit | Flag | 名前 | 説明 |
|---|
| 0 | | | 予約 |
| 1 | | | 予約 |
| 2 | | | 予約 |
| 3 | PWT | | |
| 4 | PCD | | |
| 5 | | | 予約 |
| 6 | | | 予約 |
| 7 | | | 予約 |
| 8 | | | 予約 |
| 9 | | | 予約 |
| 10 | | | 予約 |
| 11 | | | 予約 |
| 12 | | | ページ・ディレクトリ・ベース |
| 13 |
| 14 |
| 15 |
| 16 |
| 17 |
| 18 |
| 19 |
| 20 |
| 21 |
| 22 |
| 23 |
| 24 |
| 25 |
| 26 |
| 27 |
| 28 |
| 29 |
| 30 |
| 31 |
CR4
アーキテクチャ上の各種拡張機能を使えるようにするフラグがある。
拡張機能のため、CPUID命令でそのフラグが使用可能か確認してから使用する必要がある。
| bit | Flag | 名前 | 説明 |
|---|
| 0 | VME | | |
| 1 | PVI | | |
| 2 | TSD | | |
| 3 | DE | | |
| 4 | PSE | Paging Size Extensions | |
| 5 | PAE | Physical Address Extention | |
| 6 | MCE | | |
| 7 | PGE | | |
| 8 | PCE | | |
| 9 | OSFXSR | | |
| 10 | OSXMMEXCPT | | |
| 11 | | | 予約 |
| 12 | | | 予約 |
| 13 | | | 予約 |
| 14 | | | 予約 |
| 15 | | | 予約 |
| 16 | | | 予約 |
| 17 | | | 予約 |
| 18 | | | 予約 |
| 19 | | | 予約 |
| 20 | | | 予約 |
| 21 | | | 予約 |
| 22 | | | 予約 |
| 23 | | | 予約 |
| 24 | | | 予約 |
| 25 | | | 予約 |
| 26 | | | 予約 |
| 27 | | | 予約 |
| 28 | | | 予約 |
| 29 | | | 予約 |
| 30 | | | 予約 |
| 31 | | | 予約 |
システム・テーブル・ポインタ・レジスタ
GDTR
| Byte | bit | 内容 |
|---|
| 0 | 0 | GDTのリミット |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 1 | 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 2 | 0 | GDTのリニア・ベース・アドレス |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 3 | 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 4 | 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 5 | 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
IDTR
| Byte | bit | 内容 |
|---|
| 0 | 0 | IDTのリミット |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 1 | 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 2 | 0 | IDTのリニア・ベース・アドレス |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 3 | 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 4 | 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 5 | 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
TR
タスクレジスタは、TSSディスクリプタを指すセグメント・セレクタ?部分と、自動で読み込まれるキャッシュ部分がある。
| Byte | bit | 内容 |
|---|
| 0 | 0 | TSSディスクリプタを指すセグメント・セレクタ? |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 1 | 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
LDTR
FPUレジスタ
浮動小数点データ・レジスタ
コントロールレジスタ
ステータスレジスタ
タグレジスタ
オペコードレジスタ
FPU命令ポインタレジスタ
FPUオペランド(データ)ポインタレジスタ
MMXテクノロジ・レジスタ
MMXテクノロジ・レジスタ
XMMレジスタ
XMMレジスタ
MXCSRレジスタ
参考関連