📄 disassembler.h
字号:
/****************************************************************************** * * Copyright (c) 2003 Gerhard W. Gruber * * PROJECT: pICE * $Source: /cvsroot/pice/pice/module/disassembler.h,v $ * $Revision: 1.3 $ * $Date: 2004/02/17 23:07:36 $ * $Author: lightweave $ * $Name: $ * * $Log: disassembler.h,v $ * Revision 1.3 2004/02/17 23:07:36 lightweave * * Improved the DEBUG facillity and replaced the configuration handler with a * new code which now can read MS Windows INI style files. See CHANGES.txt for * more details. * Also added a macro which prevents compiling for kernels before 2.4.19. * * Revision 1.2 2003/06/18 22:00:22 lightweave * DEBUG and DEBUG_SERIAL added * * *****************************************************************************/#ifndef _DISASSMEBLER_H#define _DISASSMEBLER_H /* Operand and instruction types */#define OP_REG 0x100 /* register */#define OP_IMM 0x200 /* immediate value */#define OP_IND 0x300 /* indirect memory reference */#define OP_BPTR 0x400 /* BYTE Pointer */#define OP_WPTR 0x500 /* WORD Pointer */#define OP_DPTR 0x600 /* DWORD Pointer */#define OP_UNK 0x900 //#define INS_INVALID 0x00 /* Not a valid instruction */ /* Branch Instruction types */#define INS_BRANCH 0x01 /* Unconditional branch */#define INS_COND 0x02 /* Conditional branch */#define INS_SUB 0x04 /* Jump to subroutine */#define INS_RET 0x08 /* Return from subroutine */ /* modify ( 'w' ) instructions */#define INS_ARITH 0x10 /* Arithmetic inst */#define INS_LOGIC 0x20 /* logical inst */#define INS_FPU 0x40 /* Floating Point inst */#define INS_FLAG 0x80 /* Modify flags */ /* misc Instruction Types */#define INS_MOVE 0x0100#define INS_ARRAY 0x0200 /* String and XLAT ops */#define INS_PTR 0x0400 /* Load EA/pointer */#define INS_STACK 0x1000 /* PUSH, POP, etc */#define INS_FRAME 0x2000 /* ENTER, LEAVE, etc */#define INS_SYSTEM 0x4000 /* CPUID, WBINVD, etc *//* Other info */#define BIG_ENDIAN_ORDER 0#define LITTLE_ENDIAN_ORDER 1struct code { /* size 100 */ unsigned long rva; unsigned short flags; char mnemonic[16]; char dest[32]; char src[32]; char aux[32]; int mnemType; int destType; int srcType; int auxType;};/* struct used in Init routine */struct CPU_TYPE{ char vendor; char model[12];};#define cpu_80386 0x01#define cpu_80486 0x02#define cpu_PENTIUM 0x04#define cpu_PENTMMX 0x08#define cpu_PENTPRO 0x10#define cpu_PENTIUM2 0x20#define cpu_PENTIUM3 0x40#define cpu_PENTIUM4 0x80#define FLAGS_MODRM 0x00001 //contains mod r/m byte#define FLAGS_8BIT 0x00002 //force 8-bit arguments#define FLAGS_16BIT 0x00004 //force 16-bit arguments#define FLAGS_32BIT 0x00008 //force 32-bit arguments#define FLAGS_REAL 0x00010 //real mode only#define FLAGS_PMODE 0x00020 //protected mode only#define FLAGS_PREFIX 0x00040 //for lock and rep prefix#define FLAGS_MMX 0x00080 //mmx instruction/registers#define FLAGS_FPU 0x00100 //fpu instruction/registers#define FLAGS_CJMP 0x00200 //codeflow - conditional jump#define FLAGS_JMP 0x00400 //codeflow - jump#define FLAGS_IJMP 0x00800 //codeflow - indexed jump#define FLAGS_CALL 0x01000 //codeflow - call#define FLAGS_ICALL 0x02000 //codeflow - indexed call#define FLAGS_RET 0x04000 //codeflow - return#define FLAGS_SEGPREFIX 0x08000 //segment prefix#define FLAGS_OPERPREFIX 0x10000 //operand prefix#define FLAGS_ADDRPREFIX 0x20000 //address prefix#define FLAGS_OMODE16 0x40000 //16-bit operand mode only#define FLAGS_OMODE32 0x80000 //32-bit operand mode onlyenum argtype { ARG_REG=1,ARG_IMM,ARG_NONE,ARG_MODRM,ARG_REG_AX, ARG_REG_ES,ARG_REG_CS,ARG_REG_SS,ARG_REG_DS,ARG_REG_FS,ARG_REG_GS,ARG_REG_BX, ARG_REG_CX,ARG_REG_DX, ARG_REG_SP,ARG_REG_BP,ARG_REG_SI,ARG_REG_DI,ARG_IMM8,ARG_RELIMM8,ARG_FADDR,ARG_REG_AL, ARG_MEMLOC,ARG_SREG,ARG_RELIMM,ARG_16REG_DX,ARG_REG_CL,ARG_REG_DL,ARG_REG_BL,ARG_REG_AH, ARG_REG_CH,ARG_REG_DH,ARG_REG_BH,ARG_MODREG,ARG_CREG,ARG_DREG,ARG_TREG_67,ARG_TREG, ARG_MREG,ARG_MMXMODRM,ARG_MODRM8,ARG_IMM_1,ARG_MODRM_FPTR,ARG_MODRM_S,ARG_MODRMM512, ARG_MODRMQ,ARG_MODRM_SREAL,ARG_REG_ST0,ARG_FREG,ARG_MODRM_PTR,ARG_MODRM_WORD,ARG_MODRM_SINT, ARG_MODRM_EREAL,ARG_MODRM_DREAL,ARG_MODRM_WINT,ARG_MODRM_LINT,ARG_REG_BC,ARG_REG_DE, ARG_REG_HL,ARG_REG_DE_IND,ARG_REG_HL_IND,ARG_REG_BC_IND,ARG_REG_SP_IND,ARG_REG_A, ARG_REG_B,ARG_REG_C,ARG_REG_D,ARG_REG_E,ARG_REG_H,ARG_REG_L,ARG_IMM16,ARG_REG_AF, ARG_REG_AF2,ARG_MEMLOC16,ARG_IMM8_IND,ARG_BIT,ARG_REG_IX,ARG_REG_IX_IND,ARG_REG_IY, ARG_REG_IY_IND,ARG_REG_C_IND,ARG_REG_I,ARG_REG_R,ARG_IMM16_A,ARG_MODRM16,ARG_SIMM8, ARG_IMM32,ARG_STRING,ARG_MODRM_BCD,ARG_PSTRING,ARG_DOSSTRING,ARG_CUNICODESTRING, ARG_PUNICODESTRING,ARG_NONEBYTE,ARG_XREG,ARG_XMMMODRM}; typedef struct x86_inst { int flags; int destType, srcType, auxType; int cpu_type; int inst_type; char *mnem; char *dest, *src, *aux;} instr;#define GENREG_8 0x0001#define GENREG_16 0x0002#define GENREG_32 0x0004#define SEGREG 0x0008#define MMXREG 0x0010#define SIMDREG 0x0020#define DEBUGREG 0x0040#define CONTROLREG 0x0080#define TESTREG 0x0100#define NO_REG 0x100#define DIRECT_REG 0x200#define NO_BASE 0x400#define NO_INDEX 0x800#define DISP8 0x1000#define DISP32 0x2000#define HAS_SIB 0x4000#define HAS_MODRM 0x8000 struct OPERAND { //arg1, arg2, arg3 char * str; //temporary buffer for building arg text int type; //argument type int * flag; //pointer to CODE arg flags char * text; //pointer to CODE arg text};struct EA { //effective address [SIB/disp] int mode, flags; int mod, rm, reg; long disp; char sib[32];};struct modRM_byte { unsigned int mod : 2; unsigned int reg : 3; unsigned int rm : 3;};struct SIB_byte { unsigned int scale : 2; unsigned int index : 3; unsigned int base : 3;};typedef struct x86_table { //Assembly instruction tables instr *table; //Pointer to table of instruction encodings char divisor; // number to divide by for look up char mask; // bit mask for look up char minlim,maxlim; // limits on min/max entries. char modrmpos; // modrm byte position plus} asmtable;#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -