1 /* Operand and instruction types */
2 #define OP_REG 0x100 /* register */
3 #define OP_IMM 0x200 /* immediate value */
4 #define OP_IND 0x300 /* indirect memory reference */
5 #define OP_BPTR 0x400 /* BYTE Pointer */
6 #define OP_WPTR 0x500 /* WORD Pointer */
7 #define OP_DPTR 0x600 /* DWORD Pointer */
9 //#define INS_INVALID 0x00 /* Not a valid instruction */
10 /* Branch Instruction types */
11 #define INS_BRANCH 0x01 /* Unconditional branch */
12 #define INS_COND 0x02 /* Conditional branch */
13 #define INS_SUB 0x04 /* Jump to subroutine */
14 #define INS_RET 0x08 /* Return from subroutine */
15 /* modify ( 'w' ) instructions */
16 #define INS_ARITH 0x10 /* Arithmetic inst */
17 #define INS_LOGIC 0x20 /* logical inst */
18 #define INS_FPU 0x40 /* Floating Point inst */
19 #define INS_FLAG 0x80 /* Modify flags */
20 /* misc Instruction Types */
21 #define INS_MOVE 0x0100
22 #define INS_ARRAY 0x0200 /* String and XLAT ops */
23 #define INS_PTR 0x0400 /* Load EA/pointer */
24 #define INS_STACK 0x1000 /* PUSH, POP, etc */
25 #define INS_FRAME 0x2000 /* ENTER, LEAVE, etc */
26 #define INS_SYSTEM 0x4000 /* CPUID, WBINVD, etc */
29 #define BIG_ENDIAN_ORDER 0
30 #define LITTLE_ENDIAN_ORDER 1
32 struct code
{ /* size 100 */
45 /* struct used in Init routine */
51 #define cpu_80386 0x01
52 #define cpu_80486 0x02
53 #define cpu_PENTIUM 0x04
54 #define cpu_PENTMMX 0x08
55 #define cpu_PENTPRO 0x10
56 #define cpu_PENTIUM2 0x20
57 #define cpu_PENTIUM3 0x40
58 #define cpu_PENTIUM4 0x80
60 #define FLAGS_MODRM 0x00001 //contains mod r/m byte
61 #define FLAGS_8BIT 0x00002 //force 8-bit arguments
62 #define FLAGS_16BIT 0x00004 //force 16-bit arguments
63 #define FLAGS_32BIT 0x00008 //force 32-bit arguments
64 #define FLAGS_REAL 0x00010 //real mode only
65 #define FLAGS_PMODE 0x00020 //protected mode only
66 #define FLAGS_PREFIX 0x00040 //for lock and rep prefix
67 #define FLAGS_MMX 0x00080 //mmx instruction/registers
68 #define FLAGS_FPU 0x00100 //fpu instruction/registers
69 #define FLAGS_CJMP 0x00200 //codeflow - conditional jump
70 #define FLAGS_JMP 0x00400 //codeflow - jump
71 #define FLAGS_IJMP 0x00800 //codeflow - indexed jump
72 #define FLAGS_CALL 0x01000 //codeflow - call
73 #define FLAGS_ICALL 0x02000 //codeflow - indexed call
74 #define FLAGS_RET 0x04000 //codeflow - return
75 #define FLAGS_SEGPREFIX 0x08000 //segment prefix
76 #define FLAGS_OPERPREFIX 0x10000 //operand prefix
77 #define FLAGS_ADDRPREFIX 0x20000 //address prefix
78 #define FLAGS_OMODE16 0x40000 //16-bit operand mode only
79 #define FLAGS_OMODE32 0x80000 //32-bit operand mode only
82 ARG_REG
=1,ARG_IMM
,ARG_NONE
,ARG_MODRM
,ARG_REG_AX
,
83 ARG_REG_ES
,ARG_REG_CS
,ARG_REG_SS
,ARG_REG_DS
,ARG_REG_FS
,ARG_REG_GS
,ARG_REG_BX
,
84 ARG_REG_CX
,ARG_REG_DX
,
85 ARG_REG_SP
,ARG_REG_BP
,ARG_REG_SI
,ARG_REG_DI
,ARG_IMM8
,ARG_RELIMM8
,ARG_FADDR
,ARG_REG_AL
,
86 ARG_MEMLOC
,ARG_SREG
,ARG_RELIMM
,ARG_16REG_DX
,ARG_REG_CL
,ARG_REG_DL
,ARG_REG_BL
,ARG_REG_AH
,
87 ARG_REG_CH
,ARG_REG_DH
,ARG_REG_BH
,ARG_MODREG
,ARG_CREG
,ARG_DREG
,ARG_TREG_67
,ARG_TREG
,
88 ARG_MREG
,ARG_MMXMODRM
,ARG_MODRM8
,ARG_IMM_1
,ARG_MODRM_FPTR
,ARG_MODRM_S
,ARG_MODRMM512
,
89 ARG_MODRMQ
,ARG_MODRM_SREAL
,ARG_REG_ST0
,ARG_FREG
,ARG_MODRM_PTR
,ARG_MODRM_WORD
,ARG_MODRM_SINT
,
90 ARG_MODRM_EREAL
,ARG_MODRM_DREAL
,ARG_MODRM_WINT
,ARG_MODRM_LINT
,ARG_REG_BC
,ARG_REG_DE
,
91 ARG_REG_HL
,ARG_REG_DE_IND
,ARG_REG_HL_IND
,ARG_REG_BC_IND
,ARG_REG_SP_IND
,ARG_REG_A
,
92 ARG_REG_B
,ARG_REG_C
,ARG_REG_D
,ARG_REG_E
,ARG_REG_H
,ARG_REG_L
,ARG_IMM16
,ARG_REG_AF
,
93 ARG_REG_AF2
,ARG_MEMLOC16
,ARG_IMM8_IND
,ARG_BIT
,ARG_REG_IX
,ARG_REG_IX_IND
,ARG_REG_IY
,
94 ARG_REG_IY_IND
,ARG_REG_C_IND
,ARG_REG_I
,ARG_REG_R
,ARG_IMM16_A
,ARG_MODRM16
,ARG_SIMM8
,
95 ARG_IMM32
,ARG_STRING
,ARG_MODRM_BCD
,ARG_PSTRING
,ARG_DOSSTRING
,ARG_CUNICODESTRING
,
96 ARG_PUNICODESTRING
,ARG_NONEBYTE
,ARG_XREG
,ARG_XMMMODRM
};
98 typedef struct x86_inst
{
100 int destType
, srcType
, auxType
;
104 char *dest
, *src
, *aux
;
108 #define GENREG_8 0x0001
109 #define GENREG_16 0x0002
110 #define GENREG_32 0x0004
111 #define SEGREG 0x0008
112 #define MMXREG 0x0010
113 #define SIMDREG 0x0020
114 #define DEBUGREG 0x0040
115 #define CONTROLREG 0x0080
116 #define TESTREG 0x0100
119 #define DIRECT_REG 0x200
120 #define NO_BASE 0x400
121 #define NO_INDEX 0x800
123 #define DISP32 0x2000
124 #define HAS_SIB 0x4000
125 #define HAS_MODRM 0x8000
127 struct OPERAND
{ //arg1, arg2, arg3
128 char * str
; //temporary buffer for building arg text
129 int type
; //argument type
130 int * flag
; //pointer to CODE arg flags
131 char * text
; //pointer to CODE arg text
134 struct EA
{ //effective address [SIB/disp]
142 unsigned int mod
: 2;
143 unsigned int reg
: 3;
148 unsigned int scale
: 2;
149 unsigned int index
: 3;
150 unsigned int base
: 3;
153 typedef struct x86_table
{ //Assembly instruction tables
154 instr
*table
; //Pointer to table of instruction encodings
155 char divisor
; // number to divide by for look up
156 char mask
; // bit mask for look up
157 char minlim
,maxlim
; // limits on min/max entries.
158 char modrmpos
; // modrm byte position plus