X86 Encoder Decoder
High Level API for Encoding Instructions

Memory Displacement

static XED_INLINE xed_enc_displacement_t xed_disp (xed_int64_t displacement, xed_uint32_t displacement_bits)
 a memory displacement (not for branches) More...
 

Branch Displacement

static XED_INLINE xed_encoder_operand_t xed_relbr (xed_int32_t brdisp, xed_uint_t width_bits)
 a relative branch displacement operand More...
 

Pointer Displacement

static XED_INLINE xed_encoder_operand_t xed_ptr (xed_int32_t brdisp, xed_uint_t width_bits)
 a relative displacement for a PTR operand – the subsequent imm0 holds the 16b selector More...
 

Register and Immediate Operands

static XED_INLINE xed_encoder_operand_t xed_reg (xed_reg_enum_t reg)
 a register operand More...
 
static XED_INLINE xed_encoder_operand_t xed_imm0 (xed_uint64_t v, xed_uint_t width_bits)
 a first immediate operand (known as IMM0) More...
 
static XED_INLINE xed_encoder_operand_t xed_simm0 (xed_int32_t v, xed_uint_t width_bits)
 an 32b signed immediate operand More...
 
static XED_INLINE xed_encoder_operand_t xed_imm1 (xed_uint8_t v)
 The 2nd immediate operand (known as IMM1) for rare instructions that require it. More...
 
static XED_INLINE xed_encoder_operand_t xed_other (xed_operand_enum_t operand_name, xed_int32_t value)
 an operand storage field name and value More...
 

Memory and Segment-releated Operands

static XED_INLINE xed_encoder_operand_t xed_seg0 (xed_reg_enum_t seg0)
 seg reg override for implicit suppressed memory ops More...
 
static XED_INLINE xed_encoder_operand_t xed_seg1 (xed_reg_enum_t seg1)
 seg reg override for implicit suppressed memory ops More...
 
static XED_INLINE xed_encoder_operand_t xed_mem_b (xed_reg_enum_t base, xed_uint_t width_bits)
 memory operand - base only More...
 
static XED_INLINE xed_encoder_operand_t xed_mem_bd (xed_reg_enum_t base, xed_enc_displacement_t disp, xed_uint_t width_bits)
 memory operand - base and displacement only More...
 
static XED_INLINE xed_encoder_operand_t xed_mem_bisd (xed_reg_enum_t base, xed_reg_enum_t index, xed_uint_t scale, xed_enc_displacement_t disp, xed_uint_t width_bits)
 memory operand - base, index, scale, displacement More...
 
static XED_INLINE xed_encoder_operand_t xed_mem_gb (xed_reg_enum_t seg, xed_reg_enum_t base, xed_uint_t width_bits)
 memory operand - segment and base only More...
 
static XED_INLINE xed_encoder_operand_t xed_mem_gbd (xed_reg_enum_t seg, xed_reg_enum_t base, xed_enc_displacement_t disp, xed_uint_t width_bits)
 memory operand - segment, base and displacement only More...
 
static XED_INLINE xed_encoder_operand_t xed_mem_gd (xed_reg_enum_t seg, xed_enc_displacement_t disp, xed_uint_t width_bits)
 memory operand - segment and displacement only More...
 
static XED_INLINE xed_encoder_operand_t xed_mem_gbisd (xed_reg_enum_t seg, xed_reg_enum_t base, xed_reg_enum_t index, xed_uint_t scale, xed_enc_displacement_t disp, xed_uint_t width_bits)
 memory operand - segment, base, index, scale, and displacement More...
 

Instruction Properties and prefixes

static XED_INLINE void xed_addr (xed_encoder_instruction_t *x, xed_uint_t width_bits)
 This is to specify effective address size different than the default. More...
 
static XED_INLINE void xed_rep (xed_encoder_instruction_t *x)
 To add a REP (0xF3) prefix. More...
 
static XED_INLINE void xed_repne (xed_encoder_instruction_t *x)
 To add a REPNE (0xF2) prefix. More...
 
XED_DLL_EXPORT xed_bool_t xed_convert_to_encoder_request (xed_encoder_request_t *out, xed_encoder_instruction_t *in)
 convert a xed_encoder_instruction_t to a xed_encoder_request_t for encoding More...
 

Creating instructions from operands

static XED_INLINE void xed_inst0 (xed_encoder_instruction_t *inst, xed_state_t mode, xed_iclass_enum_t iclass, xed_uint_t effective_operand_width)
 instruction with no operands More...
 
static XED_INLINE void xed_inst1 (xed_encoder_instruction_t *inst, xed_state_t mode, xed_iclass_enum_t iclass, xed_uint_t effective_operand_width, xed_encoder_operand_t op0)
 instruction with one operand More...
 
static XED_INLINE void xed_inst2 (xed_encoder_instruction_t *inst, xed_state_t mode, xed_iclass_enum_t iclass, xed_uint_t effective_operand_width, xed_encoder_operand_t op0, xed_encoder_operand_t op1)
 instruction with two operands More...
 
static XED_INLINE void xed_inst3 (xed_encoder_instruction_t *inst, xed_state_t mode, xed_iclass_enum_t iclass, xed_uint_t effective_operand_width, xed_encoder_operand_t op0, xed_encoder_operand_t op1, xed_encoder_operand_t op2)
 instruction with three operands More...
 
static XED_INLINE void xed_inst4 (xed_encoder_instruction_t *inst, xed_state_t mode, xed_iclass_enum_t iclass, xed_uint_t effective_operand_width, xed_encoder_operand_t op0, xed_encoder_operand_t op1, xed_encoder_operand_t op2, xed_encoder_operand_t op3)
 instruction with four operands More...
 
static XED_INLINE void xed_inst5 (xed_encoder_instruction_t *inst, xed_state_t mode, xed_iclass_enum_t iclass, xed_uint_t effective_operand_width, xed_encoder_operand_t op0, xed_encoder_operand_t op1, xed_encoder_operand_t op2, xed_encoder_operand_t op3, xed_encoder_operand_t op4)
 instruction with five operands More...
 
static XED_INLINE void xed_inst (xed_encoder_instruction_t *inst, xed_state_t mode, xed_iclass_enum_t iclass, xed_uint_t effective_operand_width, xed_uint_t number_of_operands, const xed_encoder_operand_t *operand_array)
 instruction with an array of operands. More...
 

Detailed Description

This is a higher level API for encoding instructions.

A full example is present in examples/xed-ex5-enc.c

In the following example we create one instructions template that can be passed to the encoder.

xed_state_t dstate;
xed_inst2(&x, dstate, XED_ICLASS_ADD, 0,
xreg(XED_REG_EAX),
xmem_bd(XED_REG_EDX, xdisp(0x11223344, 32), 32));
convert_ok = xed_convert_to_encoder_request(&enc_req, &x);
if (!convert_ok) {
fprintf(stderr,"conversion to encode request failed\n");
continue;
}
xed_error = xed_encode(&enc_req, itext, ilen, &olen);

The high-level encoder interface allows passing the effective operand width for the xed_inst*() function as 0 (zero) when the effective operand width is the default.

The default width in 16b mode is 16b. The default width in 32b or 64b modes is 32b. So if you do a 16b operation in 32b/64b mode, you must set the effective operand width. If you do a 64b operation in 64b mode, you must set it (the default is 32). Or if you do a more rare 32b operation in 16b mode you must also set it.

When all the operands are "suppressed" operands, then the effective operand width must be supplied for nondefault operation widths.

Function Documentation

◆ xed_addr()

static XED_INLINE void xed_addr ( xed_encoder_instruction_t x,
xed_uint_t  width_bits 
)
static

This is to specify effective address size different than the default.

For things with base or index regs, XED picks it up from the registers. But for things that have implicit memops, or no base or index reg, we must allow the user to set the address width directly.

Parameters
xThe xed_encoder_instruction_t being filled in.
width_bitsThe intended effective address size in bits. Values: 16, 32 or 64.

◆ xed_convert_to_encoder_request()

XED_DLL_EXPORT xed_bool_t xed_convert_to_encoder_request ( xed_encoder_request_t out,
xed_encoder_instruction_t in 
)

convert a xed_encoder_instruction_t to a xed_encoder_request_t for encoding

◆ xed_disp()

static XED_INLINE xed_enc_displacement_t xed_disp ( xed_int64_t  displacement,
xed_uint32_t  displacement_bits 
)
static

a memory displacement (not for branches)

Parameters
displacementThe value of the displacement
displacement_bitsThe width of the displacement in bits. Typically 8 or 32.
Returns
xed_enc_displacement_t

◆ xed_imm0()

static XED_INLINE xed_encoder_operand_t xed_imm0 ( xed_uint64_t  v,
xed_uint_t  width_bits 
)
static

a first immediate operand (known as IMM0)

Parameters
vAn immdediate operand.
width_bitsThe immediate width in bits.
Returns
xed_encoder_operand_t An operand.

◆ xed_imm1()

static XED_INLINE xed_encoder_operand_t xed_imm1 ( xed_uint8_t  v)
static

The 2nd immediate operand (known as IMM1) for rare instructions that require it.

Parameters
vThe 2nd immdediate (byte-width) operand
Returns
xed_encoder_operand_t An operand.

◆ xed_inst()

static XED_INLINE void xed_inst ( xed_encoder_instruction_t inst,
xed_state_t  mode,
xed_iclass_enum_t  iclass,
xed_uint_t  effective_operand_width,
xed_uint_t  number_of_operands,
const xed_encoder_operand_t operand_array 
)
static

instruction with an array of operands.

The maximum number is XED_ENCODER_OPERANDS_MAX. The array's contents are copied.

Parameters
instThe xed_encoder_instruction_t to be filled in
modeThe xed_state_t including the machine mode and stack address width.
iclassThe xed_iclass_enum_t
effective_operand_widthin bits
number_of_operandslength of the subsequent array
operand_arrayAn array of xed_encoder_operand_t objects

◆ xed_inst0()

static XED_INLINE void xed_inst0 ( xed_encoder_instruction_t inst,
xed_state_t  mode,
xed_iclass_enum_t  iclass,
xed_uint_t  effective_operand_width 
)
static

instruction with no operands

Parameters
instThe xed_encoder_instruction_t to be filled in
modeThe xed_state_t including the machine mode and stack address width.
iclassThe xed_iclass_enum_t
effective_operand_widthin bits

◆ xed_inst1()

static XED_INLINE void xed_inst1 ( xed_encoder_instruction_t inst,
xed_state_t  mode,
xed_iclass_enum_t  iclass,
xed_uint_t  effective_operand_width,
xed_encoder_operand_t  op0 
)
static

instruction with one operand

Parameters
instThe xed_encoder_instruction_t to be filled in
modeThe xed_state_t including the machine mode and stack address width.
iclassThe xed_iclass_enum_t
effective_operand_widthin bits
op0the operand

◆ xed_inst2()

static XED_INLINE void xed_inst2 ( xed_encoder_instruction_t inst,
xed_state_t  mode,
xed_iclass_enum_t  iclass,
xed_uint_t  effective_operand_width,
xed_encoder_operand_t  op0,
xed_encoder_operand_t  op1 
)
static

instruction with two operands

Parameters
instThe xed_encoder_instruction_t to be filled in
modeThe xed_state_t including the machine mode and stack address width.
iclassThe xed_iclass_enum_t
effective_operand_widthin bits
op0the 1st operand
op1the 2nd operand

◆ xed_inst3()

static XED_INLINE void xed_inst3 ( xed_encoder_instruction_t inst,
xed_state_t  mode,
xed_iclass_enum_t  iclass,
xed_uint_t  effective_operand_width,
xed_encoder_operand_t  op0,
xed_encoder_operand_t  op1,
xed_encoder_operand_t  op2 
)
static

instruction with three operands

Parameters
instThe xed_encoder_instruction_t to be filled in
modeThe xed_state_t including the machine mode and stack address width.
iclassThe xed_iclass_enum_t
effective_operand_widthin bits
op0the 1st operand
op1the 2nd operand
op2the 3rd operand

◆ xed_inst4()

static XED_INLINE void xed_inst4 ( xed_encoder_instruction_t inst,
xed_state_t  mode,
xed_iclass_enum_t  iclass,
xed_uint_t  effective_operand_width,
xed_encoder_operand_t  op0,
xed_encoder_operand_t  op1,
xed_encoder_operand_t  op2,
xed_encoder_operand_t  op3 
)
static

instruction with four operands

Parameters
instThe xed_encoder_instruction_t to be filled in
modeThe xed_state_t including the machine mode and stack address width.
iclassThe xed_iclass_enum_t
effective_operand_widthin bits
op0the 1st operand
op1the 2nd operand
op2the 3rd operand
op3the 4th operand

◆ xed_inst5()

static XED_INLINE void xed_inst5 ( xed_encoder_instruction_t inst,
xed_state_t  mode,
xed_iclass_enum_t  iclass,
xed_uint_t  effective_operand_width,
xed_encoder_operand_t  op0,
xed_encoder_operand_t  op1,
xed_encoder_operand_t  op2,
xed_encoder_operand_t  op3,
xed_encoder_operand_t  op4 
)
static

instruction with five operands

Parameters
instThe xed_encoder_instruction_t to be filled in
modeThe xed_state_t including the machine mode and stack address width.
iclassThe xed_iclass_enum_t
effective_operand_widthin bits
op0the 1st operand
op1the 2nd operand
op2the 3rd operand
op3the 4th operand
op4the 5th operand

◆ xed_mem_b()

static XED_INLINE xed_encoder_operand_t xed_mem_b ( xed_reg_enum_t  base,
xed_uint_t  width_bits 
)
static

memory operand - base only

Parameters
baseThe base register
width_bitsThe length of the memory reference in bits.
Returns
xed_encoder_operand_t An operand.

◆ xed_mem_bd()

static XED_INLINE xed_encoder_operand_t xed_mem_bd ( xed_reg_enum_t  base,
xed_enc_displacement_t  disp,
xed_uint_t  width_bits 
)
static

memory operand - base and displacement only

Parameters
baseThe base register
dispThe displacement
width_bitsThe length of the memory reference in bits.
Returns
xed_encoder_operand_t An operand.

◆ xed_mem_bisd()

static XED_INLINE xed_encoder_operand_t xed_mem_bisd ( xed_reg_enum_t  base,
xed_reg_enum_t  index,
xed_uint_t  scale,
xed_enc_displacement_t  disp,
xed_uint_t  width_bits 
)
static

memory operand - base, index, scale, displacement

Parameters
baseThe base register
indexThe index register
scaleThe scale for the index register value
dispThe displacement
width_bitsThe length of the memory reference in bits.
Returns
xed_encoder_operand_t An operand.

◆ xed_mem_gb()

static XED_INLINE xed_encoder_operand_t xed_mem_gb ( xed_reg_enum_t  seg,
xed_reg_enum_t  base,
xed_uint_t  width_bits 
)
static

memory operand - segment and base only

Parameters
segThe segment override register
baseThe base register
width_bitsThe length of the memory reference in bits.
Returns
xed_encoder_operand_t An operand.

◆ xed_mem_gbd()

static XED_INLINE xed_encoder_operand_t xed_mem_gbd ( xed_reg_enum_t  seg,
xed_reg_enum_t  base,
xed_enc_displacement_t  disp,
xed_uint_t  width_bits 
)
static

memory operand - segment, base and displacement only

Parameters
segThe segment override register
baseThe base register
dispThe displacement
width_bitsThe length of the memory reference in bits.
Returns
xed_encoder_operand_t An operand.

◆ xed_mem_gbisd()

static XED_INLINE xed_encoder_operand_t xed_mem_gbisd ( xed_reg_enum_t  seg,
xed_reg_enum_t  base,
xed_reg_enum_t  index,
xed_uint_t  scale,
xed_enc_displacement_t  disp,
xed_uint_t  width_bits 
)
static

memory operand - segment, base, index, scale, and displacement

Parameters
segThe segment override register
baseThe base register
indexThe index register
scaleThe scale for the index register value
dispThe displacement
width_bitsThe length of the memory reference in bits.
Returns
xed_encoder_operand_t An operand.

◆ xed_mem_gd()

static XED_INLINE xed_encoder_operand_t xed_mem_gd ( xed_reg_enum_t  seg,
xed_enc_displacement_t  disp,
xed_uint_t  width_bits 
)
static

memory operand - segment and displacement only

Parameters
segThe segment override register
dispThe displacement
width_bitsThe length of the memory reference in bits.
Returns
xed_encoder_operand_t An operand.

◆ xed_other()

static XED_INLINE xed_encoder_operand_t xed_other ( xed_operand_enum_t  operand_name,
xed_int32_t  value 
)
static

an operand storage field name and value

◆ xed_ptr()

static XED_INLINE xed_encoder_operand_t xed_ptr ( xed_int32_t  brdisp,
xed_uint_t  width_bits 
)
static

a relative displacement for a PTR operand – the subsequent imm0 holds the 16b selector

Parameters
brdispThe displacement for a far pointer operand
width_bitsThe width of the far pointr displacement in bits.
Returns
xed_encoder_operand_t An operand.

◆ xed_reg()

static XED_INLINE xed_encoder_operand_t xed_reg ( xed_reg_enum_t  reg)
static

a register operand

Parameters
regA xed_reg_enum_t register operand
Returns
xed_encoder_operand_t An operand.

◆ xed_relbr()

static XED_INLINE xed_encoder_operand_t xed_relbr ( xed_int32_t  brdisp,
xed_uint_t  width_bits 
)
static

a relative branch displacement operand

Parameters
brdispThe branch displacement
width_bitsThe width of the displacement in bits. Typically 8 or 32.
Returns
xed_encoder_operand_t An operand.

◆ xed_rep()

static XED_INLINE void xed_rep ( xed_encoder_instruction_t x)
static

To add a REP (0xF3) prefix.

Parameters
xThe xed_encoder_instruction_t being filled in.

◆ xed_repne()

static XED_INLINE void xed_repne ( xed_encoder_instruction_t x)
static

To add a REPNE (0xF2) prefix.

Parameters
xThe xed_encoder_instruction_t being filled in.

◆ xed_seg0()

static XED_INLINE xed_encoder_operand_t xed_seg0 ( xed_reg_enum_t  seg0)
static

seg reg override for implicit suppressed memory ops

◆ xed_seg1()

static XED_INLINE xed_encoder_operand_t xed_seg1 ( xed_reg_enum_t  seg1)
static

seg reg override for implicit suppressed memory ops

◆ xed_simm0()

static XED_INLINE xed_encoder_operand_t xed_simm0 ( xed_int32_t  v,
xed_uint_t  width_bits 
)
static

an 32b signed immediate operand

Parameters
vAn signed immdediate operand.
width_bitsThe immediate width in bits.
Returns
xed_encoder_operand_t An operand.