-static const struct dis386 dis386_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 },
- { "push", es, XX, XX },
- { "pop", es, XX, XX },
- /* 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 },
- { "push", cs, XX, XX },
- { "(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 },
- { "push", ss, XX, XX },
- { "pop", ss, XX, XX },
- /* 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 },
- { "push", ds, XX, XX },
- { "pop", ds, XX, XX },
- /* 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 */
- { "daa", XX, XX, XX },
- /* 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 */
- { "das", XX, XX, XX },
- /* 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 */
- { "aaa", XX, XX, XX },
- /* 38 */
- { "cmp", Eb, Gb, XX },
- { "cmp", Ev, Gv, XX },
- { "cmp", Gb, Eb, XX },
- { "cmp", Gv, Ev, XX },
- { "cmp", AL, Ib, XX },
- { "cmp", eAX, Iv, XX },
- { "(bad)", XX, XX, XX }, /* SEG DS prefix */
- { "aas", XX, XX, XX },
- /* 40 */
- { "inc", RMeAX, XX, XX },
- { "inc", RMeCX, XX, XX },
- { "inc", RMeDX, XX, XX },
- { "inc", RMeBX, XX, XX },
- { "inc", RMeSP, XX, XX },
- { "inc", RMeBP, XX, XX },
- { "inc", RMeSI, XX, XX },
- { "inc", RMeDI, XX, XX },
- /* 48 */
- { "dec", RMeAX, XX, XX },
- { "dec", RMeCX, XX, XX },
- { "dec", RMeDX, XX, XX },
- { "dec", RMeBX, XX, XX },
- { "dec", RMeSP, XX, XX },
- { "dec", RMeBP, XX, XX },
- { "dec", RMeSI, XX, XX },
- { "dec", RMeDI, XX, XX },
- /* 50 */
- { "push", RMeAX, XX, XX },
- { "push", RMeCX, XX, XX },
- { "push", RMeDX, XX, XX },
- { "push", RMeBX, XX, XX },
- { "push", RMeSP, XX, XX },
- { "push", RMeBP, XX, XX },
- { "push", RMeSI, XX, XX },
- { "push", RMeDI, XX, XX },
- /* 58 */
- { "pop", RMeAX, XX, XX },
- { "pop", RMeCX, XX, XX },
- { "pop", RMeDX, XX, XX },
- { "pop", RMeBX, XX, XX },
- { "pop", RMeSP, XX, XX },
- { "pop", RMeBP, XX, XX },
- { "pop", RMeSI, XX, XX },
- { "pop", RMeDI, XX, XX },
- /* 60 */
- { "pusha", XX, XX, XX },
- { "popa", XX, XX, XX },
- { "bound", Gv, Ma, XX },
- { "arpl", Ew, Gw, 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 */
- { "push", Iv, XX, XX }, /* 386 book wrong */
- { "imul", Gv, Ev, Iv },
- { "push", sIb, XX, XX }, /* push of byte really pushes 2 or 4 bytes */
- { "imul", Gv, Ev, sIb },
- { "ins", Yb, indirDX, XX },
- { "ins", Yv, indirDX, XX },
- { "outs", indirDX, Xb, XX },
- { "outs", indirDX, Xv, XX },
- /* 70 */
- { "jo", Jb, XX, XX },
- { "jno", Jb, XX, XX },
- { "jb", Jb, XX, XX },
- { "jae", Jb, XX, XX },
- { "je", Jb, XX, XX },
- { "jne", Jb, XX, XX },
- { "jbe", Jb, XX, XX },
- { "ja", Jb, XX, XX },
- /* 78 */
- { "js", Jb, XX, XX },
- { "jns", Jb, XX, XX },
- { "jp", Jb, XX, XX },
- { "jnp", Jb, XX, XX },
- { "jl", Jb, XX, XX },
- { "jge", Jb, XX, XX },
- { "jle", Jb, XX, XX },
- { "jg", Jb, XX, XX },
- /* 80 */
- { GRP1b },
- { GRP1S },
- { "(bad)", XX, XX, XX },
- { GRP1Ss },
- { "test", Eb, Gb, XX },
- { "test", Ev, Gv, XX },
- { "xchg", Eb, Gb, XX },
- { "xchg", Ev, Gv, XX },
- /* 88 */
- { "mov", Eb, Gb, XX },
- { "mov", Ev, Gv, XX },
- { "mov", Gb, Eb, XX },
- { "mov", Gv, Ev, XX },
- { "mov", Ev, Sw, XX },
- { "lea", Gv, M, XX },
- { "mov", Sw, Ev, XX },
- { "pop", Ev, XX, XX },
- /* 90 */
- { "nop", XX, XX, XX },
- /* FIXME: NOP with REPz prefix is called PAUSE. */
- { "xchg", RMeCX, eAX, XX },
- { "xchg", RMeDX, eAX, XX },
- { "xchg", RMeBX, eAX, XX },
- { "xchg", RMeSP, eAX, XX },
- { "xchg", RMeBP, eAX, XX },
- { "xchg", RMeSI, eAX, XX },
- { "xchg", RMeDI, eAX, XX },
- /* 98 */
- { "cW", XX, XX, XX }, /* cwde and cbw */
- { "cR", XX, XX, XX }, /* cdq and cwd */
- { "lcall", Ap, XX, XX },
- { "(bad)", XX, XX, XX }, /* fwait */
- { "pushf", XX, XX, XX },
- { "popf", XX, XX, XX },
- { "sahf", XX, XX, XX },
- { "lahf", XX, XX, XX },
- /* a0 */
- { "mov", AL, Ob, XX },
- { "mov", eAX, Ov, XX },
- { "mov", Ob, AL, XX },
- { "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, XX, XX },
- { "jno", Jb, XX, XX },
- { "jb", Jb, XX, XX },
- { "jae", Jb, XX, XX },
- { "je", Jb, XX, XX },
- { "jne", Jb, XX, XX },
- { "jbe", Jb, XX, XX },
- { "ja", Jb, XX, XX },
- /* 78 */
- { "js", Jb, XX, XX },
- { "jns", Jb, XX, XX },
- { "jp", Jb, XX, XX },
- { "jnp", Jb, XX, XX },
- { "jl", Jb, XX, XX },
- { "jge", Jb, XX, XX },
- { "jle", Jb, XX, XX },
- { "jg", Jb, XX, 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 },
- { "lretI", Iw, XX, XX },
- { "lretI", XX, XX, XX },
- { "int3", XX, XX, XX },
- { "int", Ib, XX, XX },
- { "(bad)", XX, XX, XX }, /* reserved. */
- { "iretI", 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 */
- { "loopne", Jb, XX, XX },
- { "loope", Jb, XX, XX },
- { "loop", Jb, XX, XX },
- { "jEcxz", Jb, XX, 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 },
-};