Intel® X86 Encoder Decoder
|
When you call xed_encode() to encode instruction you must pass: More...
Typedefs | |
typedef struct xed_decoded_inst_s | xed_encoder_request_s |
typedef xed_decoded_inst_t | xed_encoder_request_t |
Functions | |
XED_DLL_EXPORT xed_iclass_enum_t | xed_encoder_request_get_iclass (const xed_encoder_request_t *p) |
XED_DLL_EXPORT void | xed_encoder_request_set_iclass (xed_encoder_request_t *p, xed_iclass_enum_t iclass) |
Primary Encode Functions | |
XED_DLL_EXPORT void | xed_encoder_request_set_effective_operand_width (xed_encoder_request_t *p, xed_uint_t width_bits) |
XED_DLL_EXPORT void | xed_encoder_request_set_effective_address_size (xed_encoder_request_t *p, xed_uint_t width_bits) |
XED_DLL_EXPORT void | xed_encoder_request_set_reg (xed_encoder_request_t *p, xed_operand_enum_t operand, xed_reg_enum_t reg) |
Operand Order | |
XED_DLL_EXPORT void | xed_encoder_request_set_operand_order (xed_encoder_request_t *p, xed_uint_t operand_index, xed_operand_enum_t name) |
XED_DLL_EXPORT xed_operand_enum_t | xed_encoder_request_get_operand_order (xed_encoder_request_t *p, xed_uint_t operand_index) |
static XED_INLINE xed_uint_t | xed_encoder_request_operand_order_entries (xed_encoder_request_t *p) |
branches and far pointers | |
XED_DLL_EXPORT void | xed_encoder_request_set_relbr (xed_encoder_request_t *p) |
XED_DLL_EXPORT void | xed_encoder_request_set_absbr (xed_encoder_request_t *p) |
XED_DLL_EXPORT void | xed_encoder_request_set_branch_displacement (xed_encoder_request_t *p, xed_int64_t brdisp, xed_uint_t nbytes) |
XED_DLL_EXPORT void | xed_encoder_request_set_ptr (xed_encoder_request_t *p) |
Immediates | |
XED_DLL_EXPORT void | xed_encoder_request_set_uimm0 (xed_encoder_request_t *p, xed_uint64_t uimm, xed_uint_t nbytes) |
XED_DLL_EXPORT void | xed_encoder_request_set_uimm0_bits (xed_encoder_request_t *p, xed_uint64_t uimm, xed_uint_t nbits) |
XED_DLL_EXPORT void | xed_encoder_request_set_uimm1 (xed_encoder_request_t *p, xed_uint8_t uimm) |
XED_DLL_EXPORT void | xed_encoder_request_set_simm (xed_encoder_request_t *p, xed_int32_t simm, xed_uint_t nbytes) |
Initialization | |
XED_DLL_EXPORT void | xed_encoder_request_zero_operand_order (xed_encoder_request_t *p) |
XED_DLL_EXPORT void | xed_encoder_request_zero_set_mode (xed_encoder_request_t *p, const xed_state_t *dstate) |
XED_DLL_EXPORT void | xed_encoder_request_zero (xed_encoder_request_t *p) |
XED_DLL_EXPORT void | xed_encoder_request_init_from_decode (struct xed_decoded_inst_s *d) |
String Printing | |
XED_DLL_EXPORT void | xed_encode_request_print (const xed_encoder_request_t *p, char *buf, xed_uint_t buflen) |
Encoding | |
XED_DLL_EXPORT xed_error_enum_t | xed_encode (xed_encoder_request_t *r, xed_uint8_t *array, const unsigned int ilen, unsigned int *olen) |
This is the main interface to the encoder. More... | |
XED_DLL_EXPORT xed_error_enum_t | xed_encode_nop (xed_uint8_t *array, const unsigned int ilen) |
This function will attempt to encode a NOP of exactly ilen bytes. More... | |
When you call xed_encode() to encode instruction you must pass:
The class xed_encoder_request_t includes a xed_operand_values_t and that is where most of the information about the operands, resources etc. are stored.
To get nondefault width operands, during encoding, you have to call #xed_encoder_request_set_effective_operand_width() . To set nondefault addressing widths, you must call #xed_encoder_request_set_effective_address_size(). To encode instructions you must set the following
in the xed_encoder_request_t.
operand kind (XED_OPERAND_{AGEN,MEM0,MEM1,IMM0,IMM1,RELBR,ABSBR,PTR,REG0...REG15}
operand order
xed_encoder_request_set_operand_order(&req,operand_index, XED_OPERAND_*); where the operand_index is a sequential index starting at zero.
See An example of using the encoder for an example of using the encoder.
typedef struct xed_decoded_inst_s xed_encoder_request_s |
XED_DLL_EXPORT xed_error_enum_t xed_encode | ( | xed_encoder_request_t * | r, |
xed_uint8_t * | array, | ||
const unsigned int | ilen, | ||
unsigned int * | olen | ||
) |
This is the main interface to the encoder.
The array should be at most 15 bytes long. The ilen parameter should indicate this length. If the array is too short, the encoder may fail to encode the request. Failure is indicated by a return value of type xed_error_enum_t that is not equal to XED_ERROR_NONE. Otherwise, XED_ERROR_NONE is returned and the length of the encoded instruction is returned in olen.
r | encoder request description (xed_encoder_request_t), includes mode info |
array | the encoded instruction bytes are stored here |
ilen | the input length of array. |
olen | the actual length of array used for encoding |
XED_DLL_EXPORT xed_error_enum_t xed_encode_nop | ( | xed_uint8_t * | array, |
const unsigned int | ilen | ||
) |
This function will attempt to encode a NOP of exactly ilen bytes.
If such a NOP is not encodeable, then false will be returned.
array | the encoded instruction bytes are stored here |
ilen | the input length array. |
XED_DLL_EXPORT void xed_encode_request_print | ( | const xed_encoder_request_t * | p, |
char * | buf, | ||
xed_uint_t | buflen | ||
) |
XED_DLL_EXPORT xed_iclass_enum_t xed_encoder_request_get_iclass | ( | const xed_encoder_request_t * | p | ) |
XED_DLL_EXPORT xed_operand_enum_t xed_encoder_request_get_operand_order | ( | xed_encoder_request_t * | p, |
xed_uint_t | operand_index | ||
) |
Retrieve the name of the n'th operand in the operand order.
[in] | p | xed_encoder_request_t |
[in] | operand_index | xed_uint_t representing n'th operand position |
XED_DLL_EXPORT void xed_encoder_request_init_from_decode | ( | struct xed_decoded_inst_s * | d | ) |
Converts an decoder request to a valid encoder request.
|
static |
Retrieve the number of entries in the encoder operand order array
|
static |
|
static |
XED_DLL_EXPORT void xed_encoder_request_set_absbr | ( | xed_encoder_request_t * | p | ) |
XED_DLL_EXPORT void xed_encoder_request_set_agen | ( | xed_encoder_request_t * | p | ) |
XED_DLL_EXPORT void xed_encoder_request_set_base0 | ( | xed_encoder_request_t * | p, |
xed_reg_enum_t | base_reg | ||
) |
XED_DLL_EXPORT void xed_encoder_request_set_base1 | ( | xed_encoder_request_t * | p, |
xed_reg_enum_t | base_reg | ||
) |
XED_DLL_EXPORT void xed_encoder_request_set_branch_displacement | ( | xed_encoder_request_t * | p, |
xed_int64_t | brdisp, | ||
xed_uint_t | nbytes | ||
) |
XED_DLL_EXPORT void xed_encoder_request_set_effective_address_size | ( | xed_encoder_request_t * | p, |
xed_uint_t | width_bits | ||
) |
XED_DLL_EXPORT void xed_encoder_request_set_effective_operand_width | ( | xed_encoder_request_t * | p, |
xed_uint_t | width_bits | ||
) |
XED_DLL_EXPORT void xed_encoder_request_set_iclass | ( | xed_encoder_request_t * | p, |
xed_iclass_enum_t | iclass | ||
) |
XED_DLL_EXPORT void xed_encoder_request_set_index | ( | xed_encoder_request_t * | p, |
xed_reg_enum_t | index_reg | ||
) |
XED_DLL_EXPORT void xed_encoder_request_set_mem0 | ( | xed_encoder_request_t * | p | ) |
XED_DLL_EXPORT void xed_encoder_request_set_mem1 | ( | xed_encoder_request_t * | p | ) |
XED_DLL_EXPORT void xed_encoder_request_set_memory_displacement | ( | xed_encoder_request_t * | p, |
xed_int64_t | memdisp, | ||
xed_uint_t | nbytes | ||
) |
XED_DLL_EXPORT void xed_encoder_request_set_memory_operand_length | ( | xed_encoder_request_t * | p, |
xed_uint_t | nbytes | ||
) |
XED_DLL_EXPORT void xed_encoder_request_set_operand_order | ( | xed_encoder_request_t * | p, |
xed_uint_t | operand_index, | ||
xed_operand_enum_t | name | ||
) |
Specify the name as the n'th operand in the operand order.
The complication of this function is that the register operand names are specific to the position of the operand (REG0, REG1, REG2...). One can use this function for registers or one can use the xed_encoder_request_set_operand_name_reg() which takes integers instead of operand names.
[in] | p | xed_encoder_request_t |
[in] | operand_index | xed_uint_t representing n'th operand position |
[in] | name | xed_operand_enum_t operand name. |
XED_DLL_EXPORT void xed_encoder_request_set_ptr | ( | xed_encoder_request_t * | p | ) |
XED_DLL_EXPORT void xed_encoder_request_set_reg | ( | xed_encoder_request_t * | p, |
xed_operand_enum_t | operand, | ||
xed_reg_enum_t | reg | ||
) |
Set the operands array element indexed by operand to the actual register name reg.
[in] | p | xed_encoder_request_t |
[in] | operand | indicates which register operand storage field to use |
[in] | reg | the actual register represented (EAX, etc.) to store. |
XED_DLL_EXPORT void xed_encoder_request_set_relbr | ( | xed_encoder_request_t * | p | ) |
XED_DLL_EXPORT void xed_encoder_request_set_scale | ( | xed_encoder_request_t * | p, |
xed_uint_t | scale | ||
) |
XED_DLL_EXPORT void xed_encoder_request_set_seg0 | ( | xed_encoder_request_t * | p, |
xed_reg_enum_t | seg_reg | ||
) |
XED_DLL_EXPORT void xed_encoder_request_set_seg1 | ( | xed_encoder_request_t * | p, |
xed_reg_enum_t | seg_reg | ||
) |
XED_DLL_EXPORT void xed_encoder_request_set_simm | ( | xed_encoder_request_t * | p, |
xed_int32_t | simm, | ||
xed_uint_t | nbytes | ||
) |
same storage as uimm0
XED_DLL_EXPORT void xed_encoder_request_set_uimm0 | ( | xed_encoder_request_t * | p, |
xed_uint64_t | uimm, | ||
xed_uint_t | nbytes | ||
) |
Set the uimm0 using a BYTE width.
XED_DLL_EXPORT void xed_encoder_request_set_uimm0_bits | ( | xed_encoder_request_t * | p, |
xed_uint64_t | uimm, | ||
xed_uint_t | nbits | ||
) |
Set the uimm0 using a BIT width.
XED_DLL_EXPORT void xed_encoder_request_set_uimm1 | ( | xed_encoder_request_t * | p, |
xed_uint8_t | uimm | ||
) |
XED_DLL_EXPORT void xed_encoder_request_zero | ( | xed_encoder_request_t * | p | ) |
XED_DLL_EXPORT void xed_encoder_request_zero_operand_order | ( | xed_encoder_request_t * | p | ) |
clear the operand order array
[in] | p | xed_encoder_request_t |
XED_DLL_EXPORT void xed_encoder_request_zero_set_mode | ( | xed_encoder_request_t * | p, |
const xed_state_t * | dstate | ||
) |