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 + -
显示快捷键?