You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
661 lines
27 KiB
661 lines
27 KiB
/*
|
|
* FCML - Free Code Manipulation Library.
|
|
* Copyright (C) 2010-2019 Slawomir Wojtasiak
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
/** @file fcml_common_utils.h
|
|
*
|
|
* Common general purpose utility functions.
|
|
*
|
|
* @copyright Copyright (C) 2010-2017 Slawomir Wojtasiak. All rights reserved.
|
|
* This project is released under the GNU Lesser General Public License.
|
|
*/
|
|
|
|
#ifndef FCML_COMMON_UTILS_H_
|
|
#define FCML_COMMON_UTILS_H_
|
|
|
|
#include "fcml_lib_export.h"
|
|
|
|
#include "fcml_common.h"
|
|
#include "fcml_assembler.h"
|
|
#include "fcml_disassembler.h"
|
|
#include "fcml_instructions.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @defgroup REG_STRUCTURES_GROUP Registers
|
|
* Declarations of structures describing all available registers.
|
|
* @{
|
|
*/
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_AL;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_AX;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_EAX;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_RAX;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_MM0;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM0;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM0;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM0;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_CL;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_CX;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ECX;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_RCX;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_MM1;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM1;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM1;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM1;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_DL;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_DX;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_EDX;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_RDX;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_MM2;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM2;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM2;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM2;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_BL;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_BX;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_EBX;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_RBX;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_MM3;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM3;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM3;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM3;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_AH;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_SPL;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_SP;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ESP;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_RSP;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_MM4;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM4;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM4;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM4;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_CH;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_BPL;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_BP;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_EBP;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_RBP;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_MM5;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM5;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM5;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM5;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_DH;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_SIL;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_SI;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ESI;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_RSI;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_MM6;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM6;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM6;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM6;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_BH;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_DIL;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_DI;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_EDI;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_RDI;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_MM7;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM7;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM7;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM7;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R8L;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R8W;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R8D;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R8;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM8;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM8;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM8;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R9L;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R9W;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R9D;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R9;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM9;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM9;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM9;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R10L;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R10W;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R10D;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R10;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM10;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM10;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM10;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R11L;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R11W;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R11D;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R11;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM11;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM11;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM11;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R12L;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R12W;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R12D;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R12;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM12;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM12;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM12;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R13L;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R13W;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R13D;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R13;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM13;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM13;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM13;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R14L;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R14W;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R14D;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R14;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM14;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM14;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM14;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R15L;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R15W;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R15D;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_R15;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM15;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM15;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM15;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM16;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM16;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM16;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM17;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM17;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM17;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM18;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM18;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM18;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM19;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM19;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM19;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM20;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM20;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM20;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM21;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM21;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM21;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM22;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM22;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM22;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM23;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM23;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM23;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM24;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM24;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM24;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM25;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM25;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM25;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM26;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM26;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM26;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM27;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM27;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM27;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM28;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM28;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM28;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM29;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM29;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM29;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM30;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM30;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM30;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_XMM31;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_YMM31;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM31;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ES;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_CS;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_SS;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_DS;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_FS;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_GS;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ST0;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ST1;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ST2;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ST3;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ST4;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ST5;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ST6;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_ST7;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_CR0;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_CR2;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_CR3;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_CR4;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_CR8;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_DR0;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_DR1;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_DR2;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_DR3;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_DR4;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_DR5;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_DR6;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_DR7;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_K0;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_K1;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_K2;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_K3;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_K4;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_K5;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_K6;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_K7;
|
|
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_IP;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_EIP;
|
|
extern LIB_EXPORT fcml_st_register fcml_reg_RIP;
|
|
|
|
/** @} */
|
|
|
|
/** Prepares register operand for given register.
|
|
* @param reg Register for instruction operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_reg(
|
|
fcml_st_register *reg);
|
|
|
|
/* IMM.*/
|
|
|
|
/** Prepares immediate operand for unsigned int8.
|
|
* @param value Value for immediate operand.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_unsigned_imm_8(
|
|
fcml_uint8_t value);
|
|
/** Prepares immediate operand for signed int8.
|
|
* @param value Value for immediate operand.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_signed_imm_8(
|
|
fcml_int8_t value);
|
|
/** Prepares immediate operand for unsigned int16.
|
|
* @param value Value for immediate operand.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_unsigned_imm_16(
|
|
fcml_uint16_t value);
|
|
/** Prepares immediate operand for signed int16.
|
|
* @param value Value for immediate operand.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_signed_imm_16(
|
|
fcml_int16_t value);
|
|
/** Prepares immediate operand for unsigned int32.
|
|
* @param value Value for immediate operand.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_unsigned_imm_32(
|
|
fcml_uint32_t value);
|
|
/** Prepares immediate operand for signed int32.
|
|
* @param value Value for immediate operand.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_signed_imm_32(
|
|
fcml_int32_t value);
|
|
/** Prepares immediate operand for unsigned int64.
|
|
* @param value Value for immediate operand.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_unsigned_imm_64(
|
|
fcml_uint64_t value);
|
|
/** Prepares immediate operand for signed int64.
|
|
* @param value Value for immediate operand.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_signed_imm_64(
|
|
fcml_int64_t value);
|
|
|
|
/* Memory addressing.*/
|
|
|
|
/** Prepares far pointer operand for given segment and offset.
|
|
* @param seg 16-bit code segment.
|
|
* @param offset 16-bit code offset.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_far_pointer_offset16(
|
|
fcml_int16_t seg, fcml_int16_t offset);
|
|
/** Prepares far pointer operand for given segment and offset.
|
|
* @param seg 16-bit code segment.
|
|
* @param offset 32-bit code offset.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_far_pointer_offset32(
|
|
fcml_int16_t seg, fcml_int32_t offset);
|
|
/** Prepares memory addressing operand for 16-bit absolute offset.
|
|
* @param offset 16-bit absolute offset.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_offset_16(
|
|
fcml_int16_t offset, fcml_usize size_operator);
|
|
/** Prepares memory addressing operand for 32-bit absolute offset.
|
|
* @param offset 32-bit absolute offset.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_offset_32(
|
|
fcml_int32_t offset, fcml_usize size_operator);
|
|
/** Prepares memory addressing operand for 64-bit absolute offset. Function
|
|
* sets operand level hint: FCML_OP_HINT_ABSOLUTE_ADDRESSING.
|
|
* @param offset 64-bit absolute offset.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
* @see RIP addressing.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_offset_abs_64(
|
|
fcml_int64_t offset, fcml_usize size_operator);
|
|
/** Prepares memory addressing operand for 64-bit absolute offset. Function
|
|
* sets operand level hint: FCML_OP_HINT_RELATIVE_ADDRESSING.
|
|
* @param offset 64-bit absolute offset.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
* @see RIP addressing.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_offset_rel_64(
|
|
fcml_int64_t offset, fcml_usize size_operator);
|
|
/** Prepares effective memory addressing operand for 16-bit displacement.
|
|
* @param disp 16-bit displacement.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_disp_16(
|
|
fcml_int16_t disp, fcml_usize size_operator);
|
|
/** Prepares effective memory addressing operand for 32-bit displacement.
|
|
* @param disp 32-bit displacement.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_disp_32(
|
|
fcml_int32_t disp, fcml_usize size_operator);
|
|
/** Prepares effective memory addressing operand for 64-bit displacement.
|
|
* @param disp 64-bit displacement.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_disp_64(
|
|
fcml_int64_t disp, fcml_usize size_operator);
|
|
/** Prepares effective memory addressing operand for 8-bit displacement
|
|
* and base register.
|
|
* @param base Base register.
|
|
* @param disp 8-bit displacement.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_b_disp_8(
|
|
fcml_st_register *base, fcml_int8_t disp, fcml_usize size_operator);
|
|
/** Prepares effective memory addressing operand for 16-bit displacement
|
|
* and base register.
|
|
* @param base Base register.
|
|
* @param disp 16-bit displacement.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_b_disp_16(
|
|
fcml_st_register *base, fcml_int16_t disp, fcml_usize size_operator);
|
|
/** Prepares effective memory addressing operand for 32-bit displacement
|
|
* and base register.
|
|
* @param base Base register.
|
|
* @param disp 32-bit displacement.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_b_disp_32(
|
|
fcml_st_register *base, fcml_int32_t disp, fcml_usize size_operator);
|
|
/** Prepares effective memory addressing operand for 64-bit displacement
|
|
* and base register.
|
|
* @param base Base register.
|
|
* @param disp 64-bit displacement.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_b_disp_64(
|
|
fcml_st_register *base, fcml_int64_t disp, fcml_usize size_operator);
|
|
/** Prepares effective memory addressing operand for 8-bit displacement,
|
|
* scale factor and index register.
|
|
* @param index Index register.
|
|
* @param scale_factor Scale factor.
|
|
* @param disp 8-bit displacement.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_is_disp_8(
|
|
fcml_st_register *index, fcml_uint8_t scale_factor, fcml_int8_t disp,
|
|
fcml_usize size_operator);
|
|
/** Prepares effective memory addressing operand for 16-bit displacement,
|
|
* scale factor and index register.
|
|
* @param index Index register.
|
|
* @param scale_factor Scale factor.
|
|
* @param disp 16-bit displacement.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_is_disp_32(
|
|
fcml_st_register *index, fcml_uint8_t scale_factor, fcml_int32_t disp,
|
|
fcml_usize size_operator);
|
|
/** Prepares effective memory addressing operand for 32-bit displacement,
|
|
* scale factor and index register.
|
|
* @param index Index register.
|
|
* @param scale_factor Scale factor.
|
|
* @param disp 32-bit displacement.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_is_disp_64(
|
|
fcml_st_register *index, fcml_uint8_t scale_factor, fcml_int64_t disp,
|
|
fcml_usize size_operator);
|
|
/** Prepares effective memory addressing operand for 8-bit displacement,
|
|
* base register, scale factor and index register.
|
|
* @param base Base register.
|
|
* @param index Index register.
|
|
* @param scale_factor Scale factor.
|
|
* @param disp 8-bit displacement.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_bis_disp_8(
|
|
fcml_st_register *base, fcml_st_register *index,
|
|
fcml_uint8_t scale_factor, fcml_int8_t disp, fcml_usize size_operator);
|
|
/** Prepares effective memory addressing operand for 16-bit displacement,
|
|
* base register, scale factor and index register.
|
|
* @param base Base register.
|
|
* @param index Index register.
|
|
* @param scale_factor Scale factor.
|
|
* @param disp 16-bit displacement.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_bis_disp_32(
|
|
fcml_st_register *base, fcml_st_register *index,
|
|
fcml_uint8_t scale_factor, fcml_int32_t disp, fcml_usize size_operator);
|
|
/** Prepares effective memory addressing operand for 32-bit displacement,
|
|
* base register, scale factor and index register.
|
|
* @param base Base register.
|
|
* @param index Index register.
|
|
* @param scale_factor Scale factor.
|
|
* @param disp 32-bit displacement.
|
|
* @param size_operator Size operator.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_bis_disp_64(
|
|
fcml_st_register *base, fcml_st_register *index,
|
|
fcml_uint8_t scale_factor, fcml_int64_t disp, fcml_usize size_operator);
|
|
|
|
/** Adds hints to the operand.
|
|
* @param operand Operand for hints.
|
|
* @param hints Hints mask.
|
|
* @return Prepared operand.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_add_operand_hints(
|
|
fcml_st_operand operand, fcml_hints hints);
|
|
|
|
/** Clones given instruction.
|
|
* Allocates new instance of instruction and makes a deep copy of
|
|
* all fields. Remember that cloned instructions have to be freed
|
|
* using fcml_fn_cu_free_instruction() function. Do not try to free
|
|
* it on your own because it might be allocated on different
|
|
* dedicated memory heap.
|
|
* @param instruction Instruction to be cloned.
|
|
* @return Cloned instruction.
|
|
*/
|
|
LIB_EXPORT fcml_st_instruction* LIB_CALL fcml_fn_cu_clone_instruction(
|
|
fcml_st_instruction *instruction);
|
|
|
|
/** Frees given instruction.
|
|
* Frees instruction allocated by fcml_fn_cu_clone_instruction() function.
|
|
* @param instruction Instruction to be freed.
|
|
*/
|
|
LIB_EXPORT void LIB_CALL fcml_fn_cu_free_instruction(
|
|
fcml_st_instruction *instruction);
|
|
|
|
/** Gets operand of given type or NULL if there is no such operand.
|
|
* If more than one operand of given type exist, the first one is returned.
|
|
* @param instruction Finds an operand of the given type for for
|
|
* given instruction.
|
|
* @param operand_type Operand type.
|
|
* @return Pointer to the operand of given type.
|
|
*/
|
|
LIB_EXPORT fcml_st_operand* fcml_fn_cu_find_operand(
|
|
fcml_st_instruction *instruction, fcml_en_operand_type operand_type);
|
|
|
|
/* Some shortcuts for those who prefer to use macros instead of functions.*/
|
|
|
|
#define FCML_IMM8_S( x ) fcml_fn_cu_operand_signed_imm_8( x )
|
|
#define FCML_IMM8( x ) fcml_fn_cu_operand_unsigned_imm_8( x )
|
|
#define FCML_IMM16_S( x ) fcml_fn_cu_operand_signed_imm_16( x )
|
|
#define FCML_IMM16( x ) fcml_fn_cu_operand_unsigned_imm_16( x )
|
|
#define FCML_IMM32_S( x ) fcml_fn_cu_operand_signed_imm_32( x )
|
|
#define FCML_IMM32( x ) fcml_fn_cu_operand_unsigned_imm_32( x )
|
|
#define FCML_IMM64_S( x ) fcml_fn_cu_operand_signed_imm_64( x )
|
|
#define FCML_IMM64( x ) fcml_fn_cu_operand_unsigned_imm_64( x )
|
|
|
|
#ifdef FCML_USE_SHORT_REG
|
|
#define FCML_REG( x ) fcml_fn_cu_operand_reg( &fcml_reg_##x )
|
|
#else
|
|
#define FCML_REG( x ) fcml_fn_cu_operand_reg( &x )
|
|
#endif
|
|
|
|
#define FCML_FAR_POINTER_16( seg, offset ) \
|
|
fcml_fn_cu_operand_addr_far_pointer_offset16( seg, offset )
|
|
#define FCML_FAR_POINTER_32( seg, offset ) \
|
|
fcml_fn_cu_operand_addr_far_pointer_offset32( seg, offset )
|
|
#define FCML_OFFSET_16( offset ) \
|
|
fcml_fn_cu_operand_addr_offset_16( offset )
|
|
#define FCML_OFFSET_32( offset ) \
|
|
fcml_fn_cu_operand_addr_offset_32( offset )
|
|
#define FCML_OFFSET_ABS_64( offset ) \
|
|
fcml_fn_cu_operand_addr_offset_abs_64( offset )
|
|
#define FCML_OFFSET_REL_64( offset ) \
|
|
fcml_fn_cu_operand_addr_offset_rel_64( offset )
|
|
#define FCML_DISP_16( offset ) \
|
|
fcml_fn_cu_operand_addr_disp_16( offset )
|
|
#define FCML_DISP_32( offset ) \
|
|
fcml_fn_cu_operand_addr_disp_32( offset )
|
|
#define FCML_DISP_64( offset ) \
|
|
fcml_fn_cu_operand_addr_disp_64( offset )
|
|
|
|
#ifdef FCML_USE_SHORT_REG
|
|
#define FCML_B_DISP_8(base, offset) \
|
|
fcml_fn_cu_operand_addr_b_disp_8( &fcml_reg_##base, offset )
|
|
#define FCML_B_DISP_16(base, offset) \
|
|
fcml_fn_cu_operand_addr_b_disp_16( &fcml_reg_##base, offset )
|
|
#define FCML_B_DISP_32(base, offset) \
|
|
fcml_fn_cu_operand_addr_b_disp_32( &fcml_reg_##base, offset )
|
|
#define FCML_B_DISP_64(base, offset) \
|
|
fcml_fn_cu_operand_addr_b_disp_64( &fcml_reg_##base, offset )
|
|
#define FCML_IS_DISP_8(index, scale, offset) \
|
|
fcml_fn_cu_operand_addr_is_disp_8( &fcml_reg_##index, scale, offset )
|
|
#define FCML_IS_DISP_16(index, scale, offset) \
|
|
fcml_fn_cu_operand_addr_is_disp_32( &fcml_reg_##index, scale, offset )
|
|
#define FCML_IS_DISP_32(index, scale, offset) \
|
|
fcml_fn_cu_operand_addr_is_disp_64( &fcml_reg_##index, scale, offset )
|
|
#define FCML_BIS_DISP_8(base, index, scale, offset) \
|
|
fcml_fn_cu_operand_addr_bis_disp_8( &fcml_reg_##base, &fcml_reg_##index, \
|
|
scale, offset )
|
|
#define FCML_BIS_DISP_16(base, index, scale, offset) \
|
|
fcml_fn_cu_operand_addr_bis_disp_32( &fcml_reg_##base, &fcml_reg_##index, \
|
|
scale, offset )
|
|
#define FCML_BIS_DISP_32(base, index, scale, offset) \
|
|
fcml_fn_cu_operand_addr_bis_disp_64( &fcml_reg_##base, &fcml_reg_##index, \
|
|
scale, offset )
|
|
#else
|
|
#define FCML_B_DISP_8(base, offset) \
|
|
fcml_fn_cu_operand_addr_b_disp_8( &base, offset )
|
|
#define FCML_B_DISP_16(base, offset) \
|
|
fcml_fn_cu_operand_addr_b_disp_16( &base, offset )
|
|
#define FCML_B_DISP_32(base, offset) \
|
|
fcml_fn_cu_operand_addr_b_disp_32( &base, offset )
|
|
#define FCML_B_DISP_64(base, offset) \
|
|
fcml_fn_cu_operand_addr_b_disp_64( &base, offset )
|
|
#define FCML_IS_DISP_8(index, scale, offset) \
|
|
fcml_fn_cu_operand_addr_is_disp_8( &index, scale, offset )
|
|
#define FCML_IS_DISP_16(index, scale, offset) \
|
|
fcml_fn_cu_operand_addr_is_disp_32( &index, scale, offset )
|
|
#define FCML_IS_DISP_32(index, scale, offset) \
|
|
fcml_fn_cu_operand_addr_is_disp_64( &index, scale, offset )
|
|
#define FCML_BIS_DISP_8(base, index, scale, offset) \
|
|
fcml_fn_cu_operand_addr_bis_disp_8( &base, &index, scale, offset )
|
|
#define FCML_BIS_DISP_16(base, index, scale, offset) \
|
|
fcml_fn_cu_operand_addr_bis_disp_32( &base, &index, scale, offset )
|
|
#define FCML_BIS_DISP_32(base, index, scale, offset) \
|
|
fcml_fn_cu_operand_addr_bis_disp_64( &base, &index, scale, offset )
|
|
#endif
|
|
|
|
#define FCML_IS_INSTRUCTION_GROUP(result, group) \
|
|
( result.instruction_details.instruction_group & ( group ) )
|
|
#define FCML_IS_INSTRUCTION_CODE(result, _ins) \
|
|
( result.instruction_details.instruction == _ins )
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* FCML_COMMON_UTILS_H_ */
|