When you call xed_encode() to encode instruction you must pass:
More...
When you call xed_encode() to encode instruction you must pass:
-
an encode structure that includes a machine state ( xed_state_t )
-
a pointer to the instruction text
-
a length of the text array
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.
-
the machine mode (machine width, and stack addressing width)
-
the effective operand width
-
the iclass
-
for some instructions you need to specify prefixes (like REP, REPNE or LOCK).
-
the operands:
-
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.
-
operand details
-
FOR MEMOPS: base,segment,index,scale,displacement for memops,
-
FOR REGISTERS: register name
-
FOR IMMEDIATES: immediate values
See An example of using the encoder for an example of using the encoder.
◆ xed_encoder_request_s
◆ xed_encoder_request_t
◆ xed_encode()
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.
- Parameters
-
| 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 |
- Returns
- success/failure as a xed_error_enum_t
◆ xed_encode_nop()
This function will attempt to encode a NOP of exactly ilen bytes.
If such a NOP is not encodeable, then false will be returned.
- Parameters
-
| array | the encoded instruction bytes are stored here |
| ilen | the input length array. |
- Returns
- success/failure as a xed_error_enum_t
◆ xed_encode_request_print()
◆ xed_encoder_request_get_iclass()
◆ xed_encoder_request_get_operand_order()
Retrieve the name of the n'th operand in the operand order.
- Parameters
-
- Returns
- The xed_operand_enum_t operand name.
◆ xed_encoder_request_init_from_decode()
Converts an decoder request to a valid encoder request.
◆ xed_encoder_request_operand_order_entries()
Retrieve the number of entries in the encoder operand order array
- Returns
- The number of entries in the encoder operand order array
◆ xed_encoder_request_operands()
◆ xed_encoder_request_operands_const()
◆ xed_encoder_request_set_absbr()
◆ xed_encoder_request_set_agen()
◆ xed_encoder_request_set_base0()
◆ xed_encoder_request_set_base1()
◆ xed_encoder_request_set_branch_displacement()
◆ xed_encoder_request_set_effective_address_size()
◆ xed_encoder_request_set_effective_operand_width()
◆ xed_encoder_request_set_iclass()
◆ xed_encoder_request_set_index()
◆ xed_encoder_request_set_mem0()
◆ xed_encoder_request_set_mem1()
◆ xed_encoder_request_set_memory_displacement()
◆ xed_encoder_request_set_memory_operand_length()
◆ xed_encoder_request_set_operand_order()
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.
- Parameters
-
◆ xed_encoder_request_set_ptr()
◆ xed_encoder_request_set_reg()
Set the operands array element indexed by operand to the actual register name reg.
- Parameters
-
| [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_encoder_request_set_relbr()
◆ xed_encoder_request_set_scale()
◆ xed_encoder_request_set_seg0()
◆ xed_encoder_request_set_seg1()
◆ xed_encoder_request_set_simm()
◆ xed_encoder_request_set_uimm0()
Set the uimm0 using a BYTE width.
◆ xed_encoder_request_set_uimm0_bits()
Set the uimm0 using a BIT width.
◆ xed_encoder_request_set_uimm1()
◆ xed_encoder_request_zero()
◆ xed_encoder_request_zero_operand_order()
clear the operand order array
- Parameters
-
| [in] | p | xed_encoder_request_t |
◆ xed_encoder_request_zero_set_mode()