📄 db_disasm.cxx
字号:
"sbb", "and", "sub", "xor", "cmp"};char * db_Grp2[] = { "rol", "ror", "rcl", "rcr", "shl", "shr", "shl", "sar"};struct inst db_Grp3[] = { { "test", true, NONE, op2(I,E), 0 }, { "test", true, NONE, op2(I,E), 0 }, { "not", true, NONE, op1(E), 0 }, { "neg", true, NONE, op1(E), 0 }, { "mul", true, NONE, op2(E,A), 0 }, { "imul", true, NONE, op2(E,A), 0 }, { "div", true, NONE, op2(E,A), 0 }, { "idiv", true, NONE, op2(E,A), 0 },};struct inst db_Grp4[] = { { "inc", true, BYTE, op1(E), 0 }, { "dec", true, BYTE, op1(E), 0 }, { "", true, NONE, 0, 0 }, { "", true, NONE, 0, 0 }, { "", true, NONE, 0, 0 }, { "", true, NONE, 0, 0 }, { "", true, NONE, 0, 0 }, { "", true, NONE, 0, 0 }};struct inst db_Grp5[] = { { "inc", true, LONG, op1(E), 0 }, { "dec", true, LONG, op1(E), 0 }, { "call", true, NONE, op1(Eind),0 }, { "lcall", true, NONE, op1(Eind),0 }, { "jmp", true, NONE, op1(Eind),0 }, { "ljmp", true, NONE, op1(Eind),0 }, { "push", true, LONG, op1(E), 0 }, { "", true, NONE, 0, 0 }};struct inst db_inst_table[256] = {/*00*/ { "add", true, BYTE, op2(R, E), 0 },/*01*/ { "add", true, LONG, op2(R, E), 0 },/*02*/ { "add", true, BYTE, op2(E, R), 0 },/*03*/ { "add", true, LONG, op2(E, R), 0 },/*04*/ { "add", false, BYTE, op2(Is, A), 0 },/*05*/ { "add", false, LONG, op2(Is, A), 0 },/*06*/ { "push", false, NONE, op1(Si), 0 },/*07*/ { "pop", false, NONE, op1(Si), 0 },/*08*/ { "or", true, BYTE, op2(R, E), 0 },/*09*/ { "or", true, LONG, op2(R, E), 0 },/*0a*/ { "or", true, BYTE, op2(E, R), 0 },/*0b*/ { "or", true, LONG, op2(E, R), 0 },/*0c*/ { "or", false, BYTE, op2(I, A), 0 },/*0d*/ { "or", false, LONG, op2(I, A), 0 },/*0e*/ { "push", false, NONE, op1(Si), 0 },/*0f*/ { "", false, NONE, 0, 0 },/*10*/ { "adc", true, BYTE, op2(R, E), 0 },/*11*/ { "adc", true, LONG, op2(R, E), 0 },/*12*/ { "adc", true, BYTE, op2(E, R), 0 },/*13*/ { "adc", true, LONG, op2(E, R), 0 },/*14*/ { "adc", false, BYTE, op2(Is, A), 0 },/*15*/ { "adc", false, LONG, op2(Is, A), 0 },/*16*/ { "push", false, NONE, op1(Si), 0 },/*17*/ { "pop", false, NONE, op1(Si), 0 },/*18*/ { "sbb", true, BYTE, op2(R, E), 0 },/*19*/ { "sbb", true, LONG, op2(R, E), 0 },/*1a*/ { "sbb", true, BYTE, op2(E, R), 0 },/*1b*/ { "sbb", true, LONG, op2(E, R), 0 },/*1c*/ { "sbb", false, BYTE, op2(Is, A), 0 },/*1d*/ { "sbb", false, LONG, op2(Is, A), 0 },/*1e*/ { "push", false, NONE, op1(Si), 0 },/*1f*/ { "pop", false, NONE, op1(Si), 0 },/*20*/ { "and", true, BYTE, op2(R, E), 0 },/*21*/ { "and", true, LONG, op2(R, E), 0 },/*22*/ { "and", true, BYTE, op2(E, R), 0 },/*23*/ { "and", true, LONG, op2(E, R), 0 },/*24*/ { "and", false, BYTE, op2(I, A), 0 },/*25*/ { "and", false, LONG, op2(I, A), 0 },/*26*/ { "", false, NONE, 0, 0 },/*27*/ { "aaa", false, NONE, 0, 0 },/*28*/ { "sub", true, BYTE, op2(R, E), 0 },/*29*/ { "sub", true, LONG, op2(R, E), 0 },/*2a*/ { "sub", true, BYTE, op2(E, R), 0 },/*2b*/ { "sub", true, LONG, op2(E, R), 0 },/*2c*/ { "sub", false, BYTE, op2(Is, A), 0 },/*2d*/ { "sub", false, LONG, op2(Is, A), 0 },/*2e*/ { "", false, NONE, 0, 0 },/*2f*/ { "das", false, NONE, 0, 0 },/*30*/ { "xor", true, BYTE, op2(R, E), 0 },/*31*/ { "xor", true, LONG, op2(R, E), 0 },/*32*/ { "xor", true, BYTE, op2(E, R), 0 },/*33*/ { "xor", true, LONG, op2(E, R), 0 },/*34*/ { "xor", false, BYTE, op2(I, A), 0 },/*35*/ { "xor", false, LONG, op2(I, A), 0 },/*36*/ { "", false, NONE, 0, 0 },/*37*/ { "daa", false, NONE, 0, 0 },/*38*/ { "cmp", true, BYTE, op2(R, E), 0 },/*39*/ { "cmp", true, LONG, op2(R, E), 0 },/*3a*/ { "cmp", true, BYTE, op2(E, R), 0 },/*3b*/ { "cmp", true, LONG, op2(E, R), 0 },/*3c*/ { "cmp", false, BYTE, op2(Is, A), 0 },/*3d*/ { "cmp", false, LONG, op2(Is, A), 0 },/*3e*/ { "", false, NONE, 0, 0 },/*3f*/ { "aas", false, NONE, 0, 0 },/*40*/ { "inc", false, LONG, op1(Ri), 0 },/*41*/ { "inc", false, LONG, op1(Ri), 0 },/*42*/ { "inc", false, LONG, op1(Ri), 0 },/*43*/ { "inc", false, LONG, op1(Ri), 0 },/*44*/ { "inc", false, LONG, op1(Ri), 0 },/*45*/ { "inc", false, LONG, op1(Ri), 0 },/*46*/ { "inc", false, LONG, op1(Ri), 0 },/*47*/ { "inc", false, LONG, op1(Ri), 0 },/*48*/ { "dec", false, LONG, op1(Ri), 0 },/*49*/ { "dec", false, LONG, op1(Ri), 0 },/*4a*/ { "dec", false, LONG, op1(Ri), 0 },/*4b*/ { "dec", false, LONG, op1(Ri), 0 },/*4c*/ { "dec", false, LONG, op1(Ri), 0 },/*4d*/ { "dec", false, LONG, op1(Ri), 0 },/*4e*/ { "dec", false, LONG, op1(Ri), 0 },/*4f*/ { "dec", false, LONG, op1(Ri), 0 },/*50*/ { "push", false, LONG, op1(Ri), 0 },/*51*/ { "push", false, LONG, op1(Ri), 0 },/*52*/ { "push", false, LONG, op1(Ri), 0 },/*53*/ { "push", false, LONG, op1(Ri), 0 },/*54*/ { "push", false, LONG, op1(Ri), 0 },/*55*/ { "push", false, LONG, op1(Ri), 0 },/*56*/ { "push", false, LONG, op1(Ri), 0 },/*57*/ { "push", false, LONG, op1(Ri), 0 },/*58*/ { "pop", false, LONG, op1(Ri), 0 },/*59*/ { "pop", false, LONG, op1(Ri), 0 },/*5a*/ { "pop", false, LONG, op1(Ri), 0 },/*5b*/ { "pop", false, LONG, op1(Ri), 0 },/*5c*/ { "pop", false, LONG, op1(Ri), 0 },/*5d*/ { "pop", false, LONG, op1(Ri), 0 },/*5e*/ { "pop", false, LONG, op1(Ri), 0 },/*5f*/ { "pop", false, LONG, op1(Ri), 0 },/*60*/ { "pusha", false, LONG, 0, 0 },/*61*/ { "popa", false, LONG, 0, 0 },/*62*/ { "bound", true, LONG, op2(E, R), 0 },/*63*/ { "arpl", true, NONE, op2(Ew,Rw), 0 },/*64*/ { "", false, NONE, 0, 0 },/*65*/ { "", false, NONE, 0, 0 },/*66*/ { "", false, NONE, 0, 0 },/*67*/ { "", false, NONE, 0, 0 },/*68*/ { "push", false, LONG, op1(I), 0 },/*69*/ { "imul", true, LONG, op3(I,E,R), 0 },/*6a*/ { "push", false, LONG, op1(Ib), 0 },/*6b*/ { "imul", true, LONG, op3(Ibs,E,R),0 },/*6c*/ { "ins", false, BYTE, op2(DX, DI), 0 },/*6d*/ { "ins", false, LONG, op2(DX, DI), 0 },/*6e*/ { "outs", false, BYTE, op2(SI, DX), 0 },/*6f*/ { "outs", false, LONG, op2(SI, DX), 0 },/*70*/ { "jo", false, NONE, op1(Db), 0 },/*71*/ { "jno", false, NONE, op1(Db), 0 },/*72*/ { "jb", false, NONE, op1(Db), 0 },/*73*/ { "jnb", false, NONE, op1(Db), 0 },/*74*/ { "jz", false, NONE, op1(Db), 0 },/*75*/ { "jnz", false, NONE, op1(Db), 0 },/*76*/ { "jbe", false, NONE, op1(Db), 0 },/*77*/ { "jnbe", false, NONE, op1(Db), 0 },/*78*/ { "js", false, NONE, op1(Db), 0 },/*79*/ { "jns", false, NONE, op1(Db), 0 },/*7a*/ { "jp", false, NONE, op1(Db), 0 },/*7b*/ { "jnp", false, NONE, op1(Db), 0 },/*7c*/ { "jl", false, NONE, op1(Db), 0 },/*7d*/ { "jnl", false, NONE, op1(Db), 0 },/*7e*/ { "jle", false, NONE, op1(Db), 0 },/*7f*/ { "jnle", false, NONE, op1(Db), 0 },/*80*/ { "", true, BYTE, op2(I, E), (char *)db_Grp1 },/*81*/ { "", true, LONG, op2(I, E), (char *)db_Grp1 },/*82*/ { "", true, BYTE, op2(Is,E), (char *)db_Grp1 },/*83*/ { "", true, LONG, op2(Ibs,E), (char *)db_Grp1 },/*84*/ { "test", true, BYTE, op2(R, E), 0 },/*85*/ { "test", true, LONG, op2(R, E), 0 },/*86*/ { "xchg", true, BYTE, op2(R, E), 0 },/*87*/ { "xchg", true, LONG, op2(R, E), 0 },/*88*/ { "mov", true, BYTE, op2(R, E), 0 },/*89*/ { "mov", true, LONG, op2(R, E), 0 },/*8a*/ { "mov", true, BYTE, op2(E, R), 0 },/*8b*/ { "mov", true, LONG, op2(E, R), 0 },/*8c*/ { "mov", true, NONE, op2(S, Ew), 0 },/*8d*/ { "lea", true, LONG, op2(E, R), 0 },/*8e*/ { "mov", true, NONE, op2(Ew, S), 0 },/*8f*/ { "pop", true, LONG, op1(E), 0 },/*90*/ { "nop", false, NONE, 0, 0 },/*91*/ { "xchg", false, LONG, op2(A, Ri), 0 },/*92*/ { "xchg", false, LONG, op2(A, Ri), 0 },/*93*/ { "xchg", false, LONG, op2(A, Ri), 0 },/*94*/ { "xchg", false, LONG, op2(A, Ri), 0 },/*95*/ { "xchg", false, LONG, op2(A, Ri), 0 },/*96*/ { "xchg", false, LONG, op2(A, Ri), 0 },/*97*/ { "xchg", false, LONG, op2(A, Ri), 0 },/*98*/ { "cbw", false, SDEP, 0, "cwde" }, /* cbw/cwde *//*99*/ { "cwd", false, SDEP, 0, "cdq" }, /* cwd/cdq *//*9a*/ { "lcall", false, NONE, op1(OS), 0 },/*9b*/ { "wait", false, NONE, 0, 0 },/*9c*/ { "pushf", false, LONG, 0, 0 },/*9d*/ { "popf", false, LONG, 0, 0 },/*9e*/ { "sahf", false, NONE, 0, 0 },/*9f*/ { "lahf", false, NONE, 0, 0 },/*a0*/ { "mov", false, BYTE, op2(O, A), 0 },/*a1*/ { "mov", false, LONG, op2(O, A), 0 },/*a2*/ { "mov", false, BYTE, op2(A, O), 0 },/*a3*/ { "mov", false, LONG, op2(A, O), 0 },/*a4*/ { "movs", false, BYTE, op2(SI,DI), 0 },/*a5*/ { "movs", false, LONG, op2(SI,DI), 0 },/*a6*/ { "cmps", false, BYTE, op2(SI,DI), 0 },/*a7*/ { "cmps", false, LONG, op2(SI,DI), 0 },/*a8*/ { "test", false, BYTE, op2(I, A), 0 },/*a9*/ { "test", false, LONG, op2(I, A), 0 },/*aa*/ { "stos", false, BYTE, op1(DI), 0 },/*ab*/ { "stos", false, LONG, op1(DI), 0 },/*ac*/ { "lods", false, BYTE, op1(SI), 0 },/*ad*/ { "lods", false, LONG, op1(SI), 0 },/*ae*/ { "scas", false, BYTE, op1(SI), 0 },/*af*/ { "scas", false, LONG, op1(SI), 0 },/*b0*/ { "mov", false, BYTE, op2(I, Ri), 0 },/*b1*/ { "mov", false, BYTE, op2(I, Ri), 0 },/*b2*/ { "mov", false, BYTE, op2(I, Ri), 0 },/*b3*/ { "mov", false, BYTE, op2(I, Ri), 0 },/*b4*/ { "mov", false, BYTE, op2(I, Ri), 0 },/*b5*/ { "mov", false, BYTE, op2(I, Ri), 0 },/*b6*/ { "mov", false, BYTE, op2(I, Ri), 0 },/*b7*/ { "mov", false, BYTE, op2(I, Ri), 0 },/*b8*/ { "mov", false, LONG, op2(I, Ri), 0 },/*b9*/ { "mov", false, LONG, op2(I, Ri), 0 },/*ba*/ { "mov", false, LONG, op2(I, Ri), 0 },/*bb*/ { "mov", false, LONG, op2(I, Ri), 0 },/*bc*/ { "mov", false, LONG, op2(I, Ri), 0 },/*bd*/ { "mov", false, LONG, op2(I, Ri), 0 },/*be*/ { "mov", false, LONG, op2(I, Ri), 0 },/*bf*/ { "mov", false, LONG, op2(I, Ri), 0 },/*c0*/ { "", true, BYTE, op2(Ib, E), (char *)db_Grp2 },/*c1*/ { "", true, LONG, op2(Ib, E), (char *)db_Grp2 },/*c2*/ { "ret", false, NONE, op1(Iw), 0 },/*c3*/ { "ret", false, NONE, 0, 0 },/*c4*/ { "les", true, LONG, op2(E, R), 0 },/*c5*/ { "lds", true, LONG, op2(E, R), 0 },/*c6*/ { "mov", true, BYTE, op2(I, E), 0 },/*c7*/ { "mov", true, LONG, op2(I, E), 0 },/*c8*/ { "enter", false, NONE, op2(Ib, Iw), 0 },/*c9*/ { "leave", false, NONE, 0, 0 },/*ca*/ { "lret", false, NONE, op1(Iw), 0 },/*cb*/ { "lret", false, NONE, 0, 0 },/*cc*/ { "int", false, NONE, op1(o3), 0 },/*cd*/ { "int", false, NONE, op1(Ib), 0 },/*ce*/ { "into", false, NONE, 0, 0 },/*cf*/ { "iret", false, NONE, 0, 0 },/*d0*/ { "", true, BYTE, op2(o1, E), (char *)db_Grp2 },/*d1*/ { "", true, LONG, op2(o1, E), (char *)db_Grp2 },/*d2*/ { "", true, BYTE, op2(CL, E), (char *)db_Grp2 },/*d3*/ { "", true, LONG, op2(CL, E), (char *)db_Grp2 },/*d4*/ { "aam", true, NONE, 0, 0 },/*d5*/ { "aad", true, NONE, 0, 0 },/*d6*/ { "", false, NONE, 0, 0 },/*d7*/ { "xlat", false, BYTE, op1(BX), 0 },/*d8*/ { "", true, NONE, 0, (char *)db_Esc8 },/*d9*/ { "", true, NONE, 0, (char *)db_Esc9 },/*da*/ { "", true, NONE, 0, (char *)db_Esca },/*db*/ { "", true, NONE, 0, (char *)db_Escb },/*dc*/ { "", true, NONE, 0, (char *)db_Escc },/*dd*/ { "", true, NONE, 0, (char *)db_Escd },/*de*/ { "", true, NONE, 0, (char *)db_Esce },/*df*/ { "", true, NONE, 0, (char *)db_Escf },/*e0*/ { "loopne",false, NONE, op1(Db), 0 },/*e1*/ { "loope", false, NONE, op1(Db), 0 },/*e2*/ { "loop", false, NONE, op1(Db), 0 },/*e3*/ { "jcxz", false, SDEP, op1(Db), "jecxz" },/*e4*/ { "in", false, BYTE, op2(Ib, A), 0 },/*e5*/ { "in", false, LONG, op2(Ib, A) , 0 },/*e6*/ { "out", false, BYTE, op2(A, Ib), 0 },/*e7*/ { "out", false, LONG, op2(A, Ib) , 0 },/*e8*/ { "call", false, NONE, op1(Dl), 0 },/*e9*/ { "jmp", false, NONE, op1(Dl), 0 },/*ea*/ { "ljmp", false, NONE, op1(OS), 0 },/*eb*/ { "jmp", false, NONE, op1(Db), 0 },/*ec*/ { "in", false, BYTE, op2(DX, A), 0 },/*ed*/ { "in", false, LONG, op2(DX, A) , 0 },/*ee*/ { "out", false, BYTE, op2(A, DX), 0 },/*ef*/ { "out", false, LONG, op2(A, DX) , 0 },/*f0*/ { "", false, NONE, 0, 0 },/*f1*/ { "", false, NONE, 0, 0 },/*f2*/ { "", false, NONE, 0, 0 },/*f3*/ { "", false, NONE, 0, 0 },/*f4*/ { "hlt", false, NONE, 0, 0 },/*f5*/ { "cmc", false, NONE, 0, 0 },/*f6*/ { "", true, BYTE, 0, (char *)db_Grp3 },/*f7*/ { "", true, LONG, 0, (char *)db_Grp3 },/*f8*/ { "clc", false, NONE, 0, 0 },/*f9*/ { "stc", false, NONE, 0, 0 },/*fa*/ { "cli", false, NONE, 0, 0 },/*fb*/ { "sti", false, NONE, 0, 0 },/*fc*/ { "cld", false, NONE, 0, 0 },/*fd*/ { "std", false, NONE, 0, 0 },/*fe*/ { "", true, NONE, 0, (char *)db_Grp4 },/*ff*/ { "", true, NONE, 0, (char *)db_Grp5 },};struct inst db_bad_inst = { "???", false, NONE, 0, 0 };#define f_mod(byte) ((byte)>>6)#define f_reg(byte) (((byte)>>3)&0x7)#define f_rm(byte) ((byte)&0x7)#define sib_ss(byte) ((byte)>>6)#define sib_index(byte) (((byte)>>3)&0x7)#define sib_base(byte) ((byte)&0x7)struct i_addr { int is_reg; /* if reg, reg number is in 'disp' */ int disp; char * base; char * index; int ss;};char * db_index_reg_16[8] = { "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"};char * db_reg[3][8] = { { "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh" }, { "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di" }, { "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi" }};char * db_seg_reg[8] = { "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "", ""};/* * lengths for size attributes */int db_lengths[] = { 1, /* BYTE */ 2, /* WORD */ 4, /* LONG */ 8, /* QUAD */ 4, /* SNGL */ 8, /* DBLR */ 10, /* EXTR */};#define get_value_inc(result, loc, size, is_signed) \ do { \ result = db_get_value((loc), (size), (is_signed)); \ (loc) += (size); \ } while (0)/* * Read address at location and return updated location. */db_addr_tdb_read_address(db_addr_t loc, int short_addr, int regmodrm, i_addr *addrp) /* OUT */{#if 0 int ss;#endif int mod, rm, sib, index, disp; mod = f_mod(regmodrm); rm = f_rm(regmodrm); if (mod == 3) { addrp->is_reg = true; addrp->disp = rm; return (loc); } addrp->is_reg = false; addrp->index = 0; if (short_addr) { addrp->index = 0; addrp->ss = 0; switch (mod) { case 0: if (rm == 6) { get_value_inc(disp, loc, 2, true); addrp->disp = disp; addrp->base = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -