27 #ifndef FCML_DISASSEMBLER_HPP_
28 #define FCML_DISASSEMBLER_HPP_
64 _throwExceptionOnError(true),
66 _enableErrorMessages(true),
67 _carryFlagConditionalSuffix(false),
68 _conditionalGroup(false),
70 _extendDispToASA(false),
71 _failIfUnknownInstruction(false) {
76 return _carryFlagConditionalSuffix;
81 _carryFlagConditionalSuffix = carryFlagConditionalSuffix;
86 return _conditionalGroup;
91 _conditionalGroup = conditionalGroup;
96 return _enableErrorMessages;
101 _enableErrorMessages = enableErrorMessages;
106 return _extendDispToASA;
111 _extendDispToASA = extendDispToAsa;
116 return _failIfUnknownInstruction;
121 _failIfUnknownInstruction = failIfUnknownInstruction;
131 _incrementIP = incrementIp;
141 _shortForms = shortForms;
151 return _throwExceptionOnError;
161 _throwExceptionOnError = throwExceptionOnError;
165 bool _throwExceptionOnError;
167 bool _enableErrorMessages;
168 bool _carryFlagConditionalSuffix;
169 fcml_uint8_t _conditionalGroup;
171 bool _extendDispToASA;
172 bool _failIfUnknownInstruction;
200 _codeLength(codeLength) {
242 _codeLength = codeLength;
252 return _disassemblerConf;
262 return _disassemblerConf;
272 _disassemblerConf = disassemblerConf;
303 _entryPoint = entryPoint;
313 _entryPoint.
setIP(ip);
364 fcml_usize _codeLength;
377 PT_GROUP_UNKNOWN = FCML_PT_GROUP_UNKNOWN,
378 PT_GROUP_1 = FCML_PT_GROUP_1,
379 PT_GROUP_2 = FCML_PT_GROUP_2,
380 PT_GROUP_3 = FCML_PT_GROUP_3,
381 PT_GROUP_4 = FCML_PT_GROUP_4,
382 PT_REX = FCML_PT_REX,
383 PT_VEX = FCML_PT_VEX,
394 return _mandatoryPrefix;
404 _mandatoryPrefix = mandatoryPrefix;
444 _prefixType = prefixType;
469 fcml_uint8_t _prefix;
473 bool _mandatoryPrefix;
475 fcml_uint8_t _vexXOPBytes[2];
490 _prefixesBytesCount(0),
501 _vexXopFirstByte(false),
523 return _prefixes[index];
537 return _prefixes[index];
832 return _prefixes[index];
847 return _prefixes[index];
857 return _prefixesBytesCount;
867 _prefixesBytesCount = prefixesBytesCount;
877 return _prefixesCount;
887 _prefixesCount = prefixesCount;
917 return _vexXopFirstByte;
927 _vexXopFirstByte = vexXopFirstByte;
994 fcml_int _prefixesCount;
996 fcml_int _prefixesBytesCount;
1018 fcml_uint8_t _vexXopFirstByte;
1070 _accessMode( accessMode ) {
1090 _accessMode = accessMode;
1229 _addrMode = addrMode;
1239 return _instruction;
1249 _instruction = instruction;
1259 return _instructionCode;
1269 return _instructionCode;
1279 return _instructionGroup;
1289 _instructionGroup = instructionGroup;
1299 return _instructionSize;
1309 _instructionSize = instructionSize;
1339 return _modRMDetails;
1349 return _modRMDetails;
1359 _modRMDetails = modRmDetails;
1369 return _opcodeFieldSBit;
1379 _opcodeFieldSBit = opcodeFieldSBit;
1389 return _opcodeFieldWBit;
1399 _opcodeFieldWBit = opcodeFieldWBit;
1414 return _operandDetails[index];
1429 return _operandDetails[index];
1439 return _prefixesDetails;
1449 return _prefixesDetails;
1459 _prefixesDetails = prefixesDetails;
1479 _pseudoOp = pseudoOp;
1522 fcml_usize _instructionSize;
1538 bool _opcodeFieldSBit;
1542 bool _opcodeFieldWBit;
1554 fcml_uint16_t _addrMode;
1558 fcml_uint64_t _instructionGroup;
1578 return _errorContainer;
1588 return _instruction;
1598 return _instructionDetails;
1606 _errorContainer.
clean();
1622 return _instructionDetails;
1631 _instructionDetails = instructionDetails;
1640 return _instruction;
1649 _instruction = instruction;
1658 _errorContainer = errorContainer;
1704 modRM.setNotNull( FCML_TO_CPP_BOOL( src.
is_modrm ) );
1705 modRM.setValue( src.
modrm );
1707 sib.setNotNull( FCML_TO_CPP_BOOL( src.
sib.is_not_null ) );
1708 sib.setValue( src.
sib.value );
1716 sib.is_not_null = src.
getSib().isNotNull();
1717 sib.value = src.
getSib().getValue();
1786 dest.
r = src.
getR();
1787 dest.
x = src.
getX();
1788 dest.
b = src.
getB();
1789 dest.
w = src.
getW();
1790 dest.
l = src.
getL();
1872 if (_disassembler) {
1874 _disassembler = NULL;
1894 DisassemblerTypeConverter::convert( ctx, context );
1904 disassemblerResult.
clean();
1909 ErrorTypeConverter::convert( disassembler_result.
errors, errorContainer );
1921 DisassemblerTypeConverter::convert( disassembler_result, disassemblerResult );
1931 }
catch( std::exception &exc ) {
1960 #endif //FCML_DISASSEMBLER_HPP_
void setX(fcml_uint8_t x)
Sets X flag.
Definition: fcml_disassembler.hpp:986
DecodedModRMDetails & getModRmDetails()
Gets ModR/M instruction details.
Definition: fcml_disassembler.hpp:1348
void setIsPseudoOp(bool isPseudoOp)
Sets pseudo operation flag.
Definition: fcml_disassembler.hpp:1498
bool isRex() const
Gets true if Rex prefix is available.
Definition: fcml_disassembler.hpp:666
DisassemblerContext()
Creates empty disassembler context.
Definition: fcml_disassembler.hpp:186
fcml_uint8_t mmmm
m-mmmm field of XOP or VEX prefix.
Definition: fcml_disassembler.h:155
void setAccessMode(AccessMode accessMode)
Sets an access mode for the operand.
Definition: fcml_disassembler.hpp:1089
fcml_ip ip
Instruction pointer EIP/RIP.
Definition: fcml_common.h:657
void clean()
Cleans the disassembling result.
Definition: fcml_disassembler.hpp:1605
fcml_bool is_xacquire
FCML_TRUE if xacquire explicit prefix exists.
Definition: fcml_disassembler.h:135
bool isRepne() const
Gets true if Repne prefix is available.
Definition: fcml_disassembler.hpp:646
fcml_en_access_mode access_mode
Instruction operand access mode READ, WRITE or both.
Definition: fcml_disassembler.h:165
void setOperatingMode(EntryPoint::OperatingMode operatingMode)
Sets processor operating mode directly into the entry point.
Definition: fcml_disassembler.hpp:332
fcml_bool is_rep
FCML_TRUE if rep explicit prefix exists.
Definition: fcml_disassembler.h:129
Operand is set by instruction.
Definition: fcml_common.h:418
void setCodeLength(fcml_usize codeLength)
Sets length of the code buffer in bytes.
Definition: fcml_disassembler.hpp:241
fcml_bool opcode_field_s_bit
Opcode field 's'.
Definition: fcml_disassembler.h:203
bool isThrowExceptionOnError() const
Returns true if exception should be thrown when disassembling fails.
Definition: fcml_disassembler.hpp:150
fcml_st_instruction instruction
Decoded instruction in its generic form.
Definition: fcml_disassembler.h:225
const fcml_uint8_t * getVexXopBytes() const
Gets the second and third bytes of the XOP/VEX prefix.
Definition: fcml_disassembler.hpp:453
void setPseudoOp(fcml_en_pseudo_operations pseudoOp)
Sets pseudo operation for the instruction.
Definition: fcml_disassembler.hpp:1478
void setPrefix(fcml_uint8_t prefix)
Sets the prefix byte.
Definition: fcml_disassembler.hpp:423
void setInstructionGroup(fcml_uint64_t instructionGroup)
Sets an instruction group.
Definition: fcml_disassembler.hpp:1288
C++ wrappers common classes.
Disassembler wrapper.
Definition: fcml_disassembler.hpp:1849
fcml_uint8_t vvvv
vvvv field of XOP or VEX prefix.
Definition: fcml_disassembler.h:157
Operand is read by instruction.
Definition: fcml_disassembler.hpp:1048
fcml_uint8_t vex_xop_first_byte
Various fields encoded inside decoded prefixes.
Definition: fcml_disassembler.h:143
void setIP(fcml_ip ip)
Sets a new instruction pointer for the entry point.
Definition: fcml_common.hpp:626
void setOperandSizeAttribute(fcml_usize operandSizeAttribute)
Sets a new operand size attribute for the entry point.
Definition: fcml_common.hpp:606
void setCode(fcml_ptr code)
Sets a new buffer with machine code for the context.
Definition: fcml_disassembler.hpp:221
void incrementIP(fcml_ip ip)
Increments entry point by given number of bytes.
Definition: fcml_disassembler.hpp:322
fcml_bool is_vex
FCML_TRUE if VEX prefix exists.
Definition: fcml_disassembler.h:137
void setCarryFlagConditionalSuffix(bool carryFlagConditionalSuffix)
Definition: fcml_disassembler.hpp:80
fcml_bool is_rip
True if RIP encoding is used by decoded instruction.
Definition: fcml_disassembler.h:175
void setInstructionSize(fcml_usize instructionSize)
Sets the instruction size in bytes.
Definition: fcml_disassembler.hpp:1308
void setEntryPoint(const EntryPoint &entryPoint)
Copies given entry point to the instance associated with the context.
Definition: fcml_disassembler.hpp:302
const DisassemblerConf & getDisassemblerConf() const
Gets a reference to the configuration object associated with the context.
Definition: fcml_disassembler.hpp:251
fcml_en_instruction
Instruction codes.
Definition: fcml_instructions.h:181
fcml_bool is_repne
FCML_TRUE if repne explicit prefix exists.
Definition: fcml_disassembler.h:131
void setRepne(bool isRepne)
Sets Repne prefix availability.
Definition: fcml_disassembler.hpp:656
void setW(fcml_uint8_t w)
Sets W flag.
Definition: fcml_disassembler.hpp:966
bool isVex() const
Gets true if Vex prefix is available.
Definition: fcml_disassembler.hpp:686
fcml_st_disassembler_conf configuration
Disassembler configuration.
Definition: fcml_disassembler.h:79
Nullable< fcml_uint8_t > & getModRM()
Gets ModR/M nullable byte.
Definition: fcml_disassembler.hpp:1150
bool isFailIfUnknownInstruction() const
Definition: fcml_disassembler.hpp:115
fcml_en_pseudo_operations
Pseudo operations.
Definition: fcml_instructions.h:1238
bool isOpcodeFieldWBit() const
Gets opcode field 'W'.
Definition: fcml_disassembler.hpp:1388
void setRip(bool isRip)
Sets RIP byte availability.
Definition: fcml_disassembler.hpp:1130
Contains some additional information about all decoded instruction prefixes.
Definition: fcml_disassembler.h:115
fcml_en_pseudo_operations pseudo_op
Pseudo operation code.
Definition: fcml_disassembler.h:211
fcml_uint8_t getPp() const
Gets PP field.
Definition: fcml_disassembler.hpp:806
fcml_st_instruction_details instruction_details
Additional disassembler specific information about decoded instruction.
Definition: fcml_disassembler.h:223
fcml_int prefixes_bytes_count
Number of bytes used by all decoded prefixes.
Definition: fcml_disassembler.h:121
void incrementIP(fcml_ip ip)
Increments the instruction pointer by given number of bytes.
Definition: fcml_common.hpp:656
Disassembler context.
Definition: fcml_disassembler.h:75
Converts objects to their structures counterparts.
Definition: fcml_disassembler.hpp:1677
void setL(fcml_uint8_t l)
Sets L flag.
Definition: fcml_disassembler.hpp:776
Definition: fcml_types.h:217
void setFailIfUnknownInstruction(bool failIfUnknownInstruction)
Definition: fcml_disassembler.hpp:120
const InstructionDetails & getInstructionDetails() const
Gets instruction details associated with the instruction.
Definition: fcml_disassembler.hpp:1597
DecodedModRMDetails()
Creates an empty ModR/M details.
Definition: fcml_disassembler.hpp:1108
Disassembler configuration.
Definition: fcml_disassembler.hpp:56
void setShortForms(bool shortForms)
Definition: fcml_disassembler.hpp:140
fcml_en_prefix_types
Available types of instruction prefixes.
Definition: fcml_disassembler.h:91
const InstructionPrefixDetails & operator[](fcml_usize index) const
Gets reference to the instruction prefix at given index.
Definition: fcml_disassembler.hpp:519
fcml_uint8_t w
W field of REX,XOP or VEX prefix.
Definition: fcml_disassembler.h:151
Additional details about an instruction.
Definition: fcml_disassembler.hpp:1206
fcml_uint64_t instruction_group
Instruction group.
Definition: fcml_disassembler.h:215
AccessMode getAccessMode() const
Gets access mode for the operand.
Definition: fcml_disassembler.hpp:1079
fcml_en_access_mode
Operand access mode.
Definition: fcml_common.h:412
PrefixesDetails & getPrefixesDetails()
Gets instruction prefixes details.
Definition: fcml_disassembler.hpp:1448
#define FCML_TEXT(x)
Used to code literal strings.
Definition: fcml_types.h:61
void setPrefixType(PrefixType prefixType)
Sets a new prefix type.
Definition: fcml_disassembler.hpp:443
fcml_bool is_nobranch
FCML_TRUE if nobranch prefix exists.
Definition: fcml_disassembler.h:125
LIB_EXPORT void LIB_CALL fcml_fn_disassembler_free(fcml_st_disassembler *disassembler)
Frees disassembler instance.
void setR(fcml_uint8_t r)
Sets R flag.
Definition: fcml_disassembler.hpp:906
void setXacquire(bool isXacquire)
Sets xacquire prefix availability.
Definition: fcml_disassembler.hpp:716
void setPrefixesBytesCount(fcml_int prefixesBytesCount)
Sets number of prefixes bytes available for the instruction.
Definition: fcml_disassembler.hpp:866
void setModRM(const Nullable< fcml_uint8_t > &modRM)
Sets ModR/M nullable byte.
Definition: fcml_disassembler.hpp:1160
bool isXop() const
Gets true if Xop prefix is available.
Definition: fcml_disassembler.hpp:726
fcml_en_instruction instruction
Instruction code/number.
Definition: fcml_disassembler.h:209
fcml_bool is_modrm
True if ModR/M exists.
Definition: fcml_disassembler.h:177
const ErrorContainer & getErrorContainer() const
Gets errors container with errors related to the failed disassembling process.
Definition: fcml_disassembler.hpp:1577
bool isNobranch() const
Gets true if no-branch prefix is available.
Definition: fcml_disassembler.hpp:606
Holds instruction pointer, processor operating mode and memory segment flags.
Definition: fcml_common.hpp:499
fcml_int prefixes_count
Number of decoded prefixes.
Definition: fcml_disassembler.h:119
fcml_bool is_pseudo_op
True if given instruction is a short form of pseudo-ops instructions.
Definition: fcml_disassembler.h:189
Base class for all exceptions that are aware of ErrorContainer.
Definition: fcml_errors.hpp:347
fcml_uint8_t getMmmm() const
Gets MMMM field.
Definition: fcml_disassembler.hpp:786
void setAddressSizeAttribute(fcml_usize addressSizeAttribute)
Sets a new address size attribute for the entry point.
Definition: fcml_common.hpp:586
fcml_bool is_xop
FCML_TRUE if XOP prefix exists.
Definition: fcml_disassembler.h:139
void setMmmm(fcml_uint8_t mmmm)
Sets MMMM field.
Definition: fcml_disassembler.hpp:796
PrefixType getPrefixType() const
Gets the prefix type.
Definition: fcml_disassembler.hpp:433
Disassembler configuration.
Definition: fcml_disassembler.h:53
void setOpcodeFieldSBit(bool opcodeFieldSBit)
Sets 'S' field of the opcode byte.
Definition: fcml_disassembler.hpp:1378
bool isShortForms() const
Definition: fcml_disassembler.hpp:135
fcml_usize getInstructionSize() const
Instruction size in bytes.
Definition: fcml_disassembler.hpp:1298
void setInstructionDetails(const InstructionDetails &instructionDetails)
Sets new instruction details for the disassembler.
Definition: fcml_disassembler.hpp:1630
bool isXrelease() const
Gets true if xrelease prefix is available.
Definition: fcml_disassembler.hpp:746
bool isXacquire() const
Gets true if xacquire prefix is available.
Definition: fcml_disassembler.hpp:706
Instruction prefix.
Definition: fcml_disassembler.hpp:370
fcml_ptr code
Pointer to the encoded instruction.
Definition: fcml_disassembler.h:83
fcml_bool increment_ip
Set to true in order to make disassembler to increment IP address by length of the disassembled instr...
Definition: fcml_disassembler.h:55
const OperandDetails & getOperandDetails(fcml_usize index) const
Gets the operand details for given index.
Definition: fcml_disassembler.hpp:1410
fcml_uint8_t getW() const
Gets W flag.
Definition: fcml_disassembler.hpp:956
void setOperandSizeAttribute(fcml_usize operandSizeAttribute)
Sets a new operand size attribute for the entry point.
Definition: fcml_disassembler.hpp:352
Some basic information about decoded ModR/M and SIB bytes.
Definition: fcml_disassembler.h:169
fcml_uint8_t l
L field of XOP or VEX prefix.
Definition: fcml_disassembler.h:153
Definition: fcml_assembler.hpp:39
Operand is read but can be also set.
Definition: fcml_disassembler.hpp:1052
void setModRmDetails(const DecodedModRMDetails &modRmDetails)
Sets a new instruction details for the instruction.
Definition: fcml_disassembler.hpp:1358
void setIncrementIp(bool incrementIp)
Definition: fcml_disassembler.hpp:130
virtual ~Disassembler()
Destructor.
Definition: fcml_disassembler.hpp:1871
void setVvvv(fcml_uint8_t vvvv)
Sets VVVV field of the XOP/VEX prefix.
Definition: fcml_disassembler.hpp:946
fcml_uint8_t getConditionalGroup() const
Definition: fcml_disassembler.hpp:85
bool isPseudoOp() const
Gets true is it's a pseudo operation.
Definition: fcml_disassembler.hpp:1488
fcml_uint8_t getVvvv() const
Gets VVVV field of the XOP/VEX prefix.
Definition: fcml_disassembler.hpp:936
#define FCML_OPERANDS_COUNT
Maximal number of the instruction operands.
Definition: fcml_common.h:35
fcml_bool enable_error_messages
True if optional error and warning messages should be collected during processing.
Definition: fcml_disassembler.h:57
fcml_uint8_t getL() const
Gets L flag.
Definition: fcml_disassembler.hpp:766
DisassemblerContext(fcml_ptr code, fcml_usize codeLength)
Creates disassembler context for given piece of machine code.
Definition: fcml_disassembler.hpp:198
void setBranch(bool isBranch)
Sets branch prefix availability.
Definition: fcml_disassembler.hpp:576
Some additional disassembler specific information about decoded operands.
Definition: fcml_disassembler.h:163
Component can not be initialized correctly.
Definition: fcml_disassembler.hpp:44
const DecodedModRMDetails & getModRmDetails() const
Gets ModR/M instruction details.
Definition: fcml_disassembler.hpp:1338
Inherit from this class in order to get access to the native FCML dialect structure.
Definition: fcml_dialect.hpp:97
EntryPoint & getEntryPoint()
Gets reference to the entry point instance associated with the context.
Definition: fcml_disassembler.hpp:291
Used mainly in case of integers and offsets.
Definition: fcml_errors.h:54
fcml_ptr getCode() const
Gets pointer to the machine code buffer.
Definition: fcml_disassembler.hpp:211
DisassemblerConf & getDisassemblerConf()
Gets a reference to the configuration object associated with the context.
Definition: fcml_disassembler.hpp:261
Operand is set by instruction.
Definition: fcml_disassembler.hpp:1050
bool isBranch() const
Gets true if branch prefix is available.
Definition: fcml_disassembler.hpp:566
const PrefixesDetails & getPrefixesDetails() const
Gets instruction prefixes details.
Definition: fcml_disassembler.hpp:1438
void setVexXopFirstByte(fcml_uint8_t vexXopFirstByte)
Sets a first byte of the XOP/VEX prefix.
Definition: fcml_disassembler.hpp:926
Structures and functions declarations related to FCML disassembler.
void setXrelease(bool isXrelease)
Sets xrelease prefix availability.
Definition: fcml_disassembler.hpp:756
fcml_bool extend_disp_to_asa
True if displacement should be sign extended to effective address size; otherwise false...
Definition: fcml_disassembler.h:67
void setEnableErrorMessages(bool enableErrorMessages)
Definition: fcml_disassembler.hpp:100
void setB(fcml_uint8_t b)
Sets B flag.
Definition: fcml_disassembler.hpp:556
fcml_int getPrefixesCount() const
Gets number of prefixes available for the instruction.
Definition: fcml_disassembler.hpp:876
bool isMandatoryPrefix() const
Returns true if it's a mandatory prefix.
Definition: fcml_disassembler.hpp:393
fcml_st_decoded_modrm_details modrm_details
Details about decoded ModR/M and SIB bytes.
Definition: fcml_disassembler.h:199
void setLock(bool isLock)
Sets lock prefix availability.
Definition: fcml_disassembler.hpp:596
ModRM details.
Definition: fcml_disassembler.hpp:1101
fcml_uint64_t getInstructionGroup() const
Gets instruction group.
Definition: fcml_disassembler.hpp:1278
Disassembler(Dialect &dialect)
Creates a disassembler instance for the given dialect.
Definition: fcml_disassembler.hpp:1859
Instruction & getInstructionInternal()
Gets mutable instruction.
Definition: fcml_disassembler.hpp:1639
fcml_uint8_t prefix
Prefix itself as raw byte.
Definition: fcml_disassembler.h:105
OperandDetails()
Creates default operand details with an undefined access mode.
Definition: fcml_disassembler.hpp:1059
fcml_bool fail_if_unknown_instruction
If set to true assembler will return FCML_CEH_GEC_UNKNOWN_INSTRUCTION error code if instruction is no...
Definition: fcml_disassembler.h:71
fcml_bool short_forms
Set to true in order to use short forms.
Definition: fcml_disassembler.h:65
fcml_int64_t fcml_ip
General instruction pointer holder.
Definition: fcml_common.h:95
const fcml_uint8_t * getInstructionCode() const
Gets a pointer to the instruction code.
Definition: fcml_disassembler.hpp:1258
void setAddrMode(fcml_uint16_t addrMode)
Sets instruction form.
Definition: fcml_disassembler.hpp:1228
bool isEnableErrorMessages() const
Definition: fcml_disassembler.hpp:95
OperandDetails & getOperandDetails(fcml_usize index)
Gets the operand details for given index.
Definition: fcml_disassembler.hpp:1425
fcml_en_prefix_types prefix_type
Type of the prefix.
Definition: fcml_disassembler.h:107
PrefixType
Type of the instruction prefix.
Definition: fcml_disassembler.hpp:376
fcml_uint8_t getX() const
Gets X flag.
Definition: fcml_disassembler.hpp:976
fcml_uint8_t vex_xop_bytes[2]
Place for additional bytes of VEX/XOP prefix.
Definition: fcml_disassembler.h:111
Reusable disassembler result holder.
Definition: fcml_disassembler.h:219
C++ wrapper for the base dialect.
DisassemblerConf()
Default constructor.
Definition: fcml_disassembler.hpp:63
Operand is read by instruction.
Definition: fcml_common.h:416
void setDisassemblerConf(DisassemblerConf disassemblerConf)
Sets a new disassembler configuration for the context.
Definition: fcml_disassembler.hpp:271
fcml_st_entry_point entry_point
Instruction entry point configuration.
Definition: fcml_disassembler.h:81
void setAddressSizeAttribute(fcml_usize addressSizeAttribute)
Sets a new address size attribute for the entry point.
Definition: fcml_disassembler.hpp:342
Dialect & getDialect() const
Gets dialect associated with the disassembler.
Definition: fcml_disassembler.hpp:1945
LIB_EXPORT void LIB_CALL fcml_fn_disassembler_result_free(fcml_st_disassembler_result *result)
Cleans result holder.
Describes one decoded prefix.
Definition: fcml_disassembler.h:103
fcml_ceh_error disassemble(DisassemblerContext &ctx, DisassemblerResult &disassemblerResult)
Disassembled the next instruction from the context.
Definition: fcml_disassembler.hpp:1889
OperatingMode
Supported operating modes.
Definition: fcml_common.hpp:506
bool isOpcodeFieldSBit() const
Gets opcode field 'S'.
Definition: fcml_disassembler.hpp:1368
void setNobranch(bool isNobranch)
Sets no-branch prefix availability.
Definition: fcml_disassembler.hpp:616
fcml_bool mandatory_prefix
FCML_TRUE if prefix is treated as mandatory one.
Definition: fcml_disassembler.h:109
LIB_EXPORT void LIB_CALL fcml_fn_disassembler_result_prepare(fcml_st_disassembler_result *result)
Prepares reusable result holder for disassembler.
void setPrefixesDetails(const PrefixesDetails &prefixesDetails)
Sets a new instruction prefixes details.
Definition: fcml_disassembler.hpp:1458
InstructionDetails & getInstructionDetails()
Gets mutable instruction details.
Definition: fcml_disassembler.hpp:1621
fcml_bool is_branch
FCML_TRUE if branch prefix exists.
Definition: fcml_disassembler.h:123
fcml_bool is_rex
FCML_TRUE if REX prefix exists.
Definition: fcml_disassembler.h:141
Prefixes details.
Definition: fcml_disassembler.hpp:481
Disassembler result.
Definition: fcml_disassembler.hpp:1567
fcml_uint16_t addr_mode
Code of the instruction form/addressing mode of the instruction above.
Definition: fcml_disassembler.h:213
fcml_usize getCodeLength() const
Gets length of the buffer in bytes.
Definition: fcml_disassembler.hpp:231
Undefined mode.
Definition: fcml_common.h:414
fcml_uint8_t conditional_group
There are two groups of suffixes for conditional instructions, you can choose which one should be use...
Definition: fcml_disassembler.h:61
fcml_st_prefixes_details prefixes_details
Some additional information about decoded instruction prefixes.
Definition: fcml_disassembler.h:195
Wraps multiple errors into one component.
Definition: fcml_errors.hpp:148
bool isRip() const
Gets true if RIP byte is available.
Definition: fcml_disassembler.hpp:1120
fcml_bool is_shortcut
True if this is a shortcut.
Definition: fcml_disassembler.h:187
fcml_st_disassembler * disassembler
Disassembler used to decode instructions.
Definition: fcml_disassembler.h:77
InstructionPrefixDetails & getPrefixes(fcml_usize index)
Gets a reference to the prefix of the given index.
Definition: fcml_disassembler.hpp:843
void setShortcut(bool isShortcut)
Marks the instruction as a shortcut.
Definition: fcml_disassembler.hpp:1328
void setRex(bool isRex)
Sets REX prefix availability.
Definition: fcml_disassembler.hpp:676
AccessMode
Definition: fcml_disassembler.hpp:1044
bool isShortcut() const
Gets true if it's a shortcut instruction.
Definition: fcml_disassembler.hpp:1318
fcml_uint8_t r
R field of REX,XOP or VEX prefix.
Definition: fcml_disassembler.h:145
void setOpMode(OperatingMode opMode)
Sets a new processor operating mode for the entry point.
Definition: fcml_common.hpp:646
Describes an instruction.
Definition: fcml_common.hpp:6207
void setInstruction(const Instruction &instruction)
Sets a new instruction for the result.
Definition: fcml_disassembler.hpp:1648
fcml_uint8_t getPrefix() const
Gets the prefix byte.
Definition: fcml_disassembler.hpp:413
#define FCML_INSTRUCTION_SIZE
Maximal number of bytes instruction can use.
Definition: fcml_common.h:37
fcml_usize code_length
Size of the code in the buffer above.
Definition: fcml_disassembler.h:85
void setExtendDispToAsa(bool extendDispToAsa)
Definition: fcml_disassembler.hpp:110
#define FCML_DASM_PREFIXES_COUNT
Maximal number of instruction prefixes.
Definition: fcml_disassembler.h:42
void setXop(bool isXop)
Sets Xop prefix availability.
Definition: fcml_disassembler.hpp:736
const EntryPoint & getEntryPoint() const
Gets reference to the constant entry point instance associated with the context.
Definition: fcml_disassembler.hpp:281
fcml_bool opcode_field_w_bit
Opcode field 'w'.
Definition: fcml_disassembler.h:207
bool isLock() const
Gets true if lock prefix is available.
Definition: fcml_disassembler.hpp:586
Operation succeed.
Definition: fcml_errors.h:42
void clean()
Cleans all errors and warnings.
Definition: fcml_errors.hpp:296
void setErrorContainer(const ErrorContainer &errorContainer)
Sets error container.
Definition: fcml_disassembler.hpp:1657
fcml_uint8_t x
X field of REX,XOP or VEX prefix.
Definition: fcml_disassembler.h:147
fcml_uint8_t getR() const
Gets R flag.
Definition: fcml_disassembler.hpp:896
void setPp(fcml_uint8_t pp)
Sets PP field.
Definition: fcml_disassembler.hpp:816
fcml_uint8_t modrm
ModR/M byte if exists.
Definition: fcml_disassembler.h:171
void setSib(const Nullable< fcml_uint8_t > &sib)
Sets SIB nullable byte.
Definition: fcml_disassembler.hpp:1190
fcml_uint8_t getVexXopFirstByte() const
Gets the first byte of the VEX/XOP prefix.
Definition: fcml_disassembler.hpp:916
fcml_st_ceh_error_container errors
All errors and warnings messages going here.
Definition: fcml_disassembler.h:221
Bad arguments.
Definition: fcml_common.hpp:217
Disassembler context.
Definition: fcml_disassembler.hpp:179
bool isCarryFlagConditionalSuffix() const
Definition: fcml_disassembler.hpp:75
const InstructionPrefixDetails & getPrefixes(fcml_usize index) const
Gets a reference to the prefix of the given index.
Definition: fcml_disassembler.hpp:828
void setThrowExceptionOnError(bool throwExceptionOnError)
Sets the way how the error handling is done.
Definition: fcml_disassembler.hpp:160
fcml_nuint8_t sib
SIB byte if exists.
Definition: fcml_disassembler.h:173
OperandDetails(AccessMode accessMode)
Creates operand details for given access mode.
Definition: fcml_disassembler.hpp:1069
fcml_bool carry_flag_conditional_suffix
True if suffixes for carry flag has to be used by disassembler.
Definition: fcml_disassembler.h:59
An abstract dialect.
Definition: fcml_dialect.hpp:41
Renderer wrapper.
Definition: fcml_renderer.hpp:160
void setOpcodeFieldWBit(bool opcodeFieldWBit)
Sets 'W' field of the opcode byte.
Definition: fcml_disassembler.hpp:1398
fcml_uint8_t * getInstructionCode()
Gets a pointer to the instruction code.
Definition: fcml_disassembler.hpp:1268
Undefined mode.
Definition: fcml_disassembler.hpp:1046
void setConditionalGroup(fcml_uint8_t conditionalGroup)
Definition: fcml_disassembler.hpp:90
Operand details.
Definition: fcml_disassembler.hpp:1040
void setVex(bool isVex)
Sets VEX prefix availability.
Definition: fcml_disassembler.hpp:696
fcml_bool is_xrelease
FCML_TRUE if xrelease explicit prefix exists.
Definition: fcml_disassembler.h:133
void setIP(fcml_ip ip)
Sets instruction pointer directly into the entry point.
Definition: fcml_disassembler.hpp:312
const Nullable< fcml_uint8_t > & getSib() const
Gets SIB nullable byte.
Definition: fcml_disassembler.hpp:1170
fcml_usize instruction_size
Instruction size in bytes.
Definition: fcml_disassembler.h:193
fcml_uint8_t * getVexXopBytes()
Gets the second and third bytes of the XOP/VEX prefix.
Definition: fcml_disassembler.hpp:463
fcml_st_dialect * extractDialect(const Dialect &dialect) const
Extracts the native FCML dialect from the dialect object.
Definition: fcml_dialect.hpp:119
fcml_bool is_lock
FCML_TRUE if lock explicit prefix exists.
Definition: fcml_disassembler.h:127
void setInstruction(fcml_en_instruction instruction)
Gets a new instruction code for the instruction.
Definition: fcml_disassembler.hpp:1248
const Instruction & getInstruction() const
Gets errors container with errors related to the failed disassembling process.
Definition: fcml_disassembler.hpp:1587
fcml_uint8_t getB() const
Gets b flag.
Definition: fcml_disassembler.hpp:546
InstructionPrefixDetails & operator[](fcml_usize index)
Gets reference to the instruction prefix at given index.
Definition: fcml_disassembler.hpp:533
void setRep(bool isRep)
Sets Rep prefix availability.
Definition: fcml_disassembler.hpp:636
ErrorContainerAwareException(const fcml_cstring &msg, const ErrorContainer &errorContainer, fcml_ceh_error error=FCML_CEH_GEC_NO_ERROR)
Creates an error container aware exception instance and sets basic information for it...
Definition: fcml_errors.hpp:357
fcml_uint8_t b
B field of REX,XOP or VEX prefix.
Definition: fcml_disassembler.h:149
Component can not be initialized correctly.
Definition: fcml_common.hpp:206
struct fcml_st_disassembler fcml_st_disassembler
This structure and type declaration represents an abstract disassembler.
Definition: fcml_disassembler.h:50
LIB_EXPORT fcml_ceh_error LIB_CALL fcml_fn_disassembler_init(const fcml_st_dialect *dialect, fcml_st_disassembler **disassembler)
Initializes disassembler instance.
Additional instruction details provided by disassembler.
Definition: fcml_disassembler.h:181
bool isRep() const
Gets true if Rep prefix is available.
Definition: fcml_disassembler.hpp:626
Nullable< fcml_uint8_t > & getSib()
Gets SIB nullable byte.
Definition: fcml_disassembler.hpp:1180
fcml_uint16_t fcml_ceh_error
All error codes should be held in variables of this type.
Definition: fcml_errors.h:139
fcml_int getPrefixesBytesCount() const
Gets number of bytes interpreted to be prefixes.
Definition: fcml_disassembler.hpp:856
bool isExtendDispToAsa() const
Definition: fcml_disassembler.hpp:105
bool isIncrementIp() const
Definition: fcml_disassembler.hpp:125
fcml_uint16_t getAddrMode() const
Gets address mode/instruction form.
Definition: fcml_disassembler.hpp:1218
void setMandatoryPrefix(bool mandatoryPrefix)
Sets mandatory prefix flag for the prefix.
Definition: fcml_disassembler.hpp:403
Object which shouldn't be copied can inherit from this class.
Definition: fcml_common.hpp:263
fcml_en_instruction getInstruction() const
Gets instruction code.
Definition: fcml_disassembler.hpp:1238
fcml_en_pseudo_operations getPseudoOp() const
Gets pseudo operation code.
Definition: fcml_disassembler.hpp:1468
C++ wrapper for the FCML errors handling.
Illegal argument exception.
Definition: fcml_common.hpp:239
void setPrefixesCount(fcml_int prefixesCount)
Sets number of prefixes available for the instruction.
Definition: fcml_disassembler.hpp:886
LIB_EXPORT fcml_ceh_error LIB_CALL fcml_fn_disassemble(fcml_st_disassembler_context *context, fcml_st_disassembler_result *result)
Disassembles one instruction from provided code buffer.
PrefixesDetails()
Default constructor.
Definition: fcml_disassembler.hpp:488
const Nullable< fcml_uint8_t > & getModRM() const
Gets ModR/M nullable byte.
Definition: fcml_disassembler.hpp:1140
fcml_st_operand_details operand_details[FCML_OPERANDS_COUNT]
All disassembler specific information about operands going there.
Definition: fcml_disassembler.h:197
fcml_uint8_t pp
pp field of XOP or VEX prefix.
Definition: fcml_disassembler.h:159
fcml_st_instruction_prefix prefixes[FCML_DASM_PREFIXES_COUNT]
Array with decoded prefixes.
Definition: fcml_disassembler.h:117