x86のレジスタ
x86のレジスタは用途により大きく次の4種類に分けられる
汎用レジスタ
セグメントレジスタ
プログラムステータス制御レジスタ
命令ポインタ
汎用レジスタ(general-purpose registers (GPRs), general registers) 論理演算と算術演算用のオペランド、アドレス計算用のオペランド、メモリポインタを保持する。命令の多くはオペランドを保持するレジスタが決まっている。汎用レジスタの特殊な使用法の詳細は以下。 戻り値や演算の結果が格納される。
汎用ポインタ(16bit mode)。
ループ操作用のカウンタ。
AXだけで足りない場合の退避用。I/Oポインタ。
文字列操作などで連続して読み込む際の読み込み元アドレスを保持。
文字列操作などで連続して書き込む際の書き込み先アドレスを保持。
pushで減りpopで増える。スタックポインタを保持する以外の用途への使用は避ける。
スタックの底。実行中の関数が使用するベースとなるもの。
16ビットのセグメントセレクタを保持する。メモリはセグメントというまとまりで分割されて管理されている。セグメントセレクタはメモリ内のセグメントを識別する特殊なポインタ。 実行中の命令を格納する。プロセッサはCSレジスタ内のセグメントセレクタとIPレジスタの値から計算される論理アドレスを用いて、コードセグメントから命令をフェッチする。IPレジスタには次に実行されるコードセグメント内のオフセットが格納される。
スタックセグメント用のセグメントセレクタが格納される。スタック操作では、SSレジスタを使用してスタックセグメントを探す。
ステータスフラグ
ADD, SUB, MUL, DIVなどの算術命令の結果を示すフラグ。
CF, carry
オーバーフロー(キャリーあるいはボロー)したかどうか。符号無しの数。 PF, parity
結果の最下位バイトの立っているビット数が偶数個かどうか。
AF, adjust
ZF, zero
ゼロかどうか。
SF, sign
負かどうか。
OF, overflow
オーバーフローしたかどうか。符号付きの数。
制御フラグ
DF, direction
ストリング命令を制御。
システムフラグ
trap
interrupt
割り込み可能かどうか
アクセスする範囲(ビット数)によるレジスタの名前の違い
EAXとAXが使われていたとしても別のレジスタが用意されているわけではない。
https://gyazo.com/eb052f35843067e804564699a902a522
64ビットアクセスはR?X
下位32ビットアクセスはE?X
下位16ビットアクセスは?X
下位16ビットの上位8ビットアクセスは?H
下位16ビットの下位8ビットアクセスは?L
レジスタの一覧と値を見る
GDBでinfo registersを実行するとレジスタと値の一覧を見れる。 code:WSL.txt
(gdb) info registers
rax 0x40052d 4195629
rbx 0x0 0
rcx 0x0 0
rdx 0x7ffffffde098 140737488216216
rsi 0x7ffffffde088 140737488216200
rdi 0x1 1
rbp 0x7ffffffddfa0 0x7ffffffddfa0
rsp 0x7ffffffddfa0 0x7ffffffddfa0
r8 0x7fffff3efe80 140737475706496
r9 0x7fffff410530 140737475839280
r10 0x7ffffffdde30 140737488215600
r11 0x7fffff051e50 140737471913552
r12 0x400440 4195392
r13 0x7ffffffde080 140737488216192
r14 0x0 0
r15 0x0 0
rip 0x400531 0x400531 <main+4>
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0