x86-64のレジスタ
汎用レジスタ
x86-64は、64ビットの汎用レジスタが16本用意されている。
RAXレジスタ
RBXレジスタ
RCXレジスタ
RDXレジスタ
RSIレジスタ
RDIレジスタ
RBPレジスタ
RSPレジスタ
R8 〜 R15レジスタ
x86-64で追加された8本の汎用レジスタ
レジスタとビット幅
Intelの歴代CPUのレジスタ名は、レジスタのビット幅が変わるごとに以下のように変遷してきた。
8ビットCPU → Aレジスタ
16ビットCPU→ AXレジスタ
32ビットCPU → EAXレジスタ
64ビットCPU → RAXレジスタ
x86-64アーキテクチャは64ビットCPUなので上述した16本の64ビット汎用レジスタを持つが、後方互換性のため、64ビットレジスタの下位ビットを32ビットレジスタや16ビットレジスタとして利用することができる。例えば、32ビットなEAX レジスタへ値をセットすると、64ビットなRAX レジスタの下位32ビットにその値がセットされる。
以下は、x86-64アーキテクチャの汎用レジスタの一覧。32ビットおよび16ビットでアクセスする際の名前も併記している。また、各レジスタの名前の由来についても備考に記している。現在ではこれらのレジスタは汎用目的で使用されるため特定の用途に縛られることはないが、名前の由来を知ることでレジスタ名のイメージをつかみやすくなるはず。
table:x86-64汎用レジスタ
64ビットレジスタ 下位32ビット 下位16ビット 備考
RAX EAX AX 演算用のレジスタ(アキュムレータ)
RBX EBX BX 特定のメモリを指し示すポインタ(ベースレジスタ)
RCX ECX CX 繰り返し回数を数えるカウンタ(カウンレジスタ)
RDX EDX DX データの一時記憶用(データレジスタ)
RSI ESI SI メモリ操作のソース(ソースインデックス)
RDI EDI DI メモリ操作のデスティネーション(デスティネーションインデックス)
RBP EBP BP スタックフレームの基準点(ベースポインタ)
RSP ESP SP スタックポインタ
R8 R8D R8W (64ビットモードで追加)
... ... ... ...
R15 R15D R15W (64ビットモードで追加)
レジスタごとの主な用途
「RDIレジスタは関数の第一引数」や「RSPレジスタはスタックポインタ」など、各レジスタの主な用途は「ABI(Application Binary Interface)」と呼ばれる仕様で決められている。
ABIはCPUやOSごとに異なっていて、例えば X86_64/LinuxのABIは以下の資料で参照することができる。
System V Application Binary Interface AMD64 Architecture Processor Supplement
また、ABIでは「レジスタごとの値の退避の有無」が定義されており、「値の退避の必要なレジスタ」へ値を格納する場合は、元の値をどこか別のところへ保持しておき、利用が終わったら元の値に戻す必要がある。逆に、「値の対比が不要なレジスタ」へ値を格納する場合は、元の値を退避することなく、そのまま値を上書きして良い。
値の退避の必要なレジスタ(不揮発性なレジスタ)
RBX、RSP、RBP、R12、R13、R14、R15の7つ
値の退避が不要なレジスタ(揮発性なレジスタ)
上記以外のレジスタ
table:レジスタごとの用途
レジスタ名 用途 値の退避の必要なレジスタ?
RAX 一時変数、戻り値など No
RBX ベースポインタなど Yes
RCX 関数の第4引数など No
RDX 関数の第3引数など No
RSP スタックポインタ Yes
RBP フレームポインタ Yes
RSI 関数の第2引数など No
RDI 関数の第1引数など No
R8 関数の第5引数など No
R9 関数の第6引数など No
R10 一時変数など No
R11 一時変数など No
R12-R15 呼び出された側で保存が必要なレジスタ Yes
参考
Learn / Windows / Windows ドライバー / x64 アーキテクチャ
System V Application Binary Interface AMD64 Architecture Processor Supplement
はじめて読む8086