[BACK]Return to db_disasm.c CVS log [TXT][DIR] Up to [local] / sys / arch / i386 / i386

Annotation of sys/arch/i386/i386/db_disasm.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: db_disasm.c,v 1.14 2006/09/19 11:06:33 jsg Exp $      */
        !             2: /*     $NetBSD: db_disasm.c,v 1.11 1996/05/03 19:41:58 christos Exp $  */
        !             3:
        !             4: /*
        !             5:  * Mach Operating System
        !             6:  * Copyright (c) 1991,1990 Carnegie Mellon University
        !             7:  * All Rights Reserved.
        !             8:  *
        !             9:  * Permission to use, copy, modify and distribute this software and its
        !            10:  * documentation is hereby granted, provided that both the copyright
        !            11:  * notice and this permission notice appear in all copies of the
        !            12:  * software, derivative works or modified versions, and any portions
        !            13:  * thereof, and that both notices appear in supporting documentation.
        !            14:  *
        !            15:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !            16:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
        !            17:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            18:  *
        !            19:  * Carnegie Mellon requests users of this software to return to
        !            20:  *
        !            21:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
        !            22:  *  School of Computer Science
        !            23:  *  Carnegie Mellon University
        !            24:  *  Pittsburgh PA 15213-3890
        !            25:  *
        !            26:  * any improvements or extensions that they make and grant Carnegie Mellon
        !            27:  * the rights to redistribute these changes.
        !            28:  *
        !            29:  *     Id: db_disasm.c,v 2.6  92/01/03  20:05:00  dbg (CMU)
        !            30:  */
        !            31:
        !            32: /*
        !            33:  * Instruction disassembler.
        !            34:  */
        !            35: #include <sys/param.h>
        !            36: #include <sys/proc.h>
        !            37: #include <machine/db_machdep.h>
        !            38:
        !            39: #include <ddb/db_access.h>
        !            40: #include <ddb/db_sym.h>
        !            41: #include <ddb/db_output.h>
        !            42: #include <ddb/db_interface.h>
        !            43:
        !            44: /*
        !            45:  * Size attributes
        !            46:  */
        !            47: #define        BYTE    0
        !            48: #define        WORD    1
        !            49: #define        LONG    2
        !            50: #define        QUAD    3
        !            51: #define        SNGL    4
        !            52: #define        DBLR    5
        !            53: #define        EXTR    6
        !            54: #define        SDEP    7
        !            55: #define        NONE    8
        !            56:
        !            57: /*
        !            58:  * Addressing modes
        !            59:  */
        !            60: #define        E       1                       /* general effective address */
        !            61: #define        Eind    2                       /* indirect address (jump, call) */
        !            62: #define        Ew      3                       /* address, word size */
        !            63: #define        Eb      4                       /* address, byte size */
        !            64: #define        R       5                       /* register, in 'reg' field */
        !            65: #define        Rw      6                       /* word register, in 'reg' field */
        !            66: #define        Ri      7                       /* register in instruction */
        !            67: #define        S       8                       /* segment reg, in 'reg' field */
        !            68: #define        Si      9                       /* segment reg, in instruction */
        !            69: #define        A       10                      /* accumulator */
        !            70: #define        BX      11                      /* (bx) */
        !            71: #define        CL      12                      /* cl, for shifts */
        !            72: #define        DX      13                      /* dx, for IO */
        !            73: #define        SI      14                      /* si */
        !            74: #define        DI      15                      /* di */
        !            75: #define        CR      16                      /* control register */
        !            76: #define        DR      17                      /* debug register */
        !            77: #define        TR      18                      /* test register */
        !            78: #define        I       19                      /* immediate, unsigned */
        !            79: #define        Is      20                      /* immediate, signed */
        !            80: #define        Ib      21                      /* byte immediate, unsigned */
        !            81: #define        Ibs     22                      /* byte immediate, signed */
        !            82: #define        Iw      23                      /* word immediate, unsigned */
        !            83: #define        O       25                      /* direct address */
        !            84: #define        Db      26                      /* byte displacement from EIP */
        !            85: #define        Dl      27                      /* long displacement from EIP */
        !            86: #define        o1      28                      /* constant 1 */
        !            87: #define        o3      29                      /* constant 3 */
        !            88: #define        OS      30                      /* immediate offset/segment */
        !            89: #define        ST      31                      /* FP stack top */
        !            90: #define        STI     32                      /* FP stack */
        !            91: #define        X       33                      /* extended FP op */
        !            92: #define        XA      34                      /* for 'fstcw %ax' */
        !            93: #define        El      35                      /* address, long size */
        !            94: #define        Ril     36                      /* long register in instruction */
        !            95: #define        Iba     37                      /* byte immediate, don't print if 0xa */
        !            96:
        !            97: struct inst {
        !            98:        char *  i_name;                 /* name */
        !            99:        short   i_has_modrm;            /* has regmodrm byte */
        !           100:        short   i_size;                 /* operand size */
        !           101:        int     i_mode;                 /* addressing modes */
        !           102:        void *  i_extra;                /* pointer to extra opcode table */
        !           103: };
        !           104:
        !           105: #define        op1(x)          (x)
        !           106: #define        op2(x,y)        ((x)|((y)<<8))
        !           107: #define        op3(x,y,z)      ((x)|((y)<<8)|((z)<<16))
        !           108:
        !           109: struct finst {
        !           110:        char *  f_name;                 /* name for memory instruction */
        !           111:        int     f_size;                 /* size for memory instruction */
        !           112:        int     f_rrmode;               /* mode for rr instruction */
        !           113:        void *  f_rrname;               /* name for rr instruction
        !           114:                                           (or pointer to table) */
        !           115: };
        !           116:
        !           117: char * db_Grp6[] = {
        !           118:        "sldt",         "str",          "lldt",         "ltr",
        !           119:        "verr",         "verw",         "",             ""
        !           120: };
        !           121:
        !           122: char * db_Grp7[] = {
        !           123:        "sgdt",         "sidt",         "lgdt",         "lidt",
        !           124:        "smsw",         "",             "lmsw",         "invlpg"
        !           125: };
        !           126:
        !           127: char * db_Grp8[] = {
        !           128:        "",             "",             "",             "",
        !           129:        "bt",           "bts",          "btr",          "btc"
        !           130: };
        !           131:
        !           132: char * db_Grp9[] = {
        !           133:        "fxsave",       "fxrstor",      "",             "",
        !           134:        "",             "",             "",             ""
        !           135: };
        !           136:
        !           137: char * db_GrpA[] = {
        !           138:        "",             "cmpxchg8b",    "",             "",
        !           139:        "",             "",             "",             ""
        !           140: };
        !           141:
        !           142: char * db_GrpB[] = {
        !           143:        "xstore-rng",   "xcrypt-ecb",   "xcrypt-cbc",   "xcrypt-ctr",
        !           144:        "xcrypt-cfb",   "xcrypt-ofb",   "",             ""
        !           145: };
        !           146:
        !           147: char * db_GrpC[] = {
        !           148:        "montmul",      "xsha1",        "xsha256",      "",
        !           149:        "",             "",             "",             ""
        !           150: };
        !           151:
        !           152: struct inst db_inst_0f0x[] = {
        !           153: /*00*/ { "",      TRUE,  NONE,  op1(Ew),     db_Grp6 },
        !           154: /*01*/ { "",      TRUE,  NONE,  op1(Ew),     db_Grp7 },
        !           155: /*02*/ { "lar",   TRUE,  LONG,  op2(E,R),    0 },
        !           156: /*03*/ { "lsl",   TRUE,  LONG,  op2(E,R),    0 },
        !           157: /*04*/ { "",      FALSE, NONE,  0,           0 },
        !           158: /*05*/ { "",      FALSE, NONE,  0,           0 },
        !           159: /*06*/ { "clts",  FALSE, NONE,  0,           0 },
        !           160: /*07*/ { "",      FALSE, NONE,  0,           0 },
        !           161:
        !           162: /*08*/ { "invd",  FALSE, NONE,  0,           0 },
        !           163: /*09*/ { "wbinvd",FALSE, NONE,  0,           0 },
        !           164: /*0a*/ { "",      FALSE, NONE,  0,           0 },
        !           165: /*0b*/ { "",      FALSE, NONE,  0,           0 },
        !           166: /*0c*/ { "",      FALSE, NONE,  0,           0 },
        !           167: /*0d*/ { "",      FALSE, NONE,  0,           0 },
        !           168: /*0e*/ { "",      FALSE, NONE,  0,           0 },
        !           169: /*0f*/ { "",      FALSE, NONE,  0,           0 },
        !           170: };
        !           171:
        !           172: struct inst    db_inst_0f2x[] = {
        !           173: /*20*/ { "mov",   TRUE,  LONG,  op2(CR,E),   0 }, /* use E for reg */
        !           174: /*21*/ { "mov",   TRUE,  LONG,  op2(DR,E),   0 }, /* since mod == 11 */
        !           175: /*22*/ { "mov",   TRUE,  LONG,  op2(E,CR),   0 },
        !           176: /*23*/ { "mov",   TRUE,  LONG,  op2(E,DR),   0 },
        !           177: /*24*/ { "mov",   TRUE,  LONG,  op2(TR,E),   0 },
        !           178: /*25*/ { "",      FALSE, NONE,  0,           0 },
        !           179: /*26*/ { "mov",   TRUE,  LONG,  op2(E,TR),   0 },
        !           180: /*27*/ { "",      FALSE, NONE,  0,           0 },
        !           181:
        !           182: /*28*/ { "",      FALSE, NONE,  0,           0 },
        !           183: /*29*/ { "",      FALSE, NONE,  0,           0 },
        !           184: /*2a*/ { "",      FALSE, NONE,  0,           0 },
        !           185: /*2b*/ { "",      FALSE, NONE,  0,           0 },
        !           186: /*2c*/ { "",      FALSE, NONE,  0,           0 },
        !           187: /*2d*/ { "",      FALSE, NONE,  0,           0 },
        !           188: /*2e*/ { "",      FALSE, NONE,  0,           0 },
        !           189: /*2f*/ { "",      FALSE, NONE,  0,           0 },
        !           190: };
        !           191:
        !           192: struct inst    db_inst_0f3x[] = {
        !           193: /*30*/ { "wrmsr", FALSE, NONE,  0,           0 },
        !           194: /*31*/ { "rdtsc", FALSE, NONE,  0,           0 },
        !           195: /*32*/ { "rdmsr", FALSE, NONE,  0,           0 },
        !           196: /*33*/ { "rdpmc", FALSE, NONE,  0,           0 },
        !           197: /*34*/ { "",      FALSE, NONE,  0,           0 },
        !           198: /*35*/ { "",      FALSE, NONE,  0,           0 },
        !           199: /*36*/ { "",      FALSE, NONE,  0,           0 },
        !           200: /*37*/ { "",      FALSE, NONE,  0,           0 },
        !           201:
        !           202: /*38*/ { "",      FALSE, NONE,  0,           0 },
        !           203: /*39*/ { "",      FALSE, NONE,  0,           0 },
        !           204: /*3a*/ { "",      FALSE, NONE,  0,           0 },
        !           205: /*3b*/ { "",      FALSE, NONE,  0,           0 },
        !           206: /*3c*/ { "",      FALSE, NONE,  0,           0 },
        !           207: /*3d*/ { "",      FALSE, NONE,  0,           0 },
        !           208: /*3e*/ { "",      FALSE, NONE,  0,           0 },
        !           209: /*3f*/ { "",      FALSE, NONE,  0,           0 },
        !           210: };
        !           211:
        !           212: struct inst    db_inst_0f8x[] = {
        !           213: /*80*/ { "jo",    FALSE, NONE,  op1(Dl),     0 },
        !           214: /*81*/ { "jno",   FALSE, NONE,  op1(Dl),     0 },
        !           215: /*82*/ { "jb",    FALSE, NONE,  op1(Dl),     0 },
        !           216: /*83*/ { "jnb",   FALSE, NONE,  op1(Dl),     0 },
        !           217: /*84*/ { "jz",    FALSE, NONE,  op1(Dl),     0 },
        !           218: /*85*/ { "jnz",   FALSE, NONE,  op1(Dl),     0 },
        !           219: /*86*/ { "jbe",   FALSE, NONE,  op1(Dl),     0 },
        !           220: /*87*/ { "jnbe",  FALSE, NONE,  op1(Dl),     0 },
        !           221:
        !           222: /*88*/ { "js",    FALSE, NONE,  op1(Dl),     0 },
        !           223: /*89*/ { "jns",   FALSE, NONE,  op1(Dl),     0 },
        !           224: /*8a*/ { "jp",    FALSE, NONE,  op1(Dl),     0 },
        !           225: /*8b*/ { "jnp",   FALSE, NONE,  op1(Dl),     0 },
        !           226: /*8c*/ { "jl",    FALSE, NONE,  op1(Dl),     0 },
        !           227: /*8d*/ { "jnl",   FALSE, NONE,  op1(Dl),     0 },
        !           228: /*8e*/ { "jle",   FALSE, NONE,  op1(Dl),     0 },
        !           229: /*8f*/ { "jnle",  FALSE, NONE,  op1(Dl),     0 },
        !           230: };
        !           231:
        !           232: struct inst    db_inst_0f9x[] = {
        !           233: /*90*/ { "seto",  TRUE,  NONE,  op1(Eb),     0 },
        !           234: /*91*/ { "setno", TRUE,  NONE,  op1(Eb),     0 },
        !           235: /*92*/ { "setb",  TRUE,  NONE,  op1(Eb),     0 },
        !           236: /*93*/ { "setnb", TRUE,  NONE,  op1(Eb),     0 },
        !           237: /*94*/ { "setz",  TRUE,  NONE,  op1(Eb),     0 },
        !           238: /*95*/ { "setnz", TRUE,  NONE,  op1(Eb),     0 },
        !           239: /*96*/ { "setbe", TRUE,  NONE,  op1(Eb),     0 },
        !           240: /*97*/ { "setnbe",TRUE,  NONE,  op1(Eb),     0 },
        !           241:
        !           242: /*98*/ { "sets",  TRUE,  NONE,  op1(Eb),     0 },
        !           243: /*99*/ { "setns", TRUE,  NONE,  op1(Eb),     0 },
        !           244: /*9a*/ { "setp",  TRUE,  NONE,  op1(Eb),     0 },
        !           245: /*9b*/ { "setnp", TRUE,  NONE,  op1(Eb),     0 },
        !           246: /*9c*/ { "setl",  TRUE,  NONE,  op1(Eb),     0 },
        !           247: /*9d*/ { "setnl", TRUE,  NONE,  op1(Eb),     0 },
        !           248: /*9e*/ { "setle", TRUE,  NONE,  op1(Eb),     0 },
        !           249: /*9f*/ { "setnle",TRUE,  NONE,  op1(Eb),     0 },
        !           250: };
        !           251:
        !           252: struct inst    db_inst_0fax[] = {
        !           253: /*a0*/ { "push",  FALSE, NONE,  op1(Si),     0 },
        !           254: /*a1*/ { "pop",   FALSE, NONE,  op1(Si),     0 },
        !           255: /*a2*/ { "cpuid", FALSE, NONE,  0,           0 },
        !           256: /*a3*/ { "bt",    TRUE,  LONG,  op2(R,E),    0 },
        !           257: /*a4*/ { "shld",  TRUE,  LONG,  op3(Ib,R,E), 0 },
        !           258: /*a5*/ { "shld",  TRUE,  LONG,  op3(CL,R,E), 0 },
        !           259: /*a6*/ { "",      TRUE,  NONE,  0,           db_GrpC },
        !           260: /*a7*/ { "",      TRUE,  NONE,  0,           db_GrpB },
        !           261:
        !           262: /*a8*/ { "push",  FALSE, NONE,  op1(Si),     0 },
        !           263: /*a9*/ { "pop",   FALSE, NONE,  op1(Si),     0 },
        !           264: /*aa*/ { "",      FALSE, NONE,  0,           0 },
        !           265: /*ab*/ { "bts",   TRUE,  LONG,  op2(R,E),    0 },
        !           266: /*ac*/ { "shrd",  TRUE,  LONG,  op3(Ib,E,R), 0 },
        !           267: /*ad*/ { "shrd",  TRUE,  LONG,  op3(CL,E,R), 0 },
        !           268: /*ae*/ { "",      TRUE,  NONE,  op1(E),      db_Grp9 },
        !           269: /*af*/ { "imul",  TRUE,  LONG,  op2(E,R),    0 },
        !           270: };
        !           271:
        !           272: struct inst    db_inst_0fbx[] = {
        !           273: /*b0*/ { "cmpxchg",TRUE, BYTE,  op2(R, E),   0 },
        !           274: /*b1*/ { "cmpxchg",TRUE, LONG,  op2(R, E),   0 },
        !           275: /*b2*/ { "lss",   TRUE,  LONG,  op2(E, R),   0 },
        !           276: /*b3*/ { "btr",   TRUE,  LONG,  op2(R, E),   0 },
        !           277: /*b4*/ { "lfs",   TRUE,  LONG,  op2(E, R),   0 },
        !           278: /*b5*/ { "lgs",   TRUE,  LONG,  op2(E, R),   0 },
        !           279: /*b6*/ { "movzb", TRUE,  LONG,  op2(Eb, R),  0 },
        !           280: /*b7*/ { "movzw", TRUE,  LONG,  op2(Ew, R),  0 },
        !           281:
        !           282: /*b8*/ { "",      FALSE, NONE,  0,           0 },
        !           283: /*b9*/ { "",      FALSE, NONE,  0,           0 },
        !           284: /*ba*/ { "",      TRUE,  LONG,  op2(Ib, E),  db_Grp8 },
        !           285: /*bb*/ { "btc",   TRUE,  LONG,  op2(R, E),   0 },
        !           286: /*bc*/ { "bsf",   TRUE,  LONG,  op2(E, R),   0 },
        !           287: /*bd*/ { "bsr",   TRUE,  LONG,  op2(E, R),   0 },
        !           288: /*be*/ { "movsb", TRUE,  LONG,  op2(Eb, R),  0 },
        !           289: /*bf*/ { "movsw", TRUE,  LONG,  op2(Ew, R),  0 },
        !           290: };
        !           291:
        !           292: struct inst    db_inst_0fcx[] = {
        !           293: /*c0*/ { "xadd",  TRUE,  BYTE,  op2(R, E),   0 },
        !           294: /*c1*/ { "xadd",  TRUE,  LONG,  op2(R, E),   0 },
        !           295: /*c2*/ { "",      FALSE, NONE,  0,           0 },
        !           296: /*c3*/ { "",      FALSE, NONE,  0,           0 },
        !           297: /*c4*/ { "",      FALSE, NONE,  0,           0 },
        !           298: /*c5*/ { "",      FALSE, NONE,  0,           0 },
        !           299: /*c6*/ { "",      FALSE, NONE,  0,           0 },
        !           300: /*c7*/ { "",      TRUE,  NONE,  op1(E),      db_GrpA },
        !           301:
        !           302: /*c8*/ { "bswap", FALSE, LONG,  op1(Ril),    0 },
        !           303: /*c9*/ { "bswap", FALSE, LONG,  op1(Ril),    0 },
        !           304: /*ca*/ { "bswap", FALSE, LONG,  op1(Ril),    0 },
        !           305: /*cb*/ { "bswap", FALSE, LONG,  op1(Ril),    0 },
        !           306: /*cc*/ { "bswap", FALSE, LONG,  op1(Ril),    0 },
        !           307: /*cd*/ { "bswap", FALSE, LONG,  op1(Ril),    0 },
        !           308: /*ce*/ { "bswap", FALSE, LONG,  op1(Ril),    0 },
        !           309: /*cf*/ { "bswap", FALSE, LONG,  op1(Ril),    0 },
        !           310: };
        !           311:
        !           312: struct inst *db_inst_0f[] = {
        !           313:        db_inst_0f0x,
        !           314:        NULL,
        !           315:        db_inst_0f2x,
        !           316:        db_inst_0f3x,
        !           317:        NULL,
        !           318:        NULL,
        !           319:        NULL,
        !           320:        NULL,
        !           321:        db_inst_0f8x,
        !           322:        db_inst_0f9x,
        !           323:        db_inst_0fax,
        !           324:        db_inst_0fbx,
        !           325:        db_inst_0fcx,
        !           326:        NULL,
        !           327:        NULL,
        !           328:        NULL
        !           329: };
        !           330:
        !           331: char * db_Esc92[] = {
        !           332:        "fnop",         "",             "",             "",
        !           333:        "",             "",             "",             ""
        !           334: };
        !           335: char * db_Esc94[] = {
        !           336:        "fchs",         "fabs",         "",             "",
        !           337:        "ftst",         "fxam",         "",             ""
        !           338: };
        !           339: char * db_Esc95[] = {
        !           340:        "fld1",         "fldl2t",       "fldl2e",       "fldpi",
        !           341:        "fldlg2",       "fldln2",       "fldz",         ""
        !           342: };
        !           343: char * db_Esc96[] = {
        !           344:        "f2xm1",        "fyl2x",        "fptan",        "fpatan",
        !           345:        "fxtract",      "fprem1",       "fdecstp",      "fincstp"
        !           346: };
        !           347: char * db_Esc97[] = {
        !           348:        "fprem",        "fyl2xp1",      "fsqrt",        "fsincos",
        !           349:        "frndint",      "fscale",       "fsin",         "fcos"
        !           350: };
        !           351:
        !           352: char * db_Esca5[] = {
        !           353:        "",             "fucompp",      "",             "",
        !           354:        "",             "",             "",             ""
        !           355: };
        !           356:
        !           357: char * db_Escb4[] = {
        !           358:        "fneni",        "fndisi",       "fnclex",       "fninit",
        !           359:        "fsetpm",       "",             "",             ""
        !           360: };
        !           361:
        !           362: char * db_Esce3[] = {
        !           363:        "",             "fcompp",       "",             "",
        !           364:        "",             "",             "",             ""
        !           365: };
        !           366:
        !           367: char * db_Escf4[] = {
        !           368:        "fnstsw",       "",             "",             "",
        !           369:        "",             "",             "",             ""
        !           370: };
        !           371:
        !           372: struct finst db_Esc8[] = {
        !           373: /*0*/  { "fadd",   SNGL,  op2(STI,ST), 0 },
        !           374: /*1*/  { "fmul",   SNGL,  op2(STI,ST), 0 },
        !           375: /*2*/  { "fcom",   SNGL,  op2(STI,ST), 0 },
        !           376: /*3*/  { "fcomp",  SNGL,  op2(STI,ST), 0 },
        !           377: /*4*/  { "fsub",   SNGL,  op2(STI,ST), 0 },
        !           378: /*5*/  { "fsubr",  SNGL,  op2(STI,ST), 0 },
        !           379: /*6*/  { "fdiv",   SNGL,  op2(STI,ST), 0 },
        !           380: /*7*/  { "fdivr",  SNGL,  op2(STI,ST), 0 },
        !           381: };
        !           382:
        !           383: struct finst db_Esc9[] = {
        !           384: /*0*/  { "fld",    SNGL,  op1(STI),    0 },
        !           385: /*1*/  { "",       NONE,  op1(STI),    "fxch" },
        !           386: /*2*/  { "fst",    SNGL,  op1(X),      db_Esc92 },
        !           387: /*3*/  { "fstp",   SNGL,  op1(X),      0 },
        !           388: /*4*/  { "fldenv", NONE,  op1(X),      db_Esc94 },
        !           389: /*5*/  { "fldcw",  NONE,  op1(X),      db_Esc95 },
        !           390: /*6*/  { "fnstenv",NONE,  op1(X),      db_Esc96 },
        !           391: /*7*/  { "fnstcw", NONE,  op1(X),      db_Esc97 },
        !           392: };
        !           393:
        !           394: struct finst db_Esca[] = {
        !           395: /*0*/  { "fiadd",  LONG,  0,           0 },
        !           396: /*1*/  { "fimul",  LONG,  0,           0 },
        !           397: /*2*/  { "ficom",  LONG,  0,           0 },
        !           398: /*3*/  { "ficomp", LONG,  0,           0 },
        !           399: /*4*/  { "fisub",  LONG,  op1(X),      0 },
        !           400: /*5*/  { "fisubr", LONG,  0,           0 },
        !           401: /*6*/  { "fidiv",  LONG,  0,           0 },
        !           402: /*7*/  { "fidivr", LONG,  0,           0 }
        !           403: };
        !           404:
        !           405: struct finst db_Escb[] = {
        !           406: /*0*/  { "fild",   LONG,  0,           0 },
        !           407: /*1*/  { "",       NONE,  0,           0 },
        !           408: /*2*/  { "fist",   LONG,  0,           0 },
        !           409: /*3*/  { "fistp",  LONG,  0,           0 },
        !           410: /*4*/  { "",       WORD,  op1(X),      db_Escb4 },
        !           411: /*5*/  { "fld",    EXTR,  0,           0 },
        !           412: /*6*/  { "",       WORD,  0,           0 },
        !           413: /*7*/  { "fstp",   EXTR,  0,           0 },
        !           414: };
        !           415:
        !           416: struct finst db_Escc[] = {
        !           417: /*0*/  { "fadd",   DBLR,  op2(ST,STI), 0 },
        !           418: /*1*/  { "fmul",   DBLR,  op2(ST,STI), 0 },
        !           419: /*2*/  { "fcom",   DBLR,  0,           0 },
        !           420: /*3*/  { "fcomp",  DBLR,  0,           0 },
        !           421: /*4*/  { "fsub",   DBLR,  op2(ST,STI), "fsubr" },
        !           422: /*5*/  { "fsubr",  DBLR,  op2(ST,STI), "fsub" },
        !           423: /*6*/  { "fdiv",   DBLR,  op2(ST,STI), "fdivr" },
        !           424: /*7*/  { "fdivr",  DBLR,  op2(ST,STI), "fdiv" },
        !           425: };
        !           426:
        !           427: struct finst db_Escd[] = {
        !           428: /*0*/  { "fld",    DBLR,  op1(STI),    "ffree" },
        !           429: /*1*/  { "",       NONE,  0,           0 },
        !           430: /*2*/  { "fst",    DBLR,  op1(STI),    0 },
        !           431: /*3*/  { "fstp",   DBLR,  op1(STI),    0 },
        !           432: /*4*/  { "frstor", NONE,  op1(STI),    "fucom" },
        !           433: /*5*/  { "",       NONE,  op1(STI),    "fucomp" },
        !           434: /*6*/  { "fnsave", NONE,  0,           0 },
        !           435: /*7*/  { "fnstsw", NONE,  0,           0 },
        !           436: };
        !           437:
        !           438: struct finst db_Esce[] = {
        !           439: /*0*/  { "fiadd",  WORD,  op2(ST,STI), "faddp" },
        !           440: /*1*/  { "fimul",  WORD,  op2(ST,STI), "fmulp" },
        !           441: /*2*/  { "ficom",  WORD,  0,           0 },
        !           442: /*3*/  { "ficomp", WORD,  op1(X),      db_Esce3 },
        !           443: /*4*/  { "fisub",  WORD,  op2(ST,STI), "fsubrp" },
        !           444: /*5*/  { "fisubr", WORD,  op2(ST,STI), "fsubp" },
        !           445: /*6*/  { "fidiv",  WORD,  op2(ST,STI), "fdivrp" },
        !           446: /*7*/  { "fidivr", WORD,  op2(ST,STI), "fdivp" },
        !           447: };
        !           448:
        !           449: struct finst db_Escf[] = {
        !           450: /*0*/  { "fild",   WORD,  0,           0 },
        !           451: /*1*/  { "",       WORD,  0,           0 },
        !           452: /*2*/  { "fist",   WORD,  0,           0 },
        !           453: /*3*/  { "fistp",  WORD,  0,           0 },
        !           454: /*4*/  { "fbld",   NONE,  op1(XA),     db_Escf4 },
        !           455: /*5*/  { "fild",   QUAD,  0,           0 },
        !           456: /*6*/  { "fbstp",  NONE,  0,           0 },
        !           457: /*7*/  { "fistp",  QUAD,  0,           0 },
        !           458: };
        !           459:
        !           460: struct finst *db_Esc_inst[] = {
        !           461:        db_Esc8, db_Esc9, db_Esca, db_Escb,
        !           462:        db_Escc, db_Escd, db_Esce, db_Escf
        !           463: };
        !           464:
        !           465: char * db_Grp1[] = {
        !           466:        "add",
        !           467:        "or",
        !           468:        "adc",
        !           469:        "sbb",
        !           470:        "and",
        !           471:        "sub",
        !           472:        "xor",
        !           473:        "cmp"
        !           474: };
        !           475:
        !           476: char * db_Grp2[] = {
        !           477:        "rol",
        !           478:        "ror",
        !           479:        "rcl",
        !           480:        "rcr",
        !           481:        "shl",
        !           482:        "shr",
        !           483:        "shl",
        !           484:        "sar"
        !           485: };
        !           486:
        !           487: struct inst db_Grp3[] = {
        !           488:        { "test",  TRUE, NONE, op2(I,E), 0 },
        !           489:        { "test",  TRUE, NONE, op2(I,E), 0 },
        !           490:        { "not",   TRUE, NONE, op1(E),   0 },
        !           491:        { "neg",   TRUE, NONE, op1(E),   0 },
        !           492:        { "mul",   TRUE, NONE, op2(E,A), 0 },
        !           493:        { "imul",  TRUE, NONE, op2(E,A), 0 },
        !           494:        { "div",   TRUE, NONE, op2(E,A), 0 },
        !           495:        { "idiv",  TRUE, NONE, op2(E,A), 0 },
        !           496: };
        !           497:
        !           498: struct inst    db_Grp4[] = {
        !           499:        { "inc",   TRUE, BYTE, op1(E),   0 },
        !           500:        { "dec",   TRUE, BYTE, op1(E),   0 },
        !           501:        { "",      TRUE, NONE, 0,        0 },
        !           502:        { "",      TRUE, NONE, 0,        0 },
        !           503:        { "",      TRUE, NONE, 0,        0 },
        !           504:        { "",      TRUE, NONE, 0,        0 },
        !           505:        { "",      TRUE, NONE, 0,        0 },
        !           506:        { "",      TRUE, NONE, 0,        0 }
        !           507: };
        !           508:
        !           509: struct inst    db_Grp5[] = {
        !           510:        { "inc",   TRUE, LONG, op1(E),   0 },
        !           511:        { "dec",   TRUE, LONG, op1(E),   0 },
        !           512:        { "call",  TRUE, NONE, op1(Eind),0 },
        !           513:        { "lcall", TRUE, NONE, op1(Eind),0 },
        !           514:        { "jmp",   TRUE, NONE, op1(Eind),0 },
        !           515:        { "ljmp",  TRUE, NONE, op1(Eind),0 },
        !           516:        { "push",  TRUE, LONG, op1(E),   0 },
        !           517:        { "",      TRUE, NONE, 0,        0 }
        !           518: };
        !           519:
        !           520: struct inst db_inst_table[256] = {
        !           521: /*00*/ { "add",   TRUE,  BYTE,  op2(R, E),  0 },
        !           522: /*01*/ { "add",   TRUE,  LONG,  op2(R, E),  0 },
        !           523: /*02*/ { "add",   TRUE,  BYTE,  op2(E, R),  0 },
        !           524: /*03*/ { "add",   TRUE,  LONG,  op2(E, R),  0 },
        !           525: /*04*/ { "add",   FALSE, BYTE,  op2(I, A),  0 },
        !           526: /*05*/ { "add",   FALSE, LONG,  op2(Is, A), 0 },
        !           527: /*06*/ { "push",  FALSE, NONE,  op1(Si),    0 },
        !           528: /*07*/ { "pop",   FALSE, NONE,  op1(Si),    0 },
        !           529:
        !           530: /*08*/ { "or",    TRUE,  BYTE,  op2(R, E),  0 },
        !           531: /*09*/ { "or",    TRUE,  LONG,  op2(R, E),  0 },
        !           532: /*0a*/ { "or",    TRUE,  BYTE,  op2(E, R),  0 },
        !           533: /*0b*/ { "or",    TRUE,  LONG,  op2(E, R),  0 },
        !           534: /*0c*/ { "or",    FALSE, BYTE,  op2(I, A),  0 },
        !           535: /*0d*/ { "or",    FALSE, LONG,  op2(I, A),  0 },
        !           536: /*0e*/ { "push",  FALSE, NONE,  op1(Si),    0 },
        !           537: /*0f*/ { "",      FALSE, NONE,  0,          0 },
        !           538:
        !           539: /*10*/ { "adc",   TRUE,  BYTE,  op2(R, E),  0 },
        !           540: /*11*/ { "adc",   TRUE,  LONG,  op2(R, E),  0 },
        !           541: /*12*/ { "adc",   TRUE,  BYTE,  op2(E, R),  0 },
        !           542: /*13*/ { "adc",   TRUE,  LONG,  op2(E, R),  0 },
        !           543: /*14*/ { "adc",   FALSE, BYTE,  op2(I, A),  0 },
        !           544: /*15*/ { "adc",   FALSE, LONG,  op2(Is, A), 0 },
        !           545: /*16*/ { "push",  FALSE, NONE,  op1(Si),    0 },
        !           546: /*17*/ { "pop",   FALSE, NONE,  op1(Si),    0 },
        !           547:
        !           548: /*18*/ { "sbb",   TRUE,  BYTE,  op2(R, E),  0 },
        !           549: /*19*/ { "sbb",   TRUE,  LONG,  op2(R, E),  0 },
        !           550: /*1a*/ { "sbb",   TRUE,  BYTE,  op2(E, R),  0 },
        !           551: /*1b*/ { "sbb",   TRUE,  LONG,  op2(E, R),  0 },
        !           552: /*1c*/ { "sbb",   FALSE, BYTE,  op2(I, A),  0 },
        !           553: /*1d*/ { "sbb",   FALSE, LONG,  op2(Is, A), 0 },
        !           554: /*1e*/ { "push",  FALSE, NONE,  op1(Si),    0 },
        !           555: /*1f*/ { "pop",   FALSE, NONE,  op1(Si),    0 },
        !           556:
        !           557: /*20*/ { "and",   TRUE,  BYTE,  op2(R, E),  0 },
        !           558: /*21*/ { "and",   TRUE,  LONG,  op2(R, E),  0 },
        !           559: /*22*/ { "and",   TRUE,  BYTE,  op2(E, R),  0 },
        !           560: /*23*/ { "and",   TRUE,  LONG,  op2(E, R),  0 },
        !           561: /*24*/ { "and",   FALSE, BYTE,  op2(I, A),  0 },
        !           562: /*25*/ { "and",   FALSE, LONG,  op2(I, A),  0 },
        !           563: /*26*/ { "",      FALSE, NONE,  0,          0 },
        !           564: /*27*/ { "daa",   FALSE, NONE,  0,          0 },
        !           565:
        !           566: /*28*/ { "sub",   TRUE,  BYTE,  op2(R, E),  0 },
        !           567: /*29*/ { "sub",   TRUE,  LONG,  op2(R, E),  0 },
        !           568: /*2a*/ { "sub",   TRUE,  BYTE,  op2(E, R),  0 },
        !           569: /*2b*/ { "sub",   TRUE,  LONG,  op2(E, R),  0 },
        !           570: /*2c*/ { "sub",   FALSE, BYTE,  op2(I, A),  0 },
        !           571: /*2d*/ { "sub",   FALSE, LONG,  op2(Is, A), 0 },
        !           572: /*2e*/ { "",      FALSE, NONE,  0,          0 },
        !           573: /*2f*/ { "das",   FALSE, NONE,  0,          0 },
        !           574:
        !           575: /*30*/ { "xor",   TRUE,  BYTE,  op2(R, E),  0 },
        !           576: /*31*/ { "xor",   TRUE,  LONG,  op2(R, E),  0 },
        !           577: /*32*/ { "xor",   TRUE,  BYTE,  op2(E, R),  0 },
        !           578: /*33*/ { "xor",   TRUE,  LONG,  op2(E, R),  0 },
        !           579: /*34*/ { "xor",   FALSE, BYTE,  op2(I, A),  0 },
        !           580: /*35*/ { "xor",   FALSE, LONG,  op2(I, A),  0 },
        !           581: /*36*/ { "",      FALSE, NONE,  0,          0 },
        !           582: /*37*/ { "aaa",   FALSE, NONE,  0,          0 },
        !           583:
        !           584: /*38*/ { "cmp",   TRUE,  BYTE,  op2(R, E),  0 },
        !           585: /*39*/ { "cmp",   TRUE,  LONG,  op2(R, E),  0 },
        !           586: /*3a*/ { "cmp",   TRUE,  BYTE,  op2(E, R),  0 },
        !           587: /*3b*/ { "cmp",   TRUE,  LONG,  op2(E, R),  0 },
        !           588: /*3c*/ { "cmp",   FALSE, BYTE,  op2(I, A),  0 },
        !           589: /*3d*/ { "cmp",   FALSE, LONG,  op2(Is, A), 0 },
        !           590: /*3e*/ { "",      FALSE, NONE,  0,          0 },
        !           591: /*3f*/ { "aas",   FALSE, NONE,  0,          0 },
        !           592:
        !           593: /*40*/ { "inc",   FALSE, LONG,  op1(Ri),    0 },
        !           594: /*41*/ { "inc",   FALSE, LONG,  op1(Ri),    0 },
        !           595: /*42*/ { "inc",   FALSE, LONG,  op1(Ri),    0 },
        !           596: /*43*/ { "inc",   FALSE, LONG,  op1(Ri),    0 },
        !           597: /*44*/ { "inc",   FALSE, LONG,  op1(Ri),    0 },
        !           598: /*45*/ { "inc",   FALSE, LONG,  op1(Ri),    0 },
        !           599: /*46*/ { "inc",   FALSE, LONG,  op1(Ri),    0 },
        !           600: /*47*/ { "inc",   FALSE, LONG,  op1(Ri),    0 },
        !           601:
        !           602: /*48*/ { "dec",   FALSE, LONG,  op1(Ri),    0 },
        !           603: /*49*/ { "dec",   FALSE, LONG,  op1(Ri),    0 },
        !           604: /*4a*/ { "dec",   FALSE, LONG,  op1(Ri),    0 },
        !           605: /*4b*/ { "dec",   FALSE, LONG,  op1(Ri),    0 },
        !           606: /*4c*/ { "dec",   FALSE, LONG,  op1(Ri),    0 },
        !           607: /*4d*/ { "dec",   FALSE, LONG,  op1(Ri),    0 },
        !           608: /*4e*/ { "dec",   FALSE, LONG,  op1(Ri),    0 },
        !           609: /*4f*/ { "dec",   FALSE, LONG,  op1(Ri),    0 },
        !           610:
        !           611: /*50*/ { "push",  FALSE, LONG,  op1(Ri),    0 },
        !           612: /*51*/ { "push",  FALSE, LONG,  op1(Ri),    0 },
        !           613: /*52*/ { "push",  FALSE, LONG,  op1(Ri),    0 },
        !           614: /*53*/ { "push",  FALSE, LONG,  op1(Ri),    0 },
        !           615: /*54*/ { "push",  FALSE, LONG,  op1(Ri),    0 },
        !           616: /*55*/ { "push",  FALSE, LONG,  op1(Ri),    0 },
        !           617: /*56*/ { "push",  FALSE, LONG,  op1(Ri),    0 },
        !           618: /*57*/ { "push",  FALSE, LONG,  op1(Ri),    0 },
        !           619:
        !           620: /*58*/ { "pop",   FALSE, LONG,  op1(Ri),    0 },
        !           621: /*59*/ { "pop",   FALSE, LONG,  op1(Ri),    0 },
        !           622: /*5a*/ { "pop",   FALSE, LONG,  op1(Ri),    0 },
        !           623: /*5b*/ { "pop",   FALSE, LONG,  op1(Ri),    0 },
        !           624: /*5c*/ { "pop",   FALSE, LONG,  op1(Ri),    0 },
        !           625: /*5d*/ { "pop",   FALSE, LONG,  op1(Ri),    0 },
        !           626: /*5e*/ { "pop",   FALSE, LONG,  op1(Ri),    0 },
        !           627: /*5f*/ { "pop",   FALSE, LONG,  op1(Ri),    0 },
        !           628:
        !           629: /*60*/ { "pusha", FALSE, LONG,  0,          0 },
        !           630: /*61*/ { "popa",  FALSE, LONG,  0,          0 },
        !           631: /*62*/ { "bound", TRUE,  LONG,  op2(E, R),  0 },
        !           632: /*63*/ { "arpl",  TRUE,  NONE,  op2(Rw,Ew), 0 },
        !           633: /*64*/ { "",      FALSE, NONE,  0,          0 },
        !           634: /*65*/ { "",      FALSE, NONE,  0,          0 },
        !           635: /*66*/ { "",      FALSE, NONE,  0,          0 },
        !           636: /*67*/ { "",      FALSE, NONE,  0,          0 },
        !           637:
        !           638: /*68*/ { "push",  FALSE, LONG,  op1(I),     0 },
        !           639: /*69*/ { "imul",  TRUE,  LONG,  op3(I,E,R), 0 },
        !           640: /*6a*/ { "push",  FALSE, LONG,  op1(Ibs),   0 },
        !           641: /*6b*/ { "imul",  TRUE,  LONG,  op3(Ibs,E,R),0 },
        !           642: /*6c*/ { "ins",   FALSE, BYTE,  op2(DX, DI), 0 },
        !           643: /*6d*/ { "ins",   FALSE, LONG,  op2(DX, DI), 0 },
        !           644: /*6e*/ { "outs",  FALSE, BYTE,  op2(SI, DX), 0 },
        !           645: /*6f*/ { "outs",  FALSE, LONG,  op2(SI, DX), 0 },
        !           646:
        !           647: /*70*/ { "jo",    FALSE, NONE,  op1(Db),     0 },
        !           648: /*71*/ { "jno",   FALSE, NONE,  op1(Db),     0 },
        !           649: /*72*/ { "jb",    FALSE, NONE,  op1(Db),     0 },
        !           650: /*73*/ { "jnb",   FALSE, NONE,  op1(Db),     0 },
        !           651: /*74*/ { "jz",    FALSE, NONE,  op1(Db),     0 },
        !           652: /*75*/ { "jnz",   FALSE, NONE,  op1(Db),     0 },
        !           653: /*76*/ { "jbe",   FALSE, NONE,  op1(Db),     0 },
        !           654: /*77*/ { "jnbe",  FALSE, NONE,  op1(Db),     0 },
        !           655:
        !           656: /*78*/ { "js",    FALSE, NONE,  op1(Db),     0 },
        !           657: /*79*/ { "jns",   FALSE, NONE,  op1(Db),     0 },
        !           658: /*7a*/ { "jp",    FALSE, NONE,  op1(Db),     0 },
        !           659: /*7b*/ { "jnp",   FALSE, NONE,  op1(Db),     0 },
        !           660: /*7c*/ { "jl",    FALSE, NONE,  op1(Db),     0 },
        !           661: /*7d*/ { "jnl",   FALSE, NONE,  op1(Db),     0 },
        !           662: /*7e*/ { "jle",   FALSE, NONE,  op1(Db),     0 },
        !           663: /*7f*/ { "jnle",  FALSE, NONE,  op1(Db),     0 },
        !           664:
        !           665: /*80*/ { "",      TRUE,  BYTE,  op2(I, E),   db_Grp1 },
        !           666: /*81*/ { "",      TRUE,  LONG,  op2(I, E),   db_Grp1 },
        !           667: /*82*/ { "",      TRUE,  BYTE,  op2(I, E),   db_Grp1 },
        !           668: /*83*/ { "",      TRUE,  LONG,  op2(Ibs,E),  db_Grp1 },
        !           669: /*84*/ { "test",  TRUE,  BYTE,  op2(R, E),   0 },
        !           670: /*85*/ { "test",  TRUE,  LONG,  op2(R, E),   0 },
        !           671: /*86*/ { "xchg",  TRUE,  BYTE,  op2(R, E),   0 },
        !           672: /*87*/ { "xchg",  TRUE,  LONG,  op2(R, E),   0 },
        !           673:
        !           674: /*88*/ { "mov",   TRUE,  BYTE,  op2(R, E),   0 },
        !           675: /*89*/ { "mov",   TRUE,  LONG,  op2(R, E),   0 },
        !           676: /*8a*/ { "mov",   TRUE,  BYTE,  op2(E, R),   0 },
        !           677: /*8b*/ { "mov",   TRUE,  LONG,  op2(E, R),   0 },
        !           678: /*8c*/ { "mov",   TRUE,  NONE,  op2(S, Ew),  0 },
        !           679: /*8d*/ { "lea",   TRUE,  LONG,  op2(E, R),   0 },
        !           680: /*8e*/ { "mov",   TRUE,  NONE,  op2(Ew, S),  0 },
        !           681: /*8f*/ { "pop",   TRUE,  LONG,  op1(E),      0 },
        !           682:
        !           683: /*90*/ { "nop",   FALSE, NONE,  0,           0 },
        !           684: /*91*/ { "xchg",  FALSE, LONG,  op2(A, Ri),  0 },
        !           685: /*92*/ { "xchg",  FALSE, LONG,  op2(A, Ri),  0 },
        !           686: /*93*/ { "xchg",  FALSE, LONG,  op2(A, Ri),  0 },
        !           687: /*94*/ { "xchg",  FALSE, LONG,  op2(A, Ri),  0 },
        !           688: /*95*/ { "xchg",  FALSE, LONG,  op2(A, Ri),  0 },
        !           689: /*96*/ { "xchg",  FALSE, LONG,  op2(A, Ri),  0 },
        !           690: /*97*/ { "xchg",  FALSE, LONG,  op2(A, Ri),  0 },
        !           691:
        !           692: /*98*/ { "cbw",   FALSE, SDEP,  0,           "cwde" }, /* cbw/cwde */
        !           693: /*99*/ { "cwd",   FALSE, SDEP,  0,           "cdq"  }, /* cwd/cdq */
        !           694: /*9a*/ { "lcall", FALSE, NONE,  op1(OS),     0 },
        !           695: /*9b*/ { "wait",  FALSE, NONE,  0,           0 },
        !           696: /*9c*/ { "pushf", FALSE, LONG,  0,           0 },
        !           697: /*9d*/ { "popf",  FALSE, LONG,  0,           0 },
        !           698: /*9e*/ { "sahf",  FALSE, NONE,  0,           0 },
        !           699: /*9f*/ { "lahf",  FALSE, NONE,  0,           0 },
        !           700:
        !           701: /*a0*/ { "mov",   FALSE, BYTE,  op2(O, A),   0 },
        !           702: /*a1*/ { "mov",   FALSE, LONG,  op2(O, A),   0 },
        !           703: /*a2*/ { "mov",   FALSE, BYTE,  op2(A, O),   0 },
        !           704: /*a3*/ { "mov",   FALSE, LONG,  op2(A, O),   0 },
        !           705: /*a4*/ { "movs",  FALSE, BYTE,  op2(SI,DI),  0 },
        !           706: /*a5*/ { "movs",  FALSE, LONG,  op2(SI,DI),  0 },
        !           707: /*a6*/ { "cmps",  FALSE, BYTE,  op2(SI,DI),  0 },
        !           708: /*a7*/ { "cmps",  FALSE, LONG,  op2(SI,DI),  0 },
        !           709:
        !           710: /*a8*/ { "test",  FALSE, BYTE,  op2(I, A),   0 },
        !           711: /*a9*/ { "test",  FALSE, LONG,  op2(I, A),   0 },
        !           712: /*aa*/ { "stos",  FALSE, BYTE,  op1(DI),     0 },
        !           713: /*ab*/ { "stos",  FALSE, LONG,  op1(DI),     0 },
        !           714: /*ac*/ { "lods",  FALSE, BYTE,  op1(SI),     0 },
        !           715: /*ad*/ { "lods",  FALSE, LONG,  op1(SI),     0 },
        !           716: /*ae*/ { "scas",  FALSE, BYTE,  op1(SI),     0 },
        !           717: /*af*/ { "scas",  FALSE, LONG,  op1(SI),     0 },
        !           718:
        !           719: /*b0*/ { "mov",   FALSE, BYTE,  op2(I, Ri),  0 },
        !           720: /*b1*/ { "mov",   FALSE, BYTE,  op2(I, Ri),  0 },
        !           721: /*b2*/ { "mov",   FALSE, BYTE,  op2(I, Ri),  0 },
        !           722: /*b3*/ { "mov",   FALSE, BYTE,  op2(I, Ri),  0 },
        !           723: /*b4*/ { "mov",   FALSE, BYTE,  op2(I, Ri),  0 },
        !           724: /*b5*/ { "mov",   FALSE, BYTE,  op2(I, Ri),  0 },
        !           725: /*b6*/ { "mov",   FALSE, BYTE,  op2(I, Ri),  0 },
        !           726: /*b7*/ { "mov",   FALSE, BYTE,  op2(I, Ri),  0 },
        !           727:
        !           728: /*b8*/ { "mov",   FALSE, LONG,  op2(I, Ri),  0 },
        !           729: /*b9*/ { "mov",   FALSE, LONG,  op2(I, Ri),  0 },
        !           730: /*ba*/ { "mov",   FALSE, LONG,  op2(I, Ri),  0 },
        !           731: /*bb*/ { "mov",   FALSE, LONG,  op2(I, Ri),  0 },
        !           732: /*bc*/ { "mov",   FALSE, LONG,  op2(I, Ri),  0 },
        !           733: /*bd*/ { "mov",   FALSE, LONG,  op2(I, Ri),  0 },
        !           734: /*be*/ { "mov",   FALSE, LONG,  op2(I, Ri),  0 },
        !           735: /*bf*/ { "mov",   FALSE, LONG,  op2(I, Ri),  0 },
        !           736:
        !           737: /*c0*/ { "",      TRUE,  BYTE,  op2(Ib, E),  db_Grp2 },
        !           738: /*c1*/ { "",      TRUE,  LONG,  op2(Ib, E),  db_Grp2 },
        !           739: /*c2*/ { "ret",   FALSE, NONE,  op1(Iw),     0 },
        !           740: /*c3*/ { "ret",   FALSE, NONE,  0,           0 },
        !           741: /*c4*/ { "les",   TRUE,  LONG,  op2(E, R),   0 },
        !           742: /*c5*/ { "lds",   TRUE,  LONG,  op2(E, R),   0 },
        !           743: /*c6*/ { "mov",   TRUE,  BYTE,  op2(I, E),   0 },
        !           744: /*c7*/ { "mov",   TRUE,  LONG,  op2(I, E),   0 },
        !           745:
        !           746: /*c8*/ { "enter", FALSE, NONE,  op2(Iw, Ib), 0 },
        !           747: /*c9*/ { "leave", FALSE, NONE,  0,           0 },
        !           748: /*ca*/ { "lret",  FALSE, NONE,  op1(Iw),     0 },
        !           749: /*cb*/ { "lret",  FALSE, NONE,  0,           0 },
        !           750: /*cc*/ { "int",   FALSE, NONE,  op1(o3),     0 },
        !           751: /*cd*/ { "int",   FALSE, NONE,  op1(Ib),     0 },
        !           752: /*ce*/ { "into",  FALSE, NONE,  0,           0 },
        !           753: /*cf*/ { "iret",  FALSE, NONE,  0,           0 },
        !           754:
        !           755: /*d0*/ { "",      TRUE,  BYTE,  op2(o1, E),  db_Grp2 },
        !           756: /*d1*/ { "",      TRUE,  LONG,  op2(o1, E),  db_Grp2 },
        !           757: /*d2*/ { "",      TRUE,  BYTE,  op2(CL, E),  db_Grp2 },
        !           758: /*d3*/ { "",      TRUE,  LONG,  op2(CL, E),  db_Grp2 },
        !           759: /*d4*/ { "aam",   TRUE,  NONE,  op1(Iba),    0 },
        !           760: /*d5*/ { "aad",   TRUE,  NONE,  op1(Iba),    0 },
        !           761: /*d6*/ { ".byte\t0xd6",FALSE, NONE, 0,       0 },
        !           762: /*d7*/ { "xlat",  FALSE, BYTE,  op1(BX),     0 },
        !           763:
        !           764: /*d8*/ { "",      TRUE,  NONE,  0,           db_Esc8 },
        !           765: /*d9*/ { "",      TRUE,  NONE,  0,           db_Esc9 },
        !           766: /*da*/ { "",      TRUE,  NONE,  0,           db_Esca },
        !           767: /*db*/ { "",      TRUE,  NONE,  0,           db_Escb },
        !           768: /*dc*/ { "",      TRUE,  NONE,  0,           db_Escc },
        !           769: /*dd*/ { "",      TRUE,  NONE,  0,           db_Escd },
        !           770: /*de*/ { "",      TRUE,  NONE,  0,           db_Esce },
        !           771: /*df*/ { "",      TRUE,  NONE,  0,           db_Escf },
        !           772:
        !           773: /*e0*/ { "loopne",FALSE, NONE,  op1(Db),     0 },
        !           774: /*e1*/ { "loope", FALSE, NONE,  op1(Db),     0 },
        !           775: /*e2*/ { "loop",  FALSE, NONE,  op1(Db),     0 },
        !           776: /*e3*/ { "jcxz",  FALSE, SDEP,  op1(Db),     "jecxz" },
        !           777: /*e4*/ { "in",    FALSE, BYTE,  op2(Ib, A),  0 },
        !           778: /*e5*/ { "in",    FALSE, LONG,  op2(Ib, A) , 0 },
        !           779: /*e6*/ { "out",   FALSE, BYTE,  op2(A, Ib),  0 },
        !           780: /*e7*/ { "out",   FALSE, LONG,  op2(A, Ib) , 0 },
        !           781:
        !           782: /*e8*/ { "call",  FALSE, NONE,  op1(Dl),     0 },
        !           783: /*e9*/ { "jmp",   FALSE, NONE,  op1(Dl),     0 },
        !           784: /*ea*/ { "ljmp",  FALSE, NONE,  op1(OS),     0 },
        !           785: /*eb*/ { "jmp",   FALSE, NONE,  op1(Db),     0 },
        !           786: /*ec*/ { "in",    FALSE, BYTE,  op2(DX, A),  0 },
        !           787: /*ed*/ { "in",    FALSE, LONG,  op2(DX, A) , 0 },
        !           788: /*ee*/ { "out",   FALSE, BYTE,  op2(A, DX),  0 },
        !           789: /*ef*/ { "out",   FALSE, LONG,  op2(A, DX) , 0 },
        !           790:
        !           791: /*f0*/ { "",      FALSE, NONE,  0,          0 },
        !           792: /*f1*/ { "",      FALSE, NONE,  0,          0 },
        !           793: /*f2*/ { "",      FALSE, NONE,  0,          0 },
        !           794: /*f3*/ { "",      FALSE, NONE,  0,          0 },
        !           795: /*f4*/ { "hlt",   FALSE, NONE,  0,          0 },
        !           796: /*f5*/ { "cmc",   FALSE, NONE,  0,          0 },
        !           797: /*f6*/ { "",      TRUE,  BYTE,  0,          db_Grp3 },
        !           798: /*f7*/ { "",      TRUE,  LONG,  0,          db_Grp3 },
        !           799:
        !           800: /*f8*/ { "clc",   FALSE, NONE,  0,          0 },
        !           801: /*f9*/ { "stc",   FALSE, NONE,  0,          0 },
        !           802: /*fa*/ { "cli",   FALSE, NONE,  0,          0 },
        !           803: /*fb*/ { "sti",   FALSE, NONE,  0,          0 },
        !           804: /*fc*/ { "cld",   FALSE, NONE,  0,          0 },
        !           805: /*fd*/ { "std",   FALSE, NONE,  0,          0 },
        !           806: /*fe*/ { "",      TRUE,  NONE,  0,          db_Grp4 },
        !           807: /*ff*/ { "",      TRUE,  NONE,  0,          db_Grp5 },
        !           808: };
        !           809:
        !           810: struct inst    db_bad_inst =
        !           811:        { "???",   FALSE, NONE,  0,           0 }
        !           812: ;
        !           813:
        !           814: #define        f_mod(byte)     ((byte)>>6)
        !           815: #define        f_reg(byte)     (((byte)>>3)&0x7)
        !           816: #define        f_rm(byte)      ((byte)&0x7)
        !           817:
        !           818: #define        sib_ss(byte)    ((byte)>>6)
        !           819: #define        sib_index(byte) (((byte)>>3)&0x7)
        !           820: #define        sib_base(byte)  ((byte)&0x7)
        !           821:
        !           822: struct i_addr {
        !           823:        int             is_reg; /* if reg, reg number is in 'disp' */
        !           824:        int             disp;
        !           825:        char *          base;
        !           826:        char *          index;
        !           827:        int             ss;
        !           828: };
        !           829:
        !           830: char * db_index_reg_16[8] = {
        !           831:        "%bx,%si",
        !           832:        "%bx,%di",
        !           833:        "%bp,%si",
        !           834:        "%bp,%di",
        !           835:        "%si",
        !           836:        "%di",
        !           837:        "%bp",
        !           838:        "%bx"
        !           839: };
        !           840:
        !           841: char * db_reg[3][8] = {
        !           842:        { "%al",  "%cl",  "%dl",  "%bl",  "%ah",  "%ch",  "%dh",  "%bh" },
        !           843:        { "%ax",  "%cx",  "%dx",  "%bx",  "%sp",  "%bp",  "%si",  "%di" },
        !           844:        { "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi" }
        !           845: };
        !           846:
        !           847: char * db_seg_reg[8] = {
        !           848:        "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "", ""
        !           849: };
        !           850:
        !           851: /*
        !           852:  * lengths for size attributes
        !           853:  */
        !           854: int db_lengths[] = {
        !           855:        1,      /* BYTE */
        !           856:        2,      /* WORD */
        !           857:        4,      /* LONG */
        !           858:        8,      /* QUAD */
        !           859:        4,      /* SNGL */
        !           860:        8,      /* DBLR */
        !           861:        10,     /* EXTR */
        !           862: };
        !           863:
        !           864: #define        get_value_inc(result, loc, size, is_signed) \
        !           865:        do { \
        !           866:                result = db_get_value((loc), (size), (is_signed)); \
        !           867:                (loc) += (size); \
        !           868:        } while (0)
        !           869:
        !           870:
        !           871: db_addr_t db_read_address(db_addr_t, int, int, struct i_addr *);
        !           872: void db_print_address(char *, int, struct i_addr *);
        !           873: db_addr_t db_disasm_esc(db_addr_t, int, int, int, char *);
        !           874:
        !           875: /*
        !           876:  * Read address at location and return updated location.
        !           877:  */
        !           878: db_addr_t
        !           879: db_read_address(db_addr_t loc, int short_addr, int regmodrm,
        !           880:     struct i_addr *addrp)
        !           881: {
        !           882:        int             mod, rm, sib, index, disp;
        !           883:
        !           884:        mod = f_mod(regmodrm);
        !           885:        rm  = f_rm(regmodrm);
        !           886:
        !           887:        if (mod == 3) {
        !           888:                addrp->is_reg = TRUE;
        !           889:                addrp->disp = rm;
        !           890:                return (loc);
        !           891:        }
        !           892:        addrp->is_reg = FALSE;
        !           893:        addrp->index = 0;
        !           894:
        !           895:        if (short_addr) {
        !           896:                addrp->index = 0;
        !           897:                addrp->ss = 0;
        !           898:                switch (mod) {
        !           899:                    case 0:
        !           900:                        if (rm == 6) {
        !           901:                                get_value_inc(disp, loc, 2, FALSE);
        !           902:                                addrp->disp = disp;
        !           903:                                addrp->base = 0;
        !           904:                        } else {
        !           905:                                addrp->disp = 0;
        !           906:                                addrp->base = db_index_reg_16[rm];
        !           907:                        }
        !           908:                        break;
        !           909:                    case 1:
        !           910:                        get_value_inc(disp, loc, 1, TRUE);
        !           911:                        disp &= 0xffff;
        !           912:                        addrp->disp = disp;
        !           913:                        addrp->base = db_index_reg_16[rm];
        !           914:                        break;
        !           915:                    case 2:
        !           916:                        get_value_inc(disp, loc, 2, FALSE);
        !           917:                        addrp->disp = disp;
        !           918:                        addrp->base = db_index_reg_16[rm];
        !           919:                        break;
        !           920:                }
        !           921:        } else {
        !           922:                if (rm == 4) {
        !           923:                        get_value_inc(sib, loc, 1, FALSE);
        !           924:                        rm = sib_base(sib);
        !           925:                        index = sib_index(sib);
        !           926:                        if (index != 4)
        !           927:                                addrp->index = db_reg[LONG][index];
        !           928:                        addrp->ss = sib_ss(sib);
        !           929:                }
        !           930:
        !           931:                switch (mod) {
        !           932:                    case 0:
        !           933:                        if (rm == 5) {
        !           934:                                get_value_inc(addrp->disp, loc, 4, FALSE);
        !           935:                                addrp->base = 0;
        !           936:                        } else {
        !           937:                                addrp->disp = 0;
        !           938:                                addrp->base = db_reg[LONG][rm];
        !           939:                        }
        !           940:                        break;
        !           941:                    case 1:
        !           942:                        get_value_inc(disp, loc, 1, TRUE);
        !           943:                        addrp->disp = disp;
        !           944:                        addrp->base = db_reg[LONG][rm];
        !           945:                        break;
        !           946:                    case 2:
        !           947:                        get_value_inc(disp, loc, 4, FALSE);
        !           948:                        addrp->disp = disp;
        !           949:                        addrp->base = db_reg[LONG][rm];
        !           950:                        break;
        !           951:                }
        !           952:        }
        !           953:        return (loc);
        !           954: }
        !           955:
        !           956: void
        !           957: db_print_address(char *seg, int size, struct i_addr *addrp)
        !           958: {
        !           959:        if (addrp->is_reg) {
        !           960:                db_printf("%s", db_reg[size][addrp->disp]);
        !           961:                return;
        !           962:        }
        !           963:
        !           964:        if (seg)
        !           965:                db_printf("%s:", seg);
        !           966:
        !           967:        db_printsym((db_addr_t)addrp->disp, DB_STGY_ANY, db_printf);
        !           968:        if (addrp->base != 0 || addrp->index != 0) {
        !           969:                db_printf("(");
        !           970:                if (addrp->base)
        !           971:                        db_printf("%s", addrp->base);
        !           972:                if (addrp->index)
        !           973:                        db_printf(",%s,%d", addrp->index, 1<<addrp->ss);
        !           974:                db_printf(")");
        !           975:        }
        !           976: }
        !           977:
        !           978: /*
        !           979:  * Disassemble floating-point ("escape") instruction
        !           980:  * and return updated location.
        !           981:  */
        !           982: db_addr_t
        !           983: db_disasm_esc(db_addr_t loc, int inst, int short_addr, int size, char *seg)
        !           984: {
        !           985:        int             regmodrm;
        !           986:        struct finst    *fp;
        !           987:        int             mod;
        !           988:        struct i_addr   address;
        !           989:        char *          name;
        !           990:
        !           991:        get_value_inc(regmodrm, loc, 1, FALSE);
        !           992:        fp = &db_Esc_inst[inst - 0xd8][f_reg(regmodrm)];
        !           993:        mod = f_mod(regmodrm);
        !           994:        if (mod != 3) {
        !           995:                if (*fp->f_name == '\0') {
        !           996:                        db_printf("<bad instruction>");
        !           997:                        return (loc);
        !           998:                }
        !           999:
        !          1000:                /*
        !          1001:                 * Normal address modes.
        !          1002:                 */
        !          1003:                loc = db_read_address(loc, short_addr, regmodrm, &address);
        !          1004:                db_printf(fp->f_name);
        !          1005:                switch(fp->f_size) {
        !          1006:                    case SNGL:
        !          1007:                        db_printf("s");
        !          1008:                        break;
        !          1009:                    case DBLR:
        !          1010:                        db_printf("l");
        !          1011:                        break;
        !          1012:                    case EXTR:
        !          1013:                        db_printf("t");
        !          1014:                        break;
        !          1015:                    case WORD:
        !          1016:                        db_printf("s");
        !          1017:                        break;
        !          1018:                    case LONG:
        !          1019:                        db_printf("l");
        !          1020:                        break;
        !          1021:                    case QUAD:
        !          1022:                        db_printf("q");
        !          1023:                        break;
        !          1024:                    default:
        !          1025:                        break;
        !          1026:                }
        !          1027:                db_printf("\t");
        !          1028:                db_print_address(seg, BYTE, &address);
        !          1029:        } else {
        !          1030:                /*
        !          1031:                 * 'reg-reg' - special formats
        !          1032:                 */
        !          1033:                switch (fp->f_rrmode) {
        !          1034:                    case op2(ST,STI):
        !          1035:                        name = (fp->f_rrname) ? fp->f_rrname : fp->f_name;
        !          1036:                        db_printf("%s\t%%st,%%st(%d)",name,f_rm(regmodrm));
        !          1037:                        break;
        !          1038:                    case op2(STI,ST):
        !          1039:                        name = (fp->f_rrname) ? fp->f_rrname : fp->f_name;
        !          1040:                        db_printf("%s\t%%st(%d),%%st",name, f_rm(regmodrm));
        !          1041:                        break;
        !          1042:                    case op1(STI):
        !          1043:                        name = (fp->f_rrname) ? fp->f_rrname : fp->f_name;
        !          1044:                        db_printf("%s\t%%st(%d)",name, f_rm(regmodrm));
        !          1045:                        break;
        !          1046:                    case op1(X):
        !          1047:                        name = ((char * const *)fp->f_rrname)[f_rm(regmodrm)];
        !          1048:                        if (*name == '\0')
        !          1049:                                goto bad;
        !          1050:                        db_printf("%s", name);
        !          1051:                        break;
        !          1052:                    case op1(XA):
        !          1053:                        name = ((char * const *)fp->f_rrname)[f_rm(regmodrm)];
        !          1054:                        if (*name == '\0')
        !          1055:                                goto bad;
        !          1056:                        db_printf("%s\t%%ax", name);
        !          1057:                        break;
        !          1058:                    default:
        !          1059:                    bad:
        !          1060:                        db_printf("<bad instruction>");
        !          1061:                        break;
        !          1062:                }
        !          1063:        }
        !          1064:
        !          1065:        return (loc);
        !          1066: }
        !          1067:
        !          1068: /*
        !          1069:  * Disassemble instruction at 'loc'.  'altfmt' specifies an
        !          1070:  * (optional) alternate format.  Return address of start of
        !          1071:  * next instruction.
        !          1072:  */
        !          1073: db_addr_t
        !          1074: db_disasm(db_addr_t loc, boolean_t altfmt)
        !          1075: {
        !          1076:        int     inst;
        !          1077:        int     size;
        !          1078:        int     short_addr;
        !          1079:        char *  seg;
        !          1080:        struct inst *   ip;
        !          1081:        char *  i_name;
        !          1082:        int     i_size;
        !          1083:        int     i_mode;
        !          1084:        int     regmodrm = 0;
        !          1085:        boolean_t       first;
        !          1086:        int     displ;
        !          1087:        int     prefix;
        !          1088:        int     imm;
        !          1089:        int     imm2;
        !          1090:        int     len;
        !          1091:        struct i_addr   address;
        !          1092:
        !          1093:        get_value_inc(inst, loc, 1, FALSE);
        !          1094:        short_addr = FALSE;
        !          1095:        size = LONG;
        !          1096:        seg = 0;
        !          1097:
        !          1098:        /*
        !          1099:         * Get prefixes
        !          1100:         */
        !          1101:        prefix = TRUE;
        !          1102:        do {
        !          1103:                switch (inst) {
        !          1104:                    case 0x66:          /* data16 */
        !          1105:                        size = WORD;
        !          1106:                        break;
        !          1107:                    case 0x67:
        !          1108:                        short_addr = TRUE;
        !          1109:                        break;
        !          1110:                    case 0x26:
        !          1111:                        seg = "%es";
        !          1112:                        break;
        !          1113:                    case 0x36:
        !          1114:                        seg = "%ss";
        !          1115:                        break;
        !          1116:                    case 0x2e:
        !          1117:                        seg = "%cs";
        !          1118:                        break;
        !          1119:                    case 0x3e:
        !          1120:                        seg = "%ds";
        !          1121:                        break;
        !          1122:                    case 0x64:
        !          1123:                        seg = "%fs";
        !          1124:                        break;
        !          1125:                    case 0x65:
        !          1126:                        seg = "%gs";
        !          1127:                        break;
        !          1128:                    case 0xf0:
        !          1129:                        db_printf("lock ");
        !          1130:                        break;
        !          1131:                    case 0xf2:
        !          1132:                        db_printf("repne ");
        !          1133:                        break;
        !          1134:                    case 0xf3:
        !          1135:                        db_printf("repe ");     /* XXX repe VS rep */
        !          1136:                        break;
        !          1137:                    default:
        !          1138:                        prefix = FALSE;
        !          1139:                        break;
        !          1140:                }
        !          1141:                if (prefix)
        !          1142:                        get_value_inc(inst, loc, 1, FALSE);
        !          1143:        } while (prefix);
        !          1144:
        !          1145:        if (inst >= 0xd8 && inst <= 0xdf) {
        !          1146:                loc = db_disasm_esc(loc, inst, short_addr, size, seg);
        !          1147:                db_printf("\n");
        !          1148:                return (loc);
        !          1149:        }
        !          1150:
        !          1151:        if (inst == 0x0f) {
        !          1152:                get_value_inc(inst, loc, 1, FALSE);
        !          1153:                ip = db_inst_0f[inst>>4];
        !          1154:                if (ip == 0)
        !          1155:                        ip = &db_bad_inst;
        !          1156:                else
        !          1157:                        ip = &ip[inst&0xf];
        !          1158:        } else {
        !          1159:                ip = &db_inst_table[inst];
        !          1160:        }
        !          1161:
        !          1162:        if (ip->i_has_modrm) {
        !          1163:                get_value_inc(regmodrm, loc, 1, FALSE);
        !          1164:                loc = db_read_address(loc, short_addr, regmodrm, &address);
        !          1165:        }
        !          1166:
        !          1167:        i_name = ip->i_name;
        !          1168:        i_size = ip->i_size;
        !          1169:        i_mode = ip->i_mode;
        !          1170:
        !          1171:        if (ip->i_extra == db_Grp1 || ip->i_extra == db_Grp2 ||
        !          1172:            ip->i_extra == db_Grp6 || ip->i_extra == db_Grp7 ||
        !          1173:            ip->i_extra == db_Grp8 || ip->i_extra == db_Grp9 ||
        !          1174:            ip->i_extra == db_GrpA || ip->i_extra == db_GrpB ||
        !          1175:            ip->i_extra == db_GrpC) {
        !          1176:                i_name = ((char **)ip->i_extra)[f_reg(regmodrm)];
        !          1177:        } else if (ip->i_extra == db_Grp3) {
        !          1178:                ip = (struct inst *)ip->i_extra;
        !          1179:                ip = &ip[f_reg(regmodrm)];
        !          1180:                i_name = ip->i_name;
        !          1181:                i_mode = ip->i_mode;
        !          1182:        } else if (ip->i_extra == db_Grp4 || ip->i_extra == db_Grp5) {
        !          1183:                ip = (struct inst *)ip->i_extra;
        !          1184:                ip = &ip[f_reg(regmodrm)];
        !          1185:                i_name = ip->i_name;
        !          1186:                i_mode = ip->i_mode;
        !          1187:                i_size = ip->i_size;
        !          1188:        }
        !          1189:
        !          1190:        if (i_size == SDEP) {
        !          1191:                if (size == WORD)
        !          1192:                        db_printf("%s", i_name);
        !          1193:                else
        !          1194:                        db_printf("%s", ip->i_extra);
        !          1195:        } else {
        !          1196:                db_printf("%s", i_name);
        !          1197:                if (i_size != NONE) {
        !          1198:                        if (i_size == BYTE) {
        !          1199:                                db_printf("b");
        !          1200:                                size = BYTE;
        !          1201:                        } else if (i_size == WORD) {
        !          1202:                                db_printf("w");
        !          1203:                                size = WORD;
        !          1204:                        } else if (size == WORD) {
        !          1205:                                db_printf("w");
        !          1206:                        } else {
        !          1207:                                db_printf("l");
        !          1208:                        }
        !          1209:                }
        !          1210:        }
        !          1211:        db_printf("\t");
        !          1212:        for (first = TRUE;
        !          1213:             i_mode != 0;
        !          1214:             i_mode >>= 8, first = FALSE) {
        !          1215:                if (!first)
        !          1216:                        db_printf(",");
        !          1217:
        !          1218:                switch (i_mode & 0xFF) {
        !          1219:                    case E:
        !          1220:                        db_print_address(seg, size, &address);
        !          1221:                        break;
        !          1222:                    case Eind:
        !          1223:                        db_printf("*");
        !          1224:                        db_print_address(seg, size, &address);
        !          1225:                        break;
        !          1226:                    case El:
        !          1227:                        db_print_address(seg, LONG, &address);
        !          1228:                        break;
        !          1229:                    case Ew:
        !          1230:                        db_print_address(seg, WORD, &address);
        !          1231:                        break;
        !          1232:                    case Eb:
        !          1233:                        db_print_address(seg, BYTE, &address);
        !          1234:                        break;
        !          1235:                    case R:
        !          1236:                        db_printf("%s", db_reg[size][f_reg(regmodrm)]);
        !          1237:                        break;
        !          1238:                    case Rw:
        !          1239:                        db_printf("%s", db_reg[WORD][f_reg(regmodrm)]);
        !          1240:                        break;
        !          1241:                    case Ri:
        !          1242:                        db_printf("%s", db_reg[size][f_rm(inst)]);
        !          1243:                        break;
        !          1244:                    case Ril:
        !          1245:                        db_printf("%s", db_reg[LONG][f_rm(inst)]);
        !          1246:                        break;
        !          1247:                    case S:
        !          1248:                        db_printf("%s", db_seg_reg[f_reg(regmodrm)]);
        !          1249:                        break;
        !          1250:                    case Si:
        !          1251:                        db_printf("%s", db_seg_reg[f_reg(inst)]);
        !          1252:                        break;
        !          1253:                    case A:
        !          1254:                        db_printf("%s", db_reg[size][0]);       /* acc */
        !          1255:                        break;
        !          1256:                    case BX:
        !          1257:                        if (seg)
        !          1258:                                db_printf("%s:", seg);
        !          1259:                        db_printf("(%s)", short_addr ? "%bx" : "%ebx");
        !          1260:                        break;
        !          1261:                    case CL:
        !          1262:                        db_printf("%%cl");
        !          1263:                        break;
        !          1264:                    case DX:
        !          1265:                        db_printf("%%dx");
        !          1266:                        break;
        !          1267:                    case SI:
        !          1268:                        if (seg)
        !          1269:                                db_printf("%s:", seg);
        !          1270:                        db_printf("(%s)", short_addr ? "%si" : "%esi");
        !          1271:                        break;
        !          1272:                    case DI:
        !          1273:                        db_printf("%%es:(%s)", short_addr ? "%di" : "%edi");
        !          1274:                        break;
        !          1275:                    case CR:
        !          1276:                        db_printf("%%cr%d", f_reg(regmodrm));
        !          1277:                        break;
        !          1278:                    case DR:
        !          1279:                        db_printf("%%dr%d", f_reg(regmodrm));
        !          1280:                        break;
        !          1281:                    case TR:
        !          1282:                        db_printf("%%tr%d", f_reg(regmodrm));
        !          1283:                        break;
        !          1284:                    case I:
        !          1285:                        len = db_lengths[size];
        !          1286:                        get_value_inc(imm, loc, len, FALSE);
        !          1287:                        db_printf("$%#n", imm);
        !          1288:                        break;
        !          1289:                    case Is:
        !          1290:                        len = db_lengths[size];
        !          1291:                        get_value_inc(imm, loc, len, TRUE);
        !          1292:                        db_printf("$%#r", imm);
        !          1293:                        break;
        !          1294:                    case Ib:
        !          1295:                        get_value_inc(imm, loc, 1, FALSE);
        !          1296:                        db_printf("$%#n", imm);
        !          1297:                        break;
        !          1298:                    case Iba:
        !          1299:                        get_value_inc(imm, loc, 1, FALSE);
        !          1300:                        if (imm != 0x0a)
        !          1301:                                db_printf("$%#n", imm);
        !          1302:                        break;
        !          1303:                    case Ibs:
        !          1304:                        get_value_inc(imm, loc, 1, TRUE);
        !          1305:                        if (size == WORD)
        !          1306:                                imm &= 0xFFFF;
        !          1307:                        db_printf("$%#r", imm);
        !          1308:                        break;
        !          1309:                    case Iw:
        !          1310:                        get_value_inc(imm, loc, 2, FALSE);
        !          1311:                        db_printf("$%#n", imm);
        !          1312:                        break;
        !          1313:                    case O:
        !          1314:                        if (short_addr)
        !          1315:                                get_value_inc(displ, loc, 2, TRUE);
        !          1316:                        else
        !          1317:                                get_value_inc(displ, loc, 4, TRUE);
        !          1318:                        if (seg)
        !          1319:                                db_printf("%s:%#r",seg, displ);
        !          1320:                        else
        !          1321:                                db_printsym((db_addr_t)displ, DB_STGY_ANY,
        !          1322:                                    db_printf);
        !          1323:                        break;
        !          1324:                    case Db:
        !          1325:                        get_value_inc(displ, loc, 1, TRUE);
        !          1326:                        displ += loc;
        !          1327:                        if (size == WORD)
        !          1328:                                displ &= 0xFFFF;
        !          1329:                        db_printsym((db_addr_t)displ, DB_STGY_XTRN, db_printf);
        !          1330:                        break;
        !          1331:                    case Dl:
        !          1332:                        len = db_lengths[size];
        !          1333:                        get_value_inc(displ, loc, len, FALSE);
        !          1334:                        displ += loc;
        !          1335:                        if (size == WORD)
        !          1336:                                displ &= 0xFFFF;
        !          1337:                        db_printsym((db_addr_t)displ, DB_STGY_XTRN, db_printf);
        !          1338:                        break;
        !          1339:                    case o1:
        !          1340:                        db_printf("$1");
        !          1341:                        break;
        !          1342:                    case o3:
        !          1343:                        db_printf("$3");
        !          1344:                        break;
        !          1345:                    case OS:
        !          1346:                        get_value_inc(imm, loc, len, FALSE);    /* offset */
        !          1347:                        get_value_inc(imm2, loc, 2, FALSE);     /* segment */
        !          1348:                        db_printf("$%#n,%#n", imm2, imm);
        !          1349:                        break;
        !          1350:                }
        !          1351:        }
        !          1352:
        !          1353:        if (altfmt == 0 && (inst == 0xe9 || inst == 0xeb)) {
        !          1354:                /*
        !          1355:                 * GAS pads to longword boundary after unconditional jumps.
        !          1356:                 */
        !          1357:                loc = (loc + (4-1)) & ~(4-1);
        !          1358:        }
        !          1359:        db_printf("\n");
        !          1360:        return (loc);
        !          1361: }

CVSweb