📄 i386-dis.c
字号:
{ "psrld", MX, EM, XX }, { "psrlq", MX, EM, XX }, { "paddq", MX, EM, XX }, { "pmullw", MX, EM, XX }, { PREGRP21 }, { "pmovmskb", Gd, MS, XX }, /* d8 */ { "psubusb", MX, EM, XX }, { "psubusw", MX, EM, XX }, { "pminub", MX, EM, XX }, { "pand", MX, EM, XX }, { "paddusb", MX, EM, XX }, { "paddusw", MX, EM, XX }, { "pmaxub", MX, EM, XX }, { "pandn", MX, EM, XX }, /* e0 */ { "pavgb", MX, EM, XX }, { "psraw", MX, EM, XX }, { "psrad", MX, EM, XX }, { "pavgw", MX, EM, XX }, { "pmulhuw", MX, EM, XX }, { "pmulhw", MX, EM, XX }, { PREGRP15 }, { PREGRP25 }, /* e8 */ { "psubsb", MX, EM, XX }, { "psubsw", MX, EM, XX }, { "pminsw", MX, EM, XX }, { "por", MX, EM, XX }, { "paddsb", MX, EM, XX }, { "paddsw", MX, EM, XX }, { "pmaxsw", MX, EM, XX }, { "pxor", MX, EM, XX }, /* f0 */ { "(bad)", XX, XX, XX }, { "psllw", MX, EM, XX }, { "pslld", MX, EM, XX }, { "psllq", MX, EM, XX }, { "pmuludq", MX, EM, XX }, { "pmaddwd", MX, EM, XX }, { "psadbw", MX, EM, XX }, { PREGRP18 }, /* f8 */ { "psubb", MX, EM, XX }, { "psubw", MX, EM, XX }, { "psubd", MX, EM, XX }, { "psubq", MX, EM, XX }, { "paddb", MX, EM, XX }, { "paddw", MX, EM, XX }, { "paddd", MX, EM, XX }, { "(bad)", XX, XX, XX }};static const unsigned char onebyte_has_modrm[256] = { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /* ------------------------------- */ /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */ /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */ /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */ /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */ /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */ /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */ /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */ /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */ /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */ /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */ /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */ /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */ /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */ /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */ /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */ /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */ /* ------------------------------- */ /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */};static const unsigned char twobyte_has_modrm[256] = { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /* ------------------------------- */ /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */ /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, /* 1f */ /* 20 */ 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 2f */ /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */ /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */ /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */ /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */ /* 70 */ 1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1, /* 7f */ /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */ /* a0 */ 0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1, /* af */ /* b0 */ 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1, /* bf */ /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */ /* d0 */ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */ /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */ /* f0 */ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */ /* ------------------------------- */ /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */};static const unsigned char twobyte_uses_SSE_prefix[256] = { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /* ------------------------------- */ /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */ /* 10 */ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */ /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0, /* 2f */ /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */ /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */ /* 50 */ 0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* 5f */ /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1, /* 6f */ /* 70 */ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, /* 7f */ /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */ /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */ /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */ /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */ /* d0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */ /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */ /* f0 */ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 /* ff */ /* ------------------------------- */ /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */};static char obuf[100];static char *obufp;static char scratchbuf[100];static unsigned char *start_codep;static unsigned char *insn_codep;static unsigned char *codep;static disassemble_info *the_info;static int mod;static int rm;static int reg;static unsigned char need_modrm;/* If we are accessing mod/rm/reg without need_modrm set, then the values are stale. Hitting this abort likely indicates that you need to update onebyte_has_modrm or twobyte_has_modrm. */#define MODRM_CHECK if (!need_modrm) abort ()static const char **names64;static const char **names32;static const char **names16;static const char **names8;static const char **names8rex;static const char **names_seg;static const char **index16;static const char *intel_names64[] = { "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};static const char *intel_names32[] = { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"};static const char *intel_names16[] = { "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"};static const char *intel_names8[] = { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",};static const char *intel_names8rex[] = { "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil", "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"};static const char *intel_names_seg[] = { "es", "cs", "ss", "ds", "fs", "gs", "?", "?",};static const char *intel_index16[] = { "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"};static const char *att_names64[] = { "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"};static const char *att_names32[] = { "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi", "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"};static const char *att_names16[] = { "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di", "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"};static const char *att_names8[] = { "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",};static const char *att_names8rex[] = { "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil", "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"};static const char *att_names_seg[] = { "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",};static const char *att_index16[] = { "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"};static const struct dis386 grps[][8] = { /* GRP1b */ { { "addA", Eb, Ib, XX }, { "orA", Eb, Ib, XX }, { "adcA", Eb, Ib, XX }, { "sbbA", Eb, Ib, XX }, { "andA", Eb, Ib, XX }, { "subA", Eb, Ib, XX }, { "xorA", Eb, Ib, XX }, { "cmpA", Eb, Ib, XX } }, /* GRP1S */ { { "addQ", Ev, Iv, XX }, { "orQ", Ev, Iv, XX }, { "adcQ", Ev, Iv, XX }, { "sbbQ", Ev, Iv, XX }, { "andQ", Ev, Iv, XX }, { "subQ", Ev, Iv, XX }, { "xorQ", Ev, Iv, XX }, { "cmpQ", Ev, Iv, XX } }, /* GRP1Ss */ { { "addQ", Ev, sIb, XX }, { "orQ", Ev, sIb, XX }, { "adcQ", Ev, sIb, XX }, { "sbbQ", Ev, sIb, XX }, { "andQ", Ev, sIb, XX }, { "subQ", Ev, sIb, XX }, { "xorQ", Ev, sIb, XX }, { "cmpQ", Ev, sIb, XX } }, /* GRP2b */ { { "rolA", Eb, Ib, XX }, { "rorA", Eb, Ib, XX }, { "rclA", Eb, Ib, XX }, { "rcrA", Eb, Ib, XX }, { "shlA", Eb, Ib, XX }, { "shrA", Eb, Ib, XX }, { "(bad)", XX, XX, XX }, { "sarA", Eb, Ib, XX }, }, /* GRP2S */ { { "rolQ", Ev, Ib, XX }, { "rorQ", Ev, Ib, XX }, { "rclQ", Ev, Ib, XX }, { "rcrQ", Ev, Ib, XX }, { "shlQ", Ev, Ib, XX }, { "shrQ", Ev, Ib, XX }, { "(bad)", XX, XX, XX }, { "sarQ", Ev, Ib, XX }, }, /* GRP2b_one */ { { "rolA", Eb, XX, XX }, { "rorA", Eb, XX, XX }, { "rclA", Eb, XX, XX }, { "rcrA", Eb, XX, XX }, { "shlA", Eb, XX, XX }, { "shrA", Eb, XX, XX }, { "(bad)", XX, XX, XX }, { "sarA", Eb, XX, XX }, }, /* GRP2S_one */ { { "rolQ", Ev, XX, XX }, { "rorQ", Ev, XX, XX }, { "rclQ", Ev, XX, XX }, { "rcrQ", Ev, XX, XX }, { "shlQ", Ev, XX, XX }, { "shrQ", Ev, XX, XX }, { "(bad)", XX, XX, XX}, { "sarQ", Ev, XX, XX }, }, /* GRP2b_cl */ { { "rolA", Eb, CL, XX }, { "rorA", Eb, CL, XX }, { "rclA", Eb, CL, XX }, { "rcrA", Eb, CL, XX }, { "shlA", Eb, CL, XX }, { "shrA", Eb, CL, XX }, { "(bad)", XX, XX, XX }, { "sarA", Eb, CL, XX }, }, /* GRP2S_cl */ { { "rolQ", Ev, CL, XX }, { "rorQ", Ev, CL, XX }, { "rclQ", Ev, CL, XX }, { "rcrQ", Ev, CL, XX }, { "shlQ", Ev, CL, XX }, { "shrQ", Ev, CL, XX }, { "(bad)", XX, XX, XX }, { "sarQ", Ev, CL, XX } }, /* GRP3b */ { { "testA", Eb, Ib, XX }, { "(bad)", Eb, XX, XX }, { "notA", Eb, XX, XX }, { "negA", Eb, XX, XX }, { "mulA", Eb, XX, XX }, /* Don't print the implicit %al register, */ { "imulA", Eb, XX, XX }, /* to distinguish these opcodes from other */ { "divA", Eb, XX, XX }, /* mul/imul opcodes. Do the same for div */ { "idivA", Eb, XX, XX } /* and idiv for consistency. */ }, /* GRP3S */ { { "testQ", Ev, Iv, XX }, { "(bad)", XX, XX, XX }, { "notQ", Ev, XX, XX }, { "negQ", Ev, XX, XX }, { "mulQ", Ev, XX, XX }, /* Don't print the implicit register. */ { "imulQ", Ev, XX, XX }, { "divQ", Ev, XX, XX }, { "idivQ", Ev, XX, XX }, }, /* GRP4 */ { { "incA", Eb, XX, XX }, { "decA", Eb, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, }, /* GRP5 */ { { "incQ", Ev, XX, XX }, { "decQ", Ev, XX, XX }, { "callT", indirEv, XX, XX }, { "lcallT", indirEv, XX, XX }, { "jmpT", indirEv, XX, XX }, { "ljmpT", indirEv, XX, XX }, { "pushU", Ev, XX, XX }, { "(bad)", XX, XX, XX }, }, /* GRP6 */ { { "sldtQ", Ev, XX, XX }, { "strQ", Ev, XX, XX }, { "lldt", Ew, XX, XX }, { "ltr", Ew, XX, XX }, { "verr", Ew, XX, XX }, { "verw", Ew, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX } }, /* GRP7 */ { { "sgdtQ", M, XX, XX }, { "sidtQ", M, XX, XX }, { "lgdtQ", M, XX, XX }, { "lidtQ", M, XX, XX }, { "smswQ", Ev, XX, XX }, { "(bad)", XX, XX, XX }, { "lmsw", Ew, XX, XX }, { "invlpg", Ew, XX, XX }, }, /* GRP8 */ { { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "btQ", Ev, Ib, XX }, { "btsQ", Ev, Ib, XX }, { "btrQ", Ev, Ib, XX }, { "btcQ", Ev, Ib, XX }, }, /* GRP9 */ { { "(bad)", XX, XX, XX }, { "cmpxchg8b", Ev, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, }, /* GRP10 */ { { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "psrlw", MS, Ib, XX }, { "(bad)", XX, XX, XX }, { "psraw", MS, Ib, XX }, { "(bad)", XX, XX, XX }, { "psllw", MS, Ib, XX }, { "(bad)", XX, XX, XX }, }, /* GRP11 */ { { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "psrld", MS, Ib, XX }, { "(bad)", XX, XX, XX }, { "psrad", MS, Ib, XX }, { "(bad)", XX, XX, XX }, { "pslld", MS, Ib, XX }, { "(bad)", XX, XX, XX }, }, /* GRP12 */ { { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "psrlq", MS, Ib, XX }, { "psrldq", MS, Ib, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "psllq", MS, Ib, XX }, { "pslldq", MS, Ib, XX }, }, /* GRP13 */ { { "fxsave", Ev, XX, XX }, { "fxrstor", Ev, XX, XX }, { "ldmxcsr", Ev, XX, XX }, { "stmxcsr", Ev, XX, XX }, { "(bad)", XX, XX, XX }, { "lfence", None, XX, XX }, { "mfence", None, XX, XX }, { "sfence", None, XX, XX }, /* FIXME: the sfence with memory operand is clflush! */ }, /* GRP14 */ { { "prefetchnta", Ev, XX, XX }, { "prefetcht0", Ev, XX, XX }, { "prefetcht1", Ev, XX, XX }, { "prefetcht2", Ev, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, }, /* GRPAMD */ { { "prefetch", Eb, XX, XX }, { "prefetchw", Eb, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, { "(bad)", XX, XX, XX }, }};static const struct dis386 prefix_user_table[][4] = { /* PREGRP0 */ { { "addps", XM, EX, XX }, { "addss", XM, EX, XX }, { "addpd", XM, EX, XX }, { "addsd", XM, EX, XX }, }, /* PREGRP1 */ { { "", XM, EX, OPSIMD }, /* See OP_SIMD_SUFFIX. */ { "", XM, EX, OPSIMD }, { "", XM, EX, OPSIMD }, { "", XM, EX, OPSIMD }, }, /* PREGRP2 */ { { "cvtpi2ps", XM, EM, XX }, { "cvtsi2ssY", XM, Ev, XX }, { "cvtpi2pd", XM, EM, XX }, { "cvtsi2sdY", XM, Ev, XX }, }, /* PREGRP3 */ { { "cvtps2pi", MX, EX, XX }, { "cvtss2siY", Gv, EX, XX }, { "cvtpd2pi", MX, EX, XX }, { "cvtsd2siY", Gv, EX, XX }, }, /* PREGRP4 */ { { "cvttps2pi", MX, EX, XX }, { "cvttss2siY", Gv, EX, XX }, { "cvttpd2pi", MX, EX, XX }, { "cvttsd2siY", Gv, EX, XX }, }, /* PREGRP5 */ { { "divps", XM, EX, XX }, { "divss", XM, EX, XX },
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -