⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i386-dis.c

📁 qemu虚拟机代码
💻 C
📖 第 1 页 / 共 5 页
字号:
  { "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 + -