i386-dis.c

来自「基于4个mips核的noc设计」· C语言 代码 · 共 2,329 行 · 第 1/5 页

C
2,329
字号
  { "mov",	Ov, eAX, XX },  { "movs",	Yb, Xb, XX },  { "movs",	Yv, Xv, XX },  { "cmps",	Xb, Yb, XX },  { "cmps",	Xv, Yv, XX },  /* a8 */  { "test",	AL, Ib, XX },  { "test",	eAX, Iv, XX },  { "stos",	Yb, AL, XX },  { "stos",	Yv, eAX, XX },  { "lods",	AL, Xb, XX },  { "lods",	eAX, Xv, XX },  { "scas",	AL, Yb, XX },  { "scas",	eAX, Yv, XX },  /* b0 */  { "mov",	RMAL, Ib, XX },  { "mov",	RMCL, Ib, XX },  { "mov",	RMDL, Ib, XX },  { "mov",	RMBL, Ib, XX },  { "mov",	RMAH, Ib, XX },  { "mov",	RMCH, Ib, XX },  { "mov",	RMDH, Ib, XX },  { "mov",	RMBH, Ib, XX },  /* b8 */  { "mov",	RMeAX, Iv, XX },  { "mov",	RMeCX, Iv, XX },  { "mov",	RMeDX, Iv, XX },  { "mov",	RMeBX, Iv, XX },  { "mov",	RMeSP, Iv, XX },  { "mov",	RMeBP, Iv, XX },  { "mov",	RMeSI, Iv, XX },  { "mov",	RMeDI, Iv, XX },  /* c0 */  { GRP2b },  { GRP2S },  { "ret",	Iw, XX, XX },  { "ret",	XX, XX, XX },  { "les",	Gv, Mp, XX },  { "lds",	Gv, Mp, XX },  { "mov",	Eb, Ib, XX },  { "mov",	Ev, Iv, XX },  /* c8 */  { "enter",	Iw, Ib, XX },  { "leave",	XX, XX, XX },  { "lret",	Iw, XX, XX },  { "lret",	XX, XX, XX },  { "int3",	XX, XX, XX },  { "int",	Ib, XX, XX },  { "into",	XX, XX, XX },  { "iret",	XX, XX, XX },  /* d0 */  { GRP2b_one },  { GRP2S_one },  { GRP2b_cl },  { GRP2S_cl },  { "aam",	sIb, XX, XX },  { "aad",	sIb, XX, XX },  { "(bad)",	XX, XX, XX },  { "xlat",	DSBX, XX, XX },  /* d8 */  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  /* e0 */  { "loopne",	Jb, XX, XX },  { "loope",	Jb, XX, XX },  { "loop",	Jb, XX, XX },  { "jEcxz",	Jb, XX, XX },  { "in",	AL, Ib, XX },  { "in",	eAX, Ib, XX },  { "out",	Ib, AL, XX },  { "out",	Ib, eAX, XX },  /* e8 */  { "call",	Jv, XX, XX },  { "jmp",	Jv, XX, XX },  { "ljmp",	Ap, XX, XX },  { "jmp",	Jb, XX, XX },  { "in",	AL, indirDX, XX },  { "in",	eAX, indirDX, XX },  { "out",	indirDX, AL, XX },  { "out",	indirDX, eAX, XX },  /* f0 */  { "(bad)",	XX, XX, XX },			/* lock prefix */  { "(bad)",	XX, XX, XX },  { "(bad)",	XX, XX, XX },			/* repne */  { "(bad)",	XX, XX, XX },			/* repz */  { "hlt",	XX, XX, XX },  { "cmc",	XX, XX, XX },  { GRP3b },  { GRP3S },  /* f8 */  { "clc",	XX, XX, XX },  { "stc",	XX, XX, XX },  { "cli",	XX, XX, XX },  { "sti",	XX, XX, XX },  { "cld",	XX, XX, XX },  { "std",	XX, XX, XX },  { GRP4 },  { GRP5 },};/* 64bit mode is having some instruction set differences, so separate table is   needed.  */static const struct dis386 disx86_64_att[] = {  /* 00 */  { "addB",	Eb, Gb, XX },  { "addS",	Ev, Gv, XX },  { "addB",	Gb, Eb, XX },  { "addS",	Gv, Ev, XX },  { "addB",	AL, Ib, XX },  { "addS",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },   /* Reserved.  */  { "(bad)",	XX, XX, XX },   /* Reserved.  */  /* 08 */  { "orB",	Eb, Gb, XX },  { "orS",	Ev, Gv, XX },  { "orB",	Gb, Eb, XX },  { "orS",	Gv, Ev, XX },  { "orB",	AL, Ib, XX },  { "orS",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },   /* Reserved.  */  { "(bad)",	XX, XX, XX },	/* 0x0f extended opcode escape */  /* 10 */  { "adcB",	Eb, Gb, XX },  { "adcS",	Ev, Gv, XX },  { "adcB",	Gb, Eb, XX },  { "adcS",	Gv, Ev, XX },  { "adcB",	AL, Ib, XX },  { "adcS",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },   /* Reserved.  */  { "(bad)",	XX, XX, XX },   /* Reserved.  */  /* 18 */  { "sbbB",	Eb, Gb, XX },  { "sbbS",	Ev, Gv, XX },  { "sbbB",	Gb, Eb, XX },  { "sbbS",	Gv, Ev, XX },  { "sbbB",	AL, Ib, XX },  { "sbbS",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },   /* Reserved.  */  { "(bad)",	XX, XX, XX },   /* Reserved.  */  /* 20 */  { "andB",	Eb, Gb, XX },  { "andS",	Ev, Gv, XX },  { "andB",	Gb, Eb, XX },  { "andS",	Gv, Ev, XX },  { "andB",	AL, Ib, XX },  { "andS",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },			/* SEG ES prefix */  { "(bad)",	XX, XX, XX },   /* Reserved.  */  /* 28 */  { "subB",	Eb, Gb, XX },  { "subS",	Ev, Gv, XX },  { "subB",	Gb, Eb, XX },  { "subS",	Gv, Ev, XX },  { "subB",	AL, Ib, XX },  { "subS",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },			/* SEG CS prefix */  { "(bad)",	XX, XX, XX },   /* Reserved.  */  /* 30 */  { "xorB",	Eb, Gb, XX },  { "xorS",	Ev, Gv, XX },  { "xorB",	Gb, Eb, XX },  { "xorS",	Gv, Ev, XX },  { "xorB",	AL, Ib, XX },  { "xorS",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },			/* SEG SS prefix */  { "(bad)",	XX, XX, XX },   /* Reserved.  */  /* 38 */  { "cmpB",	Eb, Gb, XX },  { "cmpS",	Ev, Gv, XX },  { "cmpB",	Gb, Eb, XX },  { "cmpS",	Gv, Ev, XX },  { "cmpB",	AL, Ib, XX },  { "cmpS",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },			/* SEG DS prefix */  { "(bad)",	XX, XX, XX },   /* Reserved.  */  /* 40 */  { "(bad)",	XX, XX, XX },			/* REX prefix area.  */  { "(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 },  /* 48 */  { "(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 },  /* 50 */  { "pushI",	RMrAX, XX, XX },  { "pushI",	RMrCX, XX, XX },  { "pushI",	RMrDX, XX, XX },  { "pushI",	RMrBX, XX, XX },  { "pushI",	RMrSP, XX, XX },  { "pushI",	RMrBP, XX, XX },  { "pushI",	RMrSI, XX, XX },  { "pushI",	RMrDI, XX, XX },  /* 58 */  { "popI",	RMrAX, XX, XX },  { "popI",	RMrCX, XX, XX },  { "popI",	RMrDX, XX, XX },  { "popI",	RMrBX, XX, XX },  { "popI",	RMrSP, XX, XX },  { "popI",	RMrBP, XX, XX },  { "popI",	RMrSI, XX, XX },  { "popI",	RMrDI, XX, XX },  /* 60 */  { "(bad)",	XX, XX, XX },   /* reserved.  */  { "(bad)",	XX, XX, XX },   /* reserved.  */  { "(bad)",	XX, XX, XX },   /* reserved.  */  { "movslR",   Gv, Ed, XX },  { "(bad)",	XX, XX, XX },			/* seg fs */  { "(bad)",	XX, XX, XX },			/* seg gs */  { "(bad)",	XX, XX, XX },			/* op size prefix */  { "(bad)",	XX, XX, XX },			/* adr size prefix */  /* 68 */  { "pushI",	Iq, XX, XX },		/* 386 book wrong */  { "imulS",	Gv, Ev, Iv },  { "pushI",	sIb, XX, XX },	/* push of byte really pushes 2 or 4 bytes */  { "imulS",	Gv, Ev, sIb },  { "insb",	Yb, indirDX, XX },  { "insR",	Yv, indirDX, XX },  { "outsb",	indirDX, Xb, XX },  { "outsR",	indirDX, Xv, XX },  /* 70 */  { "jo",	Jb, cond_jump_flag, XX },  { "jno",	Jb, cond_jump_flag, XX },  { "jb",	Jb, cond_jump_flag, XX },  { "jae",	Jb, cond_jump_flag, XX },  { "je",	Jb, cond_jump_flag, XX },  { "jne",	Jb, cond_jump_flag, XX },  { "jbe",	Jb, cond_jump_flag, XX },  { "ja",	Jb, cond_jump_flag, XX },  /* 78 */  { "js",	Jb, cond_jump_flag, XX },  { "jns",	Jb, cond_jump_flag, XX },  { "jp",	Jb, cond_jump_flag, XX },  { "jnp",	Jb, cond_jump_flag, XX },  { "jl",	Jb, cond_jump_flag, XX },  { "jge",	Jb, cond_jump_flag, XX },  { "jle",	Jb, cond_jump_flag, XX },  { "jg",	Jb, cond_jump_flag, XX },  /* 80 */  { GRP1b },  { GRP1S },  { "(bad)",	XX, XX, XX },  { GRP1Ss },  { "testB",	Eb, Gb, XX },  { "testS",	Ev, Gv, XX },  { "xchgB",	Eb, Gb, XX },  { "xchgS",	Ev, Gv, XX },  /* 88 */  { "movB",	Eb, Gb, XX },  { "movS",	Ev, Gv, XX },  { "movB",	Gb, Eb, XX },  { "movS",	Gv, Ev, XX },  { "movQ",	Ev, Sw, XX },  { "leaS",	Gv, M, XX },  { "movQ",	Sw, Ev, XX },  { "popI",	Ev, XX, XX },  /* 90 */  { "nop",	XX, XX, XX },  /* FIXME: NOP with REPz prefix is called PAUSE.  */  { "xchgS",	RMeCX, eAX, XX },  { "xchgS",	RMeDX, eAX, XX },  { "xchgS",	RMeBX, eAX, XX },  { "xchgS",	RMeSP, eAX, XX },  { "xchgS",	RMeBP, eAX, XX },  { "xchgS",	RMeSI, eAX, XX },  { "xchgS",	RMeDI, eAX, XX },  /* 98 */  { "cWtR",	XX, XX, XX },  { "cRtO",	XX, XX, XX },  { "(bad)",	XX, XX, XX },   /* reserved.  */  { "(bad)",	XX, XX, XX },		/* fwait */  { "pushfI",	XX, XX, XX },  { "popfI",	XX, XX, XX },  { "(bad)",	XX, XX, XX },   /* reserved.  */  { "(bad)",	XX, XX, XX },   /* reserved.  */  /* a0 */  { "movB",	AL, Ob64, XX },  { "movS",	eAX, Ov64, XX },  { "movB",	Ob64, AL, XX },  { "movS",	Ov64, eAX, XX },  { "movsb",	Yb, Xb, XX },  { "movsR",	Yv, Xv, XX },  { "cmpsb",	Xb, Yb, XX },  { "cmpsR",	Xv, Yv, XX },  /* a8 */  { "testB",	AL, Ib, XX },  { "testS",	eAX, Iv, XX },  { "stosB",	Yb, AL, XX },  { "stosS",	Yv, eAX, XX },  { "lodsB",	AL, Xb, XX },  { "lodsS",	eAX, Xv, XX },  { "scasB",	AL, Yb, XX },  { "scasS",	eAX, Yv, XX },  /* b0 */  { "movB",	RMAL, Ib, XX },  { "movB",	RMCL, Ib, XX },  { "movB",	RMDL, Ib, XX },  { "movB",	RMBL, Ib, XX },  { "movB",	RMAH, Ib, XX },  { "movB",	RMCH, Ib, XX },  { "movB",	RMDH, Ib, XX },  { "movB",	RMBH, Ib, XX },  /* b8 */  { "movS",	RMeAX, Iv64, XX },  { "movS",	RMeCX, Iv64, XX },  { "movS",	RMeDX, Iv64, XX },  { "movS",	RMeBX, Iv64, XX },  { "movS",	RMeSP, Iv64, XX },  { "movS",	RMeBP, Iv64, XX },  { "movS",	RMeSI, Iv64, XX },  { "movS",	RMeDI, Iv64, XX },  /* c0 */  { GRP2b },  { GRP2S },  { "retI",	Iw, XX, XX },  { "retI",	XX, XX, XX },  { "(bad)",	XX, XX, XX },   /* reserved.  */  { "ldsS",	Gv, Mp, XX },  { "movA",	Eb, Ib, XX },  { "movQ",	Ev, Iv, XX },  /* c8 */  { "enterI",	Iw, Ib, XX },  { "leaveI",	XX, XX, XX },  { "lretP",	Iw, XX, XX },  { "lretP",	XX, XX, XX },  { "int3",	XX, XX, XX },  { "int",	Ib, XX, XX },  { "(bad)",	XX, XX, XX },   /* reserved.  */  { "iretP",	XX, XX, XX },  /* d0 */  { GRP2b_one },  { GRP2S_one },  { GRP2b_cl },  { GRP2S_cl },  { "(bad)",	XX, XX, XX },   /* reserved.  */  { "(bad)",	XX, XX, XX },   /* reserved.  */  { "(bad)",	XX, XX, XX },   /* reserved.  */  { "xlat",	DSBX, XX, XX },  /* d8 */  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  /* e0 */  { "loopneF",	Jb, loop_jcxz_flag, XX },  { "loopeF",	Jb, loop_jcxz_flag, XX },  { "loopF",	Jb, loop_jcxz_flag, XX },  { "jEcxz",	Jb, loop_jcxz_flag, XX },  { "inB",	AL, Ib, XX },  { "inS",	eAX, Ib, XX },  { "outB",	Ib, AL, XX },  { "outS",	Ib, eAX, XX },  /* e8 */  { "callI",	Jv, XX, XX },  { "jmpI",	Jv, XX, XX },  { "(bad)",	XX, XX, XX },   /* reserved.  */  { "jmp",	Jb, XX, XX },  { "inB",	AL, indirDX, XX },  { "inS",	eAX, indirDX, XX },  { "outB",	indirDX, AL, XX },  { "outS",	indirDX, eAX, XX },  /* f0 */  { "(bad)",	XX, XX, XX },			/* lock prefix */  { "(bad)",	XX, XX, XX },  { "(bad)",	XX, XX, XX },			/* repne */  { "(bad)",	XX, XX, XX },			/* repz */  { "hlt",	XX, XX, XX },  { "cmc",	XX, XX, XX },  { GRP3b },  { GRP3S },  /* f8 */  { "clc",	XX, XX, XX },  { "stc",	XX, XX, XX },  { "cli",	XX, XX, XX },  { "sti",	XX, XX, XX },  { "cld",	XX, XX, XX },  { "std",	XX, XX, XX },  { GRP4 },  { GRP5 },};static const struct dis386 dis386_64_intel[] = {  /* 00 */  { "add",	Eb, Gb, XX },  { "add",	Ev, Gv, XX },  { "add",	Gb, Eb, XX },  { "add",	Gv, Ev, XX },  { "add",	AL, Ib, XX },  { "add",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },   /* Reserved.  */  { "(bad)",	XX, XX, XX },   /* Reserved.  */  /* 08 */  { "or",	Eb, Gb, XX },  { "or",	Ev, Gv, XX },  { "or",	Gb, Eb, XX },  { "or",	Gv, Ev, XX },  { "or",	AL, Ib, XX },  { "or",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },   /* Reserved.  */  { "(bad)",	XX, XX, XX },	/* 0x0f extended opcode escape */  /* 10 */  { "adc",	Eb, Gb, XX },  { "adc",	Ev, Gv, XX },  { "adc",	Gb, Eb, XX },  { "adc",	Gv, Ev, XX },  { "adc",	AL, Ib, XX },  { "adc",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },   /* Reserved.  */  { "(bad)",	XX, XX, XX },   /* Reserved.  */  /* 18 */  { "sbb",	Eb, Gb, XX },  { "sbb",	Ev, Gv, XX },  { "sbb",	Gb, Eb, XX },  { "sbb",	Gv, Ev, XX },  { "sbb",	AL, Ib, XX },  { "sbb",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },   /* Reserved.  */  { "(bad)",	XX, XX, XX },   /* Reserved.  */  /* 20 */  { "and",	Eb, Gb, XX },  { "and",	Ev, Gv, XX },  { "and",	Gb, Eb, XX },  { "and",	Gv, Ev, XX },  { "and",	AL, Ib, XX },  { "and",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },			/* SEG ES prefix */  { "(bad)",	XX, XX, XX },   /* Reserved.  */  /* 28 */  { "sub",	Eb, Gb, XX },  { "sub",	Ev, Gv, XX },  { "sub",	Gb, Eb, XX },  { "sub",	Gv, Ev, XX },  { "sub",	AL, Ib, XX },  { "sub",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },			/* SEG CS prefix */  { "(bad)",	XX, XX, XX },   /* Reserved.  */  /* 30 */  { "xor",	Eb, Gb, XX },  { "xor",	Ev, Gv, XX },  { "xor",	Gb, Eb, XX },  { "xor",	Gv, Ev, XX },  { "xor",	AL, Ib, XX },  { "xor",	eAX, Iv, XX },  { "(bad)",	XX, XX, XX },			/* SEG SS prefix */  { "(bad)",	XX, XX, XX },   /* Reserved.  */  /* 38 */  { "cmp",	Eb, Gb, XX },

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?