ゾンビ狩りクラブ

Linux, Server, Network, Security 関連などをゆるーくテキトーに載せてます

主なx64レジスタまとめ

Index

1. はじめに

レジスタは、プロセッサ内部にある記憶回路である。
最初はレジスタと言われてもピンとこないかもしれないが、実際にアセンブリを書くときには、レジスタは変数と同じように扱えるので、難しく考えず単なる変数だと思えば良い。
また、レジスタには、ある程度役割が決まっているものもあるので、注意が必要である。
レジスタの名称は、x86かx64かで異なる。
レジスタには主に以下の種類が存在する。

  • 汎用レジスタ
  • 演算用レジスタ
  • フラグレジスタ
  • 命令ポインタレジスタ

上記のうち汎用レジスタは、ある程度は好きに使用できるが、その他は特別な用途があり、使用するときは注意が必要である。

2. 汎用レジスタ

汎用的に使用できるレジスタ。
以下の種類が存在する。

RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP, R8 ~ R15

この中でも、アセンブリを書くときに特に覚えておきたいのは、システムコール番号は RAX に指定し、以下の順番でシステムコールの引数をとるということである。

UNIX: RDI, RSI, RDX, RCX, R10, R8, R9
Windows: RCX, RDX, R8, R9

RAX (アキュムレーター)

計算時に変数として使用される
計算結果や関数の戻り値などが格納される
また、システムコールの番号指定に使用する

RBX (ベースレジスタ)

DSセグメントにあるデータのアドレスが格納されるらしいが、 基本好きに使って良い。
また、計算時に変数として使用される

RCX (カウンタレジスタ)

ループ処理などのカウントが格納される
また、計算時に変数として使用される

RDX (データレジスタ)

I/Oポインタ 計算時に変数として使用される

RSI (ソースインデックス)

文字列操作時にソースポインタとして使用される

RDI (デスティネーションインデックス)

文字列操作時にディスティネーションポインタとして使用される

RSP (スタックポインタレジスタ)

スタックの先頭アドレスを保持する

RBP (ベースポインタレジスタ)

フレームポインタを保持する

R8~R15

その他引数や値の保持などに使用

大きさによるレジスタ名

また、各レジスタはその大きさによって名称が変わる。

大きさ レジスタ名
64bit RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP, R8~R15
32bit EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP, R8D~R15D
16bit AX, BX, CX, DX, SI, DI, SP, BP, R8W~R15W
上位8bit AH, BH, CH, DH,
下位8bit AL, BL, CL, DL, SIL, DIL, SPL, BPL, R8L~R15L

f:id:Garfields:20171015220450p:plain

3. 演算用レジスタ

演算用レジスタは主に以下がある - FPUデータレジスタ
- MMXレジスタ
- XMMレジスタ
- YMMレジスタ

3.1 FPUデータレジスタ

80ビットのレジスタが8つ
R0 ~ R7

3.2 MMXレジスタ

64ビットのレジスタが8つ
MM0 ~ MM7

3.3 XMMレジスタ

128ビットのレジスタが16つ XMM0 ~ XMM15

3.4 YMMレジスタ

256ビットのレジスタが16つ YMM0 ~ YMM15

4. フラグレジスタ

フラグレジスタには、ステータスフラグと、コントロールフラグ、システムフラグがある。
32ビットまでをEFLAGSを呼び、64ビット拡張されたものをRFLAGSと呼ぶ。

f:id:Garfields:20171016231504p:plain

4.1 ステータスフラグ

ビット 名称 説明
0 CF (キャリーフラグ) 演算でレジスタの大きさを超えてキャリー(桁上がり)やボロー(桁借り)が起きたときにセットされる
2 PF (パリティフラグ) 操作結果の下位8ビットで1のビットが偶数個の場合にセットされる
4 AF (補助フラグ) BCD演算でのCF
6 ZF (ゼロフラグ) 操作結果が0になった場合にセットされる
7 SF (サインフラグ) 操作の結果が負になった場合にセットされる
11 OF (オーバーフローフラグ) 符号付演算結果がオーバーフローした場合にセットされる

4.2 システムフラグ

ビット 名称 説明
8 TF
(トラップフラグ)
セットすると、シングルステップモードでプログラムが実行できる
9 IF
(割り込みフラグ)
セットすると、割り込みをと捉えられる
12-13 IOPL
(I/O特権レベル)
現在のプログラムやタスクの特権レベルを示す
14 NT
(ネストタスクフラグ)
このタスクが以前に実行されたタスクにリンクされた時にセットされる
16 RF
(再開フラグ)
デバック例外を取り除いた場合にセットされる
17 VM
(仮想8086モードフラグ)
仮想8086モードのときにセットされる
18 AC
(アラインメントチェックフラグ
または
アクセスコントロールフラグ)
このフラグがセットされている場合、CR0レジスタにAMビットがセットされていれば、アライメントをチェックが有効。
CR4レジスタにSMAPビットがセットされている場合、スーパーバイザーモードデータアクセスが有効。
19 VIF
(仮想割り込みフラグ)
IFの仮想イメージ
20 VIP
(仮想割り込み保留フラグ)
割り込みが中断されている時にセットされる
21 ID
(識別フラグ)
CPUID命令が可能な場合にセットできる

4.3 コントロールフラグ

ビット 名称 説明
10 DF (方向フラグ) セットすると、文字列がメモリ上で高位から低位に処理される

4.4 予約されたフラグ

1, 3, 5, 15, 22-63ビット目は予約の為であり、使用されていない。

5. 命令ポインタレジスタ

RIP (インストラクションポインタまたは、プログラムカウンタ)と呼ばれる。
64ビットのレジスタ。
次の命令のアドレスを指している。

参考

https://www.intel.co.jp/content/www/jp/ja/architecture-and-technology/64-ia-32-architectures-software-developer-manual-325462.html