📄 i386-dis.c
字号:
{ "movhpX", EX, XM, SIMD_Fixup, 'l' },
/* 18 */
{ GRP14 },
{ "(bad)", XX, 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 },
/* 20 */
{ "movL", Rm, Cm, XX },
{ "movL", Rm, Dm, XX },
{ "movL", Cm, Rm, XX },
{ "movL", Dm, Rm, XX },
{ "movL", Rd, Td, XX },
{ "(bad)", XX, XX, XX },
{ "movL", Td, Rd, XX },
{ "(bad)", XX, XX, XX },
/* 28 */
{ "movapX", XM, EX, XX },
{ "movapX", EX, XM, XX },
{ PREGRP2 },
{ "movntpX", Ev, XM, XX },
{ PREGRP4 },
{ PREGRP3 },
{ "ucomisX", XM,EX, XX },
{ "comisX", XM,EX, XX },
/* 30 */
{ "wrmsr", XX, XX, XX },
{ "rdtsc", XX, XX, XX },
{ "rdmsr", XX, XX, XX },
{ "rdpmc", XX, XX, XX },
{ "sysenter", XX, XX, XX },
{ "sysexit", XX, XX, XX },
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
/* 38 */
{ "(bad)", XX, 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 },
{ "(bad)", XX, XX, XX },
/* 40 */
{ "cmovo", Gv, Ev, XX },
{ "cmovno", Gv, Ev, XX },
{ "cmovb", Gv, Ev, XX },
{ "cmovae", Gv, Ev, XX },
{ "cmove", Gv, Ev, XX },
{ "cmovne", Gv, Ev, XX },
{ "cmovbe", Gv, Ev, XX },
{ "cmova", Gv, Ev, XX },
/* 48 */
{ "cmovs", Gv, Ev, XX },
{ "cmovns", Gv, Ev, XX },
{ "cmovp", Gv, Ev, XX },
{ "cmovnp", Gv, Ev, XX },
{ "cmovl", Gv, Ev, XX },
{ "cmovge", Gv, Ev, XX },
{ "cmovle", Gv, Ev, XX },
{ "cmovg", Gv, Ev, XX },
/* 50 */
{ "movmskpX", Gd, XS, XX },
{ PREGRP13 },
{ PREGRP12 },
{ PREGRP11 },
{ "andpX", XM, EX, XX },
{ "andnpX", XM, EX, XX },
{ "orpX", XM, EX, XX },
{ "xorpX", XM, EX, XX },
/* 58 */
{ PREGRP0 },
{ PREGRP10 },
{ PREGRP17 },
{ PREGRP16 },
{ PREGRP14 },
{ PREGRP7 },
{ PREGRP5 },
{ PREGRP6 },
/* 60 */
{ "punpcklbw", MX, EM, XX },
{ "punpcklwd", MX, EM, XX },
{ "punpckldq", MX, EM, XX },
{ "packsswb", MX, EM, XX },
{ "pcmpgtb", MX, EM, XX },
{ "pcmpgtw", MX, EM, XX },
{ "pcmpgtd", MX, EM, XX },
{ "packuswb", MX, EM, XX },
/* 68 */
{ "punpckhbw", MX, EM, XX },
{ "punpckhwd", MX, EM, XX },
{ "punpckhdq", MX, EM, XX },
{ "packssdw", MX, EM, XX },
{ PREGRP26 },
{ PREGRP24 },
{ "movd", MX, Ed, XX },
{ PREGRP19 },
/* 70 */
{ PREGRP22 },
{ GRP10 },
{ GRP11 },
{ GRP12 },
{ "pcmpeqb", MX, EM, XX },
{ "pcmpeqw", MX, EM, XX },
{ "pcmpeqd", MX, EM, XX },
{ "emms", XX, XX, XX },
/* 78 */
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
{ PREGRP23 },
{ PREGRP20 },
/* 80 */
{ "joH", Jv, XX, cond_jump_flag },
{ "jnoH", Jv, XX, cond_jump_flag },
{ "jbH", Jv, XX, cond_jump_flag },
{ "jaeH", Jv, XX, cond_jump_flag },
{ "jeH", Jv, XX, cond_jump_flag },
{ "jneH", Jv, XX, cond_jump_flag },
{ "jbeH", Jv, XX, cond_jump_flag },
{ "jaH", Jv, XX, cond_jump_flag },
/* 88 */
{ "jsH", Jv, XX, cond_jump_flag },
{ "jnsH", Jv, XX, cond_jump_flag },
{ "jpH", Jv, XX, cond_jump_flag },
{ "jnpH", Jv, XX, cond_jump_flag },
{ "jlH", Jv, XX, cond_jump_flag },
{ "jgeH", Jv, XX, cond_jump_flag },
{ "jleH", Jv, XX, cond_jump_flag },
{ "jgH", Jv, XX, cond_jump_flag },
/* 90 */
{ "seto", Eb, XX, XX },
{ "setno", Eb, XX, XX },
{ "setb", Eb, XX, XX },
{ "setae", Eb, XX, XX },
{ "sete", Eb, XX, XX },
{ "setne", Eb, XX, XX },
{ "setbe", Eb, XX, XX },
{ "seta", Eb, XX, XX },
/* 98 */
{ "sets", Eb, XX, XX },
{ "setns", Eb, XX, XX },
{ "setp", Eb, XX, XX },
{ "setnp", Eb, XX, XX },
{ "setl", Eb, XX, XX },
{ "setge", Eb, XX, XX },
{ "setle", Eb, XX, XX },
{ "setg", Eb, XX, XX },
/* a0 */
{ "pushT", fs, XX, XX },
{ "popT", fs, XX, XX },
{ "cpuid", XX, XX, XX },
{ "btS", Ev, Gv, XX },
{ "shldS", Ev, Gv, Ib },
{ "shldS", Ev, Gv, CL },
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
/* a8 */
{ "pushT", gs, XX, XX },
{ "popT", gs, XX, XX },
{ "rsm", XX, XX, XX },
{ "btsS", Ev, Gv, XX },
{ "shrdS", Ev, Gv, Ib },
{ "shrdS", Ev, Gv, CL },
{ GRP13 },
{ "imulS", Gv, Ev, XX },
/* b0 */
{ "cmpxchgB", Eb, Gb, XX },
{ "cmpxchgS", Ev, Gv, XX },
{ "lssS", Gv, Mp, XX },
{ "btrS", Ev, Gv, XX },
{ "lfsS", Gv, Mp, XX },
{ "lgsS", Gv, Mp, XX },
{ "movz{bR|x|bR|x}", Gv, Eb, XX },
{ "movz{wR|x|wR|x}", Gv, Ew, XX }, /* yes, there really is movzww ! */
/* b8 */
{ "(bad)", XX, XX, XX },
{ "ud2b", XX, XX, XX },
{ GRP8 },
{ "btcS", Ev, Gv, XX },
{ "bsfS", Gv, Ev, XX },
{ "bsrS", Gv, Ev, XX },
{ "movs{bR|x|bR|x}", Gv, Eb, XX },
{ "movs{wR|x|wR|x}", Gv, Ew, XX }, /* yes, there really is movsww ! */
/* c0 */
{ "xaddB", Eb, Gb, XX },
{ "xaddS", Ev, Gv, XX },
{ PREGRP1 },
{ "movntiS", Ev, Gv, XX },
{ "pinsrw", MX, Ed, Ib },
{ "pextrw", Gd, MS, Ib },
{ "shufpX", XM, EX, Ib },
{ GRP9 },
/* c8 */
{ "bswap", RMeAX, XX, XX },
{ "bswap", RMeCX, XX, XX },
{ "bswap", RMeDX, XX, XX },
{ "bswap", RMeBX, XX, XX },
{ "bswap", RMeSP, XX, XX },
{ "bswap", RMeBP, XX, XX },
{ "bswap", RMeSI, XX, XX },
{ "bswap", RMeDI, XX, XX },
/* d0 */
{ "(bad)", XX, XX, XX },
{ "psrlw", MX, EM, XX },
{ "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 },
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -