A.2.1 Register Values
Where an instruction requires a register value, it is already implicit
in the encoding of the rest of the instruction what type of register is
intended: an 8-bit general-purpose register, a segment register, a debug
register, an MMX register, or whatever. Therefore there is no problem
with registers of different types sharing an encoding value.
Please note that for the register classes listed below, the register
extensions (REX) classes require the use of the REX prefix, which is
only available when in long mode on an x86-64 processor. This pretty
much goes for any register that has a number higher than 7.
The encodings for the various classes of register are:
- 8-bit general registers: AL is 0, CL is 1, DL is 2, BL is 3, AH is
4, CH is 5, DH is 6 and BH is 7. Please note that AH, BH, CH and DH
are not addressable when using the REX prefix in long mode.
- 8-bit general register extensions (REX): SPL is 4, BPL is 5, SIL is
6, DIL is 7, R8B is 8, R9B is 9, R10B is 10, R11B is 11, R12B is 12,
R13B is 13, R14B is 14 and R15B is 15.
- 16-bit general registers: AX is 0, CX is 1, DX is 2, BX is 3, SP is
4, BP is 5, SI is 6, and DI is 7.
- 16-bit general register extensions (REX): R8W is 8, R9W is 9, R10w
is 10, R11W is 11, R12W is 12, R13W is 13, R14W is 14 and R15W is
15.
- 32-bit general registers: EAX is 0, ECX is 1, EDX is 2, EBX is 3,
ESP is 4, EBP is 5, ESI is 6, and EDI is 7.
- 32-bit general register extensions (REX): R8D is 8, R9D is 9, R10D
is 10, R11D is 11, R12D is 12, R13D is 13, R14D is 14 and R15D is
15.
- 64-bit general register extensions (REX): RAX is 0, RCX is 1, RDX is
2, RBX is 3, RSP is 4, RBP is 5, RSI is 6, RDI is 7, R8 is 8, R9 is
9, R10 is 10, R11 is 11, R12 is 12, R13 is 13, R14 is 14 and R15 is
15.
- Segment registers: ES is 0, CS is 1, SS is 2, DS is 3, FS is 4, and
GS is 5.
- Floating-point registers: ST0 is 0, ST1 is 1, ST2 is 2, ST3 is 3,
ST4 is 4, ST5 is 5, ST6 is 6, and ST7 is 7.
- 64-bit MMX registers: MM0 is 0, MM1 is 1, MM2 is 2, MM3 is 3, MM4 is
4, MM5 is 5, MM6 is 6, and MM7 is 7.
- 128-bit XMM (SSE) registers: XMM0 is 0, XMM1 is 1, XMM2 is 2, XMM3
is 3, XMM4 is 4, XMM5 is 5, XMM6 is 6 and XMM7 is 7.
- 128-bit XMM (SSE) register extensions (REX): XMM8 is 8, XMM9 is 9,
XMM10 is 10, XMM11 is 11, XMM12 is 12, XMM13 is 13, XMM14 is 14 and
XMM15 is 15.
- Control registers: CR0 is 0, CR2 is 2, CR3 is 3, and CR4 is 4.
- Control register extensions: CR8 is 8.
- Debug registers: DR0 is 0, DR1 is 1, DR2 is 2, DR3 is 3, DR6 is 6,
and DR7 is 7.
- Test registers: TR3 is 3, TR4 is 4, TR5 is 5, TR6 is 6, and TR7 is
7.
(Note that wherever a register name contains a number, that number is
also the register value for that register.)