x86-レジスタ
x86系レジスタについて
x86アーキテクチャは8個の汎用レジスタ (GPR) と6個のセグメントレジスタ、1個のフラグレジスタ、1個の命令ポインタを持っています。
x86系の汎用レジスタ(GPR)
汎用レジスタは基本的には自由に使えます。
以下の記号は使用できるbit数に対応しています。
- 8bitのhはHigh(上位)を、lはLow(下位)を表す。
- 16bitのxはeXtend(拡張)を表す。
- 32bitのeはExtendを、xはeXtendを表す。(eaxは、拡張の拡張。)
Accumulator Register
アキュムレータ(累積機)は特に定まった用途はない汎用レジスタです。
基本的には算術演算操作の結果が格納します。
8 7 6 5 4 3 2 1 0
|-----------------------EAX(32bit)----------------------|
| |---------AX(16bit)---------|
| |---AH(8bit)--|---AL(8bit)--|
Base Register
ベース(基点)は、シフトローテート命令とループ命令におけるメモリアドレスを指定する場合に使用します。
8 7 6 5 4 3 2 1 0
|-----------------------EBX(32bit)----------------------|
| |---------BX(16bit)---------|
| |---BH(8bit)--|---BL(8bit)--|
Count Resister
カウンタ(数を数える機械)は、転送や繰り返しの回数を数えるカウンタとして使用します。また、算術演算操作とI/O操作に使用されます。
8 7 6 5 4 3 2 1 0
|-----------------------ECX(32bit)----------------------|
| |---------CX(16bit)---------|
| |---CH(8bit)--|---CL(8bit)--|
Data Resister
データは汎用的に利用され、主にデータの一時退避や演算などで使用されます。
8 7 6 5 4 3 2 1 0
|-----------------------EDX(32bit)----------------------|
| |---------DX(16bit)---------|
| |---DH(8bit)--|---DL(8bit)--|
Destination Index
書き込み用インデックスは、ストリング命令(movsなど)などで移動先(ディスティネーション)のアドレスとして使用します。
ESI/SIとセットで使用します。
8 7 6 5 4 3 2 1 0
|-----------------------EDI(32bit)----------------------|
| |---------DI(16bit)---------|
Source Index
読み込み用インデックスは、移動元(ソース)のアドレスとして使用します。
例えば、ストリーム操作でのソースへのポインタとして使用されます。
EDI/DIとセットで使用します。
8 7 6 5 4 3 2 1 0
|-----------------------ESI(32bit)----------------------|
| |---------SI(16bit)---------|
Stack Pointer
スタック用のポインタは、スタックのトップを指し示すポインタとして使用します。
8 7 6 5 4 3 2 1 0
|-----------------------ESP(32bit)----------------------|
| |---------SP(16bit)---------|
Base Pointer
ベース用ポインタは、スタックのベースを指し示すことに使用される。
8 7 6 5 4 3 2 1 0
|-----------------------EBP(32bit)----------------------|
| |---------BP(16bit)---------|
セグメントレジスタ
セグメントレジスタは、セグメント(領域)を指定するためのレジスタです。
リアルモードとプロテクトモードでは全く動作が異なります。
- リアルモード
- セグメントレジスタを4bit左シフトして足すだけという単純な方法で物理アドレスを指定する。
- プロテクトモード
- メモリ内のセグメント(分割した領域)を指し示す。
- セグメントの情報はGDTに登録されている。
SS(Stack Segment) | スタックセグメント用のセグメントセレクタを格納するレジスタ。 |
CS(Code Segment) | 実行中の命令を格納するコードセグメント用のセグメント・セレクタを格納するレジスタ。 |
DS(Data Segment) | データセグメント用のセグメント・セレクタを格納するレジスタ。 |
ES(Extra Segment) | 追加(Extra)データセグメント |
FS(FはEの次という意味) | i386以降に導入された追加データセグメント |
GS(GはFの次という意味) | i386以降に導入された追加データセグメント |
命令ポインタ(EIP)
命令ポインタ(Instruction Pointer)は、分岐が置きない前提で、次に実行する命令のアドレスを保持します。
8 7 6 5 4 3 2 1 0
|-----------------------EIP(32bit)----------------------|
| |---------IP(16bit)---------|
EFLAGSレジスタ
EFLAGSは1個の32ビットレジスタで、操作の結果やプロセッサの状態の格納と制御のための判断材料として使用されます。
下記以外のビットは予約(定数)されており、参照以外に利用できません。
ビット | フラグ | 説明 |
0 | CF | Carry Flag。 1:演算などで最上位ビットが繰り上げた場合。 0:繰り上げが発生しなかった場合。 |
2 | PF | Parity Flag。 1:演算した結果の最下位バイトに値1のビットが偶数個ある場合。 0:奇数個の場合。 |
4 | AF | Adjust Flag(調整フラグ)。 1:演算した結果のビット3(最下位バイトの最上位ビット)に繰り上げが発生した場合。 0:繰り上げが発生しなかった場合。 |
6 | ZF | Zero Flag。 1:演算した結果が0の場合。 0:0以外の場合。 |
7 | SF | Sign Flag(符号フラグ)。 1:演算した結果が負の場合。 0:正の場合。 |
8 | TF | Trap Flag。 1:デバッグのシングルステップモードが有効。 0:シングルステップモードが無効。 |
9 | IF | Interrupt Enable Flag(割り込み可能フラグ)。 割り込みを有効にするか無効にするかするフラグです。 1:割り込みが有効。STI命令を実行するとこのフラグが1になります。0:割り込みが無効。CLI命令を実行するとこのフラグが0になります。 |
10 | DF | Direction Flag。1:文字列関係の命令などを実行した後にSIレジスタの値がインクリメントされる。 0:デクリメントされる。 |
11 | OF | Overflow Flag。 1:演算結果が格納するレジスタより大きい数字になった場合。 0:格納するレジスタより小さい場合。 |
12-13 | IOPL | I/O privilege level field(I/O特権レベルフィールド)。特権レベルの値を入れます。 0以外:ユーザモードとして動作します。0:特権モードとして動作します。 |
14 | NT | Nested Task Flag。1:現在のタスクが直前に実行されたタスクにリンクされている場合。 0:リンクされていない場合。 |
16 | RF | Resume Flag(再開フラグ)。デバッグ例外に対するプロセッサの応答を制御する。 |
17 | VM | Virtual-8086 mode Flag。1:仮想8086モードが有効 0:仮想8086モードが無効(プロテクティッドモード)。 |
18 | AC | Alignment check Flag。1:アライメントチェック有効。0:アライメントチェックが無効。 |
19 | VIF | Virtual interrupt Flag(仮想割り込みフラグ)。 1:仮想割り込みが有効。 0:仮想割り込みが無効。 |
20 | VIP | Virtual interrupt pending Flag。 1:仮想割り込みが保留状態。 0:仮想割り込みに有効。 |
21 | ID | Identification Flag(識別フラグ)。ここに値を書き込むことができればCPUID命令が使える状態にある。 |
関連ページ
- GAS_基本文法
- GAS_基本書式
- GAS_演算子
- GAS_制御構造
- GAS_関数
- GAS_システムコール
- GAS_標準ライブラリ関数
- GAS_Intel記法の利用
- GAS_インラインアセンブラ
- アセンブリ言語