313 lines
7.6 KiB
C
313 lines
7.6 KiB
C
#pragma once
|
|
/* Machine registers */
|
|
enum eReg
|
|
{
|
|
rUNDEF = 0,
|
|
rAX = 1, /* These are numbered relative to real 8086 */
|
|
rCX = 2,
|
|
rDX = 3,
|
|
rBX = 4,
|
|
rSP = 5,
|
|
rBP = 6,
|
|
rSI = 7,
|
|
rDI = 8,
|
|
|
|
rES = 9,
|
|
rCS = 10,
|
|
rSS = 11,
|
|
rDS = 12,
|
|
|
|
rAL = 13,
|
|
rCL = 14,
|
|
rDL = 15,
|
|
rBL = 16,
|
|
rAH = 17,
|
|
rCH = 18,
|
|
rDH = 19,
|
|
rBH = 20,
|
|
|
|
rTMP= 21, /* temp register for DIV/IDIV/MOD */
|
|
INDEXBASE = 22 /* Indexed modes go from INDEXBASE to INDEXBASE+7 */
|
|
};
|
|
|
|
/* Register types */
|
|
enum regType
|
|
{
|
|
BYTE_REG,
|
|
WORD_REG
|
|
};
|
|
enum condId
|
|
{
|
|
GLOB_VAR, /* global variable */
|
|
REGISTER, /* register */
|
|
LOCAL_VAR, /* negative disp */
|
|
PARAM, /* positive disp */
|
|
GLOB_VAR_IDX, /* indexed global variable *//*** should merge w/glob-var*/
|
|
CONSTANT, /* constant */
|
|
STRING, /* string */
|
|
LONG_VAR, /* long variable */
|
|
FUNCTION, /* function */
|
|
OTHER /* other **** tmp solution */
|
|
};
|
|
|
|
enum condOp
|
|
{
|
|
/* For conditional expressions */
|
|
LESS_EQUAL, /* <= */
|
|
LESS, /* < */
|
|
EQUAL, /* == */
|
|
NOT_EQUAL, /* != */
|
|
GREATER, /* > */
|
|
GREATER_EQUAL, /* >= */
|
|
/* For general expressions */
|
|
AND, /* & */
|
|
OR, /* | */
|
|
XOR, /* ^ */
|
|
NOT, /* ~ */ /* 1's complement */
|
|
ADD, /* + */
|
|
SUB, /* - */
|
|
MUL, /* * */
|
|
DIV, /* / */
|
|
SHR, /* >> */
|
|
SHL, /* << */
|
|
MOD, /* % */
|
|
DBL_AND, /* && */
|
|
DBL_OR, /* || */
|
|
DUMMY /* */
|
|
};
|
|
/* LOW_LEVEL operand location: source or destination */
|
|
enum opLoc
|
|
{
|
|
SRC, /* Source operand */
|
|
DST, /* Destination operand */
|
|
LHS_OP /* Left-hand side operand (for HIGH_LEVEL) */
|
|
};
|
|
/* LOW_LEVEL icode flags */
|
|
#define NO_SRC_B 0xF7FFFF /* Masks off SRC_B */
|
|
enum eLLFlags
|
|
{
|
|
|
|
B =0x0000001, /* uint8_t operands (value implicitly used) */
|
|
I =0x0000002, /* Immed. source */
|
|
NOT_HLL =0x0000004, /* Not HLL inst. */
|
|
FLOAT_OP =0x0000008, /* ESC or WAIT */
|
|
SEG_IMMED =0x0000010, /* Number is relocated segment value */
|
|
IMPURE =0x0000020, /* Instruction modifies code */
|
|
WORD_OFF =0x0000040, /* Inst has uint16_t offset ie.could be address */
|
|
TERMINATES =0x0000080, /* Instruction terminates program */
|
|
CASE =0x0000100, /* Label as case part of switch */
|
|
SWITCH =0x0000200, /* Treat indirect JMP as switch stmt */
|
|
TARGET =0x0000400, /* Jump target */
|
|
SYNTHETIC =0x0000800, /* Synthetic jump instruction */
|
|
NO_LABEL =0x0001000, /* Immed. jump cannot be linked to a label */
|
|
NO_CODE =0x0002000, /* Hole in Icode array */
|
|
SYM_USE =0x0004000, /* Instruction uses a symbol */
|
|
SYM_DEF =0x0008000, /* Instruction defines a symbol */
|
|
NO_SRC =0x0010000, /* Opcode takes no source */
|
|
NO_OPS =0x0020000, /* Opcode takes no operands */
|
|
IM_OPS =0x0040000, /* Opcode takes implicit operands */
|
|
SRC_B =0x0080000, /* Source operand is uint8_t (dest is uint16_t) */
|
|
HLL_LABEL =0x0100000, /* Icode has a high level language label */
|
|
IM_DST =0x0200000, /* Implicit DST for opcode (SIGNEX) */
|
|
IM_SRC =0x0400000, /* Implicit SRC for opcode (dx:ax) */
|
|
IM_TMP_DST =0x0800000, /* Implicit rTMP DST for opcode (DIV/IDIV) */
|
|
JMP_ICODE =0x1000000, /* Jmp dest immed.op converted to icode index */
|
|
JX_LOOP =0x2000000, /* Cond jump is part of loop conditional exp */
|
|
REST_STK =0x4000000 /* Stack needs to be restored after CALL */
|
|
};
|
|
/* Types of icodes */
|
|
enum icodeType
|
|
{
|
|
NOT_SCANNED = 0, // not even scanned yet
|
|
LOW_LEVEL, // low-level icode
|
|
HIGH_LEVEL // high-level icode
|
|
};
|
|
|
|
|
|
/* LOW_LEVEL icode opcodes */
|
|
enum llIcode
|
|
{
|
|
//iINVALID,
|
|
iCBW, /* 0 */
|
|
iAAA,
|
|
iAAD,
|
|
iAAM,
|
|
iAAS,
|
|
iADC,
|
|
iADD,
|
|
iAND,
|
|
iBOUND,
|
|
iCALL,
|
|
iCALLF, /* 10 */
|
|
iCLC,
|
|
iCLD,
|
|
iCLI,
|
|
iCMC,
|
|
iCMP,
|
|
iCMPS,
|
|
iREPNE_CMPS,
|
|
iREPE_CMPS,
|
|
iDAA,
|
|
iDAS, /* 20 */
|
|
iDEC,
|
|
iDIV,
|
|
iENTER,
|
|
iESC,
|
|
iHLT,
|
|
iIDIV,
|
|
iIMUL,
|
|
iIN,
|
|
iINC,
|
|
iINS, /* 30 */
|
|
iREP_INS,
|
|
iINT,
|
|
iIRET,
|
|
iJB,
|
|
iJBE,
|
|
iJAE,
|
|
iJA,
|
|
iJE,
|
|
iJNE,
|
|
iJL, /* 40 */
|
|
iJGE,
|
|
iJLE,
|
|
iJG,
|
|
iJS,
|
|
iJNS,
|
|
iJO,
|
|
iJNO,
|
|
iJP,
|
|
iJNP,
|
|
iJCXZ, /* 50 */
|
|
iJMP,
|
|
iJMPF,
|
|
iLAHF,
|
|
iLDS,
|
|
iLEA,
|
|
iLEAVE,
|
|
iLES,
|
|
iLOCK,
|
|
iLODS,
|
|
iREP_LODS, /* 60 */
|
|
iLOOP,
|
|
iLOOPE,
|
|
iLOOPNE,
|
|
iMOV, /* 64 */
|
|
iMOVS,
|
|
iREP_MOVS,
|
|
iMUL, /* 67 */
|
|
iNEG,
|
|
iNOT,
|
|
iOR, /* 70 */
|
|
iOUT,
|
|
iOUTS,
|
|
iREP_OUTS,
|
|
iPOP,
|
|
iPOPA,
|
|
iPOPF,
|
|
iPUSH,
|
|
iPUSHA,
|
|
iPUSHF,
|
|
iRCL, /* 80 */
|
|
iRCR,
|
|
iROL,
|
|
iROR,
|
|
iRET, /* 84 */
|
|
iRETF,
|
|
iSAHF,
|
|
iSAR,
|
|
iSHL,
|
|
iSHR,
|
|
iSBB, /* 90 */
|
|
iSCAS,
|
|
iREPNE_SCAS,
|
|
iREPE_SCAS,
|
|
iSIGNEX,
|
|
iSTC,
|
|
iSTD,
|
|
iSTI,
|
|
iSTOS,
|
|
iREP_STOS,
|
|
iSUB, /* 100 */
|
|
iTEST,
|
|
iWAIT,
|
|
iXCHG,
|
|
iXLAT,
|
|
iXOR,
|
|
iINTO,
|
|
iNOP,
|
|
iREPNE,
|
|
iREPE,
|
|
iMOD /* 110 */
|
|
};
|
|
/* Conditional Expression enumeration nodes and operators */
|
|
enum condNodeType
|
|
{
|
|
UNKNOWN_OP=0,
|
|
BOOLEAN_OP, /* condOps */
|
|
NEGATION, /* not (2's complement) */
|
|
ADDRESSOF, /* addressOf (&) */
|
|
DEREFERENCE, /* contents of (*) */
|
|
IDENTIFIER, /* {register | local | param | constant | global} */
|
|
/* The following are only available to C programs */
|
|
POST_INC, /* ++ (post increment) */
|
|
POST_DEC, /* -- (post decrement) */
|
|
PRE_INC, /* ++ (pre increment) */
|
|
PRE_DEC /* -- (pre decrement) */
|
|
} ;
|
|
|
|
/* Enumeration to determine whether pIcode points to the high or low part
|
|
* of a long number */
|
|
enum hlFirst
|
|
{
|
|
HIGH_FIRST, /* High value is first */
|
|
LOW_FIRST /* Low value is first */
|
|
};
|
|
/* HIGH_LEVEL icodes opcodes */
|
|
enum hlIcode
|
|
{
|
|
HLI_INVALID,
|
|
HLI_ASSIGN, /* := */
|
|
HLI_CALL, /* Call procedure */
|
|
HLI_JCOND, /* Conditional jump */
|
|
HLI_RET, /* Return from procedure */
|
|
/* pseudo high-level icodes */
|
|
HLI_POP, /* Pop expression */
|
|
HLI_PUSH /* Push expression */
|
|
} ;
|
|
/* Type definitions used in the decompiled program */
|
|
enum hlType
|
|
{
|
|
TYPE_UNKNOWN = 0, /* unknown so far */
|
|
TYPE_BYTE_SIGN, /* signed byte (8 bits) */
|
|
TYPE_BYTE_UNSIGN, /* unsigned byte */
|
|
TYPE_WORD_SIGN, /* signed word (16 bits) */
|
|
TYPE_WORD_UNSIGN, /* unsigned word (16 bits) */
|
|
TYPE_LONG_SIGN, /* signed long (32 bits) */
|
|
TYPE_LONG_UNSIGN, /* unsigned long (32 bits) */
|
|
TYPE_RECORD, /* record structure */
|
|
TYPE_PTR, /* pointer (32 bit ptr) */
|
|
TYPE_STR, /* string */
|
|
TYPE_CONST, /* constant (any type) */
|
|
TYPE_FLOAT, /* floating point */
|
|
TYPE_DOUBLE /* double precision float */
|
|
};
|
|
|
|
/* Operand is defined, used or both flag */
|
|
enum operDu
|
|
{
|
|
eDEF=0x10, /* Operand is defined */
|
|
eUSE=0x100, /* Operand is used */
|
|
USE_DEF, /* Operand is used and defined */
|
|
NONE /* No operation is required on this operand */
|
|
};
|
|
|
|
/* LOW_LEVEL icode, DU flag bits */
|
|
enum eDuFlags
|
|
{
|
|
Cf=1,
|
|
Sf=2,
|
|
Zf=4,
|
|
Df=8
|
|
};
|