Skip to content

Instantly share code, notes, and snippets.

@rikkimax
Last active March 7, 2016 03:51
Show Gist options
  • Save rikkimax/26e3840f13ebc7d32390 to your computer and use it in GitHub Desktop.
Save rikkimax/26e3840f13ebc7d32390 to your computer and use it in GitHub Desktop.

{pagebreak}

ModRM/SIB encoding

Below is the structure of the ModRM byte:

7, 6 5, 4, 3 2, 1, 0
Mod Reg Reg/Mem

The Reg field can be reused to extend the opcode. This is specified in the opcode syntax of /digit.

The prefix REX.R, VEX.~R or XOP.~R can extend the Reg field into 4 bits by using .R as the most significant bit. The prefix REX.B, VEX.~B or XOP.~B can extend the Reg/Mem field into 4 bits by using .B as the most significant bit.

Below is the structure of the SIB byte:

7, 6 5, 4, 3 2, 1, 0
Scale Index Base

Index and Base are registers which contain the value. The prefix REX.X, VEX.~X, XOP.~X can extend the Index field into 4 bits by using .X as the most significant bit. The prefix REX.B, VEX.~B, XOP.~B can extend the Base field into 4 bits by using .B as the most significant bit.

$$effective_address = scale * [index] + [base] + offset$$

Where offset is the displacement (immediate value), scale is where e.g. the data elements size would go for an array, index is the starting element in the array and base is the root/first element.

Scale has the following values:

Encoded value scale factor
00 1
01 2
10 4
11 8

Addressing mode

Different addressing mode (16 vs 32/64) changes the displacement based upon the ModRM.Mod field.

Address Mode Mod Displacement Length
16 00 Invalid
16 01 1
16 10 2
16 11 Invalid
32/64 00 Invalid
32/64 01 1
32/64 10 4
32/64 11 Invalid

Special cases are listed below:

Mod Address Mode Reg/Mem Displacement Length Use SIB
00 16 110 2 No
00 32/64 100 Invalid Yes
00 32/64 101 4 No
01 32/64 100 1 Yes
10 32/64 100 4 Yes

In 64bit mode and Reg/Mem is 101 where Mod is 00 then the displacement is calculated by RIP + displacement instead of normally just being displacement.

// Auto generated, do not edit.
module alphacodegen.targets.x86.registers;
import alphacodegen.common.targets.x86.register;
bool findRegister(string name, out Register oreg) {
foreach(reg; x86Registers) {
Register match = reg.match(name);
if (match.name !is null) {
oreg = match;
return true;
}
}
return false;
}
static immutable(RegisterGroup[]) x86Registers = [
RegisterGroup(
Register("AL", 0, false, false, false,
EncodeAs(0, 0, 0, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("AH", 0, false, false, false,
EncodeAs(0, 4, 0, 0, true, false, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(true, false, 0),
EncodeForMODRM_SIB(true, true, 1),
EncodeForMODRM_SIB(true, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("AX", 0, false, false, false,
EncodeAs(0, 0, 0, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("eAX", 0, false, false, false,
EncodeAs(0, 0, 0, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("rAX", 0, false, false, false,
EncodeAs(0, 0, 0, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("BL", 0, false, false, false,
EncodeAs(3, 3, 3, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("BH", 0, false, false, false,
EncodeAs(3, 7, 0, 0, true, false, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("BX", 0, false, false, false,
EncodeAs(3, 3, 3, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("eBX", 0, false, false, false,
EncodeAs(3, 3, 3, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("rBX", 0, false, false, false,
EncodeAs(3, 3, 3, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("CL", 0, false, false, false,
EncodeAs(1, 1, 1, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("CH", 0, false, false, false,
EncodeAs(1, 5, 0, 0, true, false, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("CX", 0, false, false, false,
EncodeAs(1, 1, 1, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("eCX", 0, false, false, false,
EncodeAs(1, 1, 1, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("rCX", 0, false, false, false,
EncodeAs(1, 1, 1, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("DL", 0, false, false, false,
EncodeAs(2, 2, 2, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("DH", 0, false, false, false,
EncodeAs(2, 6, 0, 0, true, false, false,
[
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("DX", 0, false, false, false,
EncodeAs(2, 2, 2, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("eDX", 0, false, false, false,
EncodeAs(2, 2, 2, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("rDX", 0, false, false, false,
EncodeAs(2, 2, 2, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("SIL", 0, false, true, false,
EncodeAs(6, 0, 6, 0, false, true, false,
[
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register.init,
Register("SI", 0, false, false, false,
EncodeAs(6, 6, 6, 0, true, true, false,
[
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("eSI", 0, false, false, false,
EncodeAs(6, 6, 6, 0, true, true, false,
[
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("rSI", 0, false, false, false,
EncodeAs(6, 6, 6, 0, true, true, false,
[
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("DIL", 0, false, true, false,
EncodeAs(7, 0, 7, 0, false, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register.init,
Register("DI", 0, false, false, false,
EncodeAs(7, 7, 7, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("eDI", 0, false, false, false,
EncodeAs(7, 7, 7, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("rDI", 0, false, false, false,
EncodeAs(7, 7, 7, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("BPL", 0, false, true, false,
EncodeAs(5, 0, 5, 0, false, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register.init,
Register("BP", 0, false, false, false,
EncodeAs(5, 5, 5, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("eBP", 0, false, false, false,
EncodeAs(5, 5, 5, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("rBP", 0, false, false, false,
EncodeAs(5, 5, 5, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("SPL", 0, false, true, false,
EncodeAs(4, 0, 4, 0, false, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(true, false, 0),
EncodeForMODRM_SIB(true, true, 1),
EncodeForMODRM_SIB(true, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register.init,
Register("SP", 0, false, false, false,
EncodeAs(4, 4, 4, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(true, false, 0),
EncodeForMODRM_SIB(true, true, 1),
EncodeForMODRM_SIB(true, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("eSP", 0, false, false, false,
EncodeAs(4, 4, 4, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(true, false, 0),
EncodeForMODRM_SIB(true, true, 1),
EncodeForMODRM_SIB(true, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("rSP", 0, false, false, false,
EncodeAs(4, 4, 4, 0, true, true, false,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(true, false, 0),
EncodeForMODRM_SIB(true, true, 1),
EncodeForMODRM_SIB(true, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("r8B", 0, false, false, true,
EncodeAs(8, 0, 0, 0, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register.init,
Register("r8W", 0, false, false, true,
EncodeAs(8, 0, 0, 0, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r8D", 0, false, false, true,
EncodeAs(8, 0, 0, 0, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r8", 0, false, false, true,
EncodeAs(8, 0, 0, 0, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("r9B", 0, false, false, true,
EncodeAs(9, 0, 0, 3, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register.init,
Register("r9W", 0, false, false, true,
EncodeAs(9, 0, 0, 3, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r9D", 0, false, false, true,
EncodeAs(9, 0, 0, 3, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r9", 0, false, false, true,
EncodeAs(9, 0, 0, 3, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("r10B", 0, false, false, true,
EncodeAs(10, 0, 0, 1, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register.init,
Register("r10W", 0, false, false, true,
EncodeAs(10, 0, 0, 1, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r10D", 0, false, false, true,
EncodeAs(10, 0, 0, 1, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r10", 0, false, false, true,
EncodeAs(10, 0, 0, 1, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("r11B", 0, false, false, true,
EncodeAs(11, 0, 0, 2, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register.init,
Register("r11W", 0, false, false, true,
EncodeAs(11, 0, 0, 2, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r11D", 0, false, false, true,
EncodeAs(11, 0, 0, 2, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r11", 0, false, false, true,
EncodeAs(11, 0, 0, 2, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("r12B", 0, false, false, true,
EncodeAs(12, 0, 0, 4, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(true, false, 0),
EncodeForMODRM_SIB(true, true, 1),
EncodeForMODRM_SIB(true, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register.init,
Register("r12W", 0, false, false, true,
EncodeAs(12, 0, 0, 4, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(true, false, 0),
EncodeForMODRM_SIB(true, true, 1),
EncodeForMODRM_SIB(true, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r12D", 0, false, false, true,
EncodeAs(12, 0, 0, 4, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(true, false, 0),
EncodeForMODRM_SIB(true, true, 1),
EncodeForMODRM_SIB(true, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r12", 0, false, false, true,
EncodeAs(12, 0, 0, 4, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(true, false, 0),
EncodeForMODRM_SIB(true, true, 1),
EncodeForMODRM_SIB(true, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("r13B", 0, false, false, true,
EncodeAs(13, 0, 0, 5, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register.init,
Register("r13W", 0, false, false, true,
EncodeAs(13, 0, 0, 5, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r13D", 0, false, false, true,
EncodeAs(13, 0, 0, 5, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r13", 0, false, false, true,
EncodeAs(13, 0, 0, 5, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("r14B", 0, false, false, true,
EncodeAs(14, 0, 0, 6, false, false, true,
[
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register.init,
Register("r14W", 0, false, false, true,
EncodeAs(14, 0, 0, 6, false, false, true,
[
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r14D", 0, false, false, true,
EncodeAs(14, 0, 0, 6, false, false, true,
[
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r14", 0, false, false, true,
EncodeAs(14, 0, 0, 6, false, false, true,
[
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
),
RegisterGroup(
Register("r15B", 0, false, false, true,
EncodeAs(15, 0, 0, 7, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register.init,
Register("r15W", 0, false, false, true,
EncodeAs(15, 0, 0, 7, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r15D", 0, false, false, true,
EncodeAs(15, 0, 0, 7, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
),
Register("r15", 0, false, false, true,
EncodeAs(15, 0, 0, 7, false, false, true,
[
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 2),
EncodeForMODRM_SIB(false, false, 0),
], [
EncodeForMODRM_SIB(false, false, 0),
EncodeForMODRM_SIB(false, true, 1),
EncodeForMODRM_SIB(false, true, 4),
EncodeForMODRM_SIB(false, false, 0)
]
)
)
)
];

{pagebreak}

Registers

When encoding registers straight the below table is used:

Encode as 8bit low 8bit high 16bit 32bit 64bit low 8 requires REX Requires 64bit
0x0 AL AH AX eAX rAX No No
0x3 BL BH BX eBX rBX No No
0x1 CL CH CX eCX rCX No No
0x2 DL DH DX eDX rDX No No
0x6 SIL Invalid SI eSI rSI Yes No
0x7 DIL Invalid DI eDI rDI Yes No
0x5 BPL Invalid BP eBP rBP Yes No
0x4 SPL Invalid SP eSP rSP Yes No
0x8 r8B Invalid r8W r8D r8 No Yes
0x9 r9B Invalid r9W r9D r9 No Yes
0xA r10B Invalid r10W r10D r10 No Yes
0xB r11B Invalid r11W r11D r11 No Yes
0xC r12B Invalid r12W r12D r12 No Yes
0xD r13B Invalid r13W r13D r13 No Yes
0xE r14B Invalid r14W r14D r14 No Yes
0xF r15B Invalid r15W r15D r15 No Yes

For when encoding using +rb +rw +rd +rq there are three tables.

  1. No REX prefix provided
  2. REX prefix provided and REX.B is 0
  3. REX prefix provided and REX.B is 1
Encode as +rb +rw +rd +rq
0x0 AL AX EAX RAX
0x3 BL BX EBX RBX
0x1 CL CX ECX RCX
0x2 DL DX EDX RDX
0x4 AH SP ESP RSP
0x5 CH BP EBP RBP
0x6 DH SI ESI RSI
0x7 BH DI EDI RDI
Encode as +rb +rw +rd +rq
0x0 AL AX EAX RAX
0x3 BL BX EBX RBX
0x1 CL CX ECX RCX
0x2 DL DX EDX RDX
0x4 SPL SP ESP RSP
0x5 BPL BP EBP RBP
0x6 SIL SI ESI RSI
0x7 DIL DI EDI RDI
Encode as +rb +rw +rd +rq
0x0 r8B r8W r8D r8
0x3 r9B r9W r9D r9
0x1 r10B r10W r10D r10
0x2 r11B r11W r11D r11
0x4 r12B r12W r12D r12
0x5 r13B r13W r13D r13
0x6 r14B r14W r14D r14
0x7 r15B r15W r15D r15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment