Article by Ayman Alheraki on May 12 2026 01:03 PM
A typical instruction looks like this:
[ REX ] [ OPCODE ] [ MODR/M ] [ SIB ] [ DISP ] [ IMM ]
Not all fields are always present.
xxxxxxxxxx+----------------+| REX Prefix || 0100WRXB |+----------------+|v+--------------------------------+| Extends ModR/M + SIB fields || Adds 4th bit to registers |+--------------------------------+|v+--------------------------+| ModR/M Byte || MOD | REG | R/M || 2b | 3b | 3b |+--------------------------+|v+--------------------------------+| Final register = || (REX bit << 3) + 3-bit field |+--------------------------------+
xBit layout:7 6 | 5 4 3 | 2 1 0MOD | REG | R/M
| Field | Purpose |
|---|---|
| MOD | addressing mode |
| REG | register operand |
| R/M | register or memory operand |
REX does NOT replace ModR/M.
It extends its fields:
xxxxxxxxxxREX byte+-------------------+| W R X B |+-------------------+| | | || | | +--> extends R/M or BASE| | +----> extends SIB INDEX| +------> extends REG field+--------> 64-bit operand size
xxxxxxxxxxREG field:000 → RAX001 → RCX010 → RDX...111 → RDI
Diagram:
xxxxxxxxxxREG (3-bit)↓[ 000 ] → RAX[ 001 ] → RCX[ 010 ] → RDX...[ 111 ] → RDI
xxxxxxxxxxREX.R + REG becomes:REX.R | REG1 | 010 → 1010 (R10)1 | 011 → 1011 (R11)
Diagram:
xxxxxxxxxxREX.R bit↓+----------+| 1 |+----------+|vREG bits → [010]|v4-bit register:1010 → R10
xxxxxxxxxxmov r10, rax
xxxxxxxxxx4C 89 D0
xxxxxxxxxx4C = 01001100
Split:
xxxxxxxxxx0100 W R X B1 1 0 0
Diagram:
xxxxxxxxxxREX+-------------------+| W = 1 (64-bit) || R = 1 (extend REG)|| X = 0 || B = 0 |+-------------------+
xxxxxxxxxxD0 = 11010000
Split:
xxxxxxxxxx11 010 000MOD REG R/M
Diagram:
xxxxxxxxxxModR/M+--------------------+| MOD = 11 | → register mode| REG = 010 || R/M = 000 |+--------------------+
xxxxxxxxxxREG = REX.R : REG= 1 : 010= 1010 → R10R/M = REX.B : R/M= 0 : 000= 0000 → RAX
xxxxxxxxxxmov r10, rax
xxxxxxxxxxMACHINE CODE-------------4C 89 D0|v+----------------+| REX = 4C |+----------------+|vW=1 R=1 X=0 B=0|v+------------------------+| ModR/M = D0 || REG=010 R/M=000 |+------------------------+|v+------------------------+| Apply REX extensions || REG → 1010 = R10 || R/M → 0000 = RAX |+------------------------+|vFINAL:mov r10, rax
When memory indexing is used:
xxxxxxxxxx[ base + index * scale ]
SIB byte:
xxxxxxxxxxSS | INDEX | BASE
REX.X extends INDEX:
xxxxxxxxxxREX.X + INDEX → 4-bit register
Diagram:
xxxxxxxxxxSIB byte+--------------------+| SS | INDEX | BASE |+--------------------+|vREX.X extends INDEX|v4-bit register space
xxxxxxxxxxOriginal x86:REG = 3 bits→ 8 registersx86-64:REX adds 1 bit→ 16 registersVisual:3-bit: [xxx]REX: x[xxx]↑new MSB
ModR/M encodes register fields in 3 bits
REX adds a missing 4th bit
Final register = 0–15 range
Enables R8–R15 without breaking old x86