Annotation of coherent/b/bin/db/i386/i386db3.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * db/i386/i386db3.c
        !             3:  * A debugger.
        !             4:  * i386 disassembler tables for disassembler in i386/i386db2.c.
        !             5:  * Intel operand order.
        !             6:  */
        !             7: 
        !             8: #include "i386db.h"
        !             9: 
        !            10: /* 
        !            11:  * Legend to characters following "%" tokens in strings,
        !            12:  * taken from Intel i386 "Programmer's Reference Manual".
        !            13:  *
        !            14:  *     First char after '%'; see also 2nd char, general case below:
        !            15:  *             A - direct address
        !            16:  *             C - reg of r/m selects control register
        !            17:  *             D - reg of r/m selects debug register
        !            18:  *             E - modR/M selects operand
        !            19:  *             F - flags register
        !            20:  *             G - reg field of modR/M selects general register
        !            21:  *             H - sign-extended immediate data (same as I but sign-extended)
        !            22:  *             I - immediate data
        !            23:  *             J - relative offset added to IP
        !            24:  *             K - as J, except find symbol, if possible
        !            25:  *             M - modR/M selects memory only
        !            26:  *             O - no modR/M byte; offset only
        !            27:  *             R - mod field of modR/M selects register only
        !            28:  *             S - reg field of modR/M selects segment register
        !            29:  *             T - reg feild of modR/M selects test register
        !            30:  *             X - memory addressed by DS:ESI
        !            31:  *             Y - memory addressed by ES:EDI
        !            32:  *             Z - assembler instruction mnemonic size qualifier
        !            33:  *             2 - prefix of two-byte opcode
        !            34:  *
        !            35:  *     For the following first characters after the %, the second after the %
        !            36:  *     has a special meaning associated with it:
        !            37:  *             e - put in 'e' if address size attribute = 32 
        !            38:  *                     - second char is part of reg name
        !            39:  *             f - floating point 
        !            40:  *                     - second char is esc value
        !            41:  *             g - REG/OPCODE field of the modR/M byte is interpreted as
        !            42:  *                 additional opcode; it is used as an index to a
        !            43:  *                 column in the 2-d group array (grp[][])
        !            44:  *                     - second character yields the group number, i.e., it 
        !            45:  *                       is used as an index to a row in grp[][]  
        !            46:  *             r - read next n bytes, but don't do anything with them; n is 
        !            47:  *                 given by 2nd char and meaning conforms with general case
        !            48:  *             s - size override:
        !            49:  *                     - second char has following meanings:
        !            50:  *                             "a" - address size override
        !            51:  *                             "o" - operand size override
        !            52:  *
        !            53:  *     Second char after '%', the general case:
        !            54:  *             a - two words or dwords in memory (BOUND)
        !            55:  *             b - byte
        !            56:  *             d - dword
        !            57:  *             f - 32 bit pointer
        !            58:  *             l - 48 bit pointer
        !            59:  *             p - 32 or 48 bit pointer
        !            60:  *             s - six byte pseudo-descriptor
        !            61:  *             v - word or dword
        !            62:  *             w - word
        !            63:  *             z - r/m16: append 'w' to assem. mnemonic
        !            64:  *               - r/m32: append 'w' to assem. mnemonic if operand size = 16,
        !            65:  *                        append 'l' to assem. mnemonic if operand size = 32
        !            66:  *             F - use floating regs in mod/rm (unused)
        !            67:  *             1-8 - group number
        !            68:  */
        !            69: 
        !            70: /******************************************************************************/
        !            71: 
        !            72: char *op_map_1[] = {
        !            73:        /* 0 */
        !            74:        "add%Zb %Eb,%Gb",    "add%Zv %Ev,%Gv",    "add%Zb %Gb,%Eb",   "add%Zv %Gv,%Ev",
        !            75:        "add%Zb al,%Ib",     "add%Zv %eax,%Iv",   "push es",         "pop es",
        !            76:        "or%Zb %Eb,%Gb",     "or%Zv %Ev,%Gv",     "or%Zb %Gb,%Eb",    "or%Zv %Gv,%Ev",
        !            77:        "or%Zb al,%Ib",      "or%Zv %eax,%Iv",    "push cs",         "%2 ",
        !            78: 
        !            79:        /* 1 */
        !            80:        "adc%Zb %Eb,%Gb",    "adc%Zv %Ev,%Gv",    "adc%Zb %Gb,%Eb",   "adc%Zv %Gv,%Ev",
        !            81:        "adc%Zb al,%Ib",     "adc%Zv %eax,%Iv",   "push ss",          "pop ss",
        !            82:        "sbb%Zb %Eb,%Gb",    "sbb%Zv %Ev,%Gv",    "sbb%Zb %Gb,%Eb",   "sbb%Zv %Gv,%Ev",
        !            83:        "sbb%Zb al,%Ib",     "sbb%Zv %eax,%Iv",   "push ds",          "pop ds",
        !            84: 
        !            85:        /* 2 */
        !            86:        "and%Zb %Eb,%Gb",    "and%Zv %Ev,%Gv",    "and%Zb %Gb,%Eb",   "and%Zv %Gv,%Ev",
        !            87:        "and%Zb al,%Ib",     "and%Zv %eax,%Iv",   "es:",              "daa",
        !            88:        "sub%Zb %Eb,%Gb",    "sub%Zv %Ev,%Gv",    "sub%Zb %Gb,%Eb",   "sub%Zv %Gv,%Ev",
        !            89:        "sub%Zb al,%Ib",     "sub%Zv %eax,%Iv",   "cs:",              "das",
        !            90: 
        !            91:        /* 3 */
        !            92:        "xor%Zb %Eb,%Gb",    "xor%Zv %Ev,%Gv",    "xor%Zb %Gb,%Eb",   "xor%Zv %Gv,%Ev",
        !            93:        "xor%Zb al,%Ib",     "xor%Zv %eax,%Iv",   "ss:",              "aaa",
        !            94:        "cmp%Zb %Eb,%Gb",    "cmp%Zv %Ev,%Gv",    "cmp%Zb %Gb,%Eb",   "cmp%Zv %Gv,%Ev",
        !            95:        "cmp%Zb al,%Ib",     "cmp%Zv %eax,%Iv",   "ds:",              "aas",
        !            96: 
        !            97:        /* 4 */
        !            98:        "inc%Zv %eax",       "inc%Zv %ecx",       "inc%Zv %edx",      "inc%Zv %ebx",
        !            99:        "inc%Zv %esp",       "inc%Zv %ebp",       "inc%Zv %esi",      "inc%Zv %edi",
        !           100:        "dec%Zv %eax",       "dec%Zv %ecx",       "dec%Zv %edx",      "dec%Zv %ebx",
        !           101:        "dec%Zv %esp",       "dec%Zv %ebp",       "dec%Zv %esi",      "dec%Zv %edi",
        !           102: 
        !           103:        /* 5 */
        !           104:        "push%Zv %eax",      "push%Zv %ecx",      "push%Zv %edx",     "push%Zv %ebx",
        !           105:        "push%Zv %esp",      "push%Zv %ebp",      "push%Zv %esi",     "push%Zv %edi",
        !           106:        "pop%Zv %eax",       "pop%Zv %ecx",       "pop%Zv %edx",      "pop%Zv %ebx",
        !           107:        "pop%Zv %esp",       "pop%Zv %ebp",       "pop%Zv %esi",      "pop%Zv %edi",
        !           108: 
        !           109:        /* 6 */
        !           110:        "pusha%Zv",          "popa%Zv",           "bound%Zv %Gv,%Ma", "arpl %Ew,%Gw",
        !           111:        "fs:",               "gs:",               "%so",              "%sa",
        !           112:        "push%Zv %Iv",     "imul%Zv %Gv,%Ev,%Iv", "push%Zb %Ib",      "imul%Zv %Gv,%Ev,%Hb",
        !           113:        "ins%Zb %Yb",        "ins%Zv %Yv",        "outs%Zb %Xb",      "outs%Zv %Xv",
        !           114: 
        !           115:        /* 7 */
        !           116:        "jo %Jb",            "jno %Jb",           "jb %Jb",            "jae %Jb",
        !           117:        "je %Jb",            "jne %Jb",           "jbe %Jb",           "ja %Jb",
        !           118:        "js %Jb",            "jns %Jb",           "jp %Jb",            "jnp %Jb",
        !           119:        "jl %Jb",            "jge %Jb",           "jle %Jb",           "jg %Jb",
        !           120: 
        !           121:        /* 8 */
        !           122:        "%g1%Zb %Eb,%Ib",    "%g1%Zv %Ev,%Iv",    "mov%Zb al,%Ib",     "%g1%Zv %Ev,%Hb",
        !           123:        "test%Zb %Eb,%Gb",   "test%Zv %Ev,%Gv",   "xchg%Zb %Eb,%Gb",   "xchg%Zv %Ev,%Gv",
        !           124:        "mov%Zb %Eb,%Gb",    "mov%Zv %Ev,%Gv",    "mov%Zb %Gb,%Eb",    "mov%Zv %Gv,%Ev",
        !           125:        "mov%Zw %Ew,%Sw",    "lea%Zv %Gv,%M ",    "mov%Zw %Sw,%Ew",    "pop%Zv %Ev",
        !           126: 
        !           127:        /* 9 */
        !           128:        "nop",               "xchg%Zv %eax,%ecx", "xchg%Zv %eax,%edx", "xchg%Zv %eax,%ebx",
        !           129:        "xchg%Zv %eax,%esp", "xchg%Zv %eax,%ebp", "xchg%Zv %eax,%esi", "xchg%Zv %eax,%edi",
        !           130:        "cbw",               "cwd",               "lcall %Ap",         "fwait",
        !           131:        "pushf%Zv",          "popf%Zv",           "sahf",              "lahf",
        !           132: 
        !           133:        /* A */
        !           134:        "mov%Zb al,%Ob",     "mov%Zv %eax,%Ov",   "mov%Zb %Ob,al",     "mov%Zv %Ov,%eax",
        !           135:        "movs%Zb %Xb%Yb",    "movs%Zz %Xv%Yv",    "cmps%Zb %Xb%Yb",    "cmps%Zz %Xv%Yv",
        !           136:        "test%Zb al,%Ib",    "test%Zv %eax,%Iv",  "stos%Zb %Yb",       "stos%Zz %Yv",
        !           137:        "lods%Zb %Xb",       "lods%Zz %Xv",       "scas%Zb %Xb",       "scas%Zv %Xv",
        !           138: 
        !           139:        /* B */
        !           140:        "mov%Zb al,%Ib",     "mov%Zb cl,%Ib",     "mov%Zb dl,%Ib",     "mov%Zb bl,%Ib",
        !           141:        "mov%Zb ah,%Ib",     "mov%Zb ch,%Ib",     "mov%Zb dh,%Ib",     "mov%Zb bh,%Ib",
        !           142:        "mov%Zv %eax,%Iv",   "mov%Zv %ecx,%Iv",   "mov%Zv %edx,%Iv",   "mov%Zv %ebx,%Iv",
        !           143:        "mov%Zv %esp,%Iv",   "mov%Zv %ebp,%Iv",   "mov%Zv %esi,%Iv",   "mov%Zv %edi,%Iv",
        !           144: 
        !           145:        /* C */
        !           146:        "%g2%Zb %Eb,%Ib",    "%g2%Zv %Ev,%Ib",    "ret %Iw",           "ret",
        !           147:        "les%Zv %Gv,%Mp",    "lds%Zv %Gv,%Mp",    "mov%Zb %Eb,%Ib",    "mov%Zv %Ev,%Iv",
        !           148:        "enter %Iw,%Ib",     "leave",             "lret %Iw",          "lret",
        !           149:        "int 3",             "int %Ib",           "into",              "iret",
        !           150: 
        !           151:        /* D */
        !           152:        "%g2%Zb %Eb,$1",     "%g2%Zv %Ev,$1",     "%g2%Zb %Eb,cl",     "%g2%Zv %Ev,cl",
        !           153:        "aam %rb",           "aad %rb",           NULL,                "xlat",
        !           154:        "%f0",               "%f1",               "%f2",               "%f3",
        !           155:        "%f4",               "%f5",               "%f6",               "%f7",
        !           156: 
        !           157:        /* E */
        !           158:        "loopne %Jb",        "loope %Jb",         "loop %Jb",          "jcxz %Jb",
        !           159:        "in%Zb %Ib",         "in%Zv %Ib",         "out%Zb %Ib,al",     "out%Zv %Ib,%eax",
        !           160:        "call %Kv",          "jmp %Jv",           "ljmp %Ap",          "jmp %Jb",
        !           161:        "in%Zb ",            "in%Zv ",            "out%Zb dx,al",      "out%Zv dx,%eax",
        !           162: 
        !           163:        /* F */
        !           164:        "lock",              NULL,                "repne",             "rep",
        !           165:        "hlt",               "cmc",               "%g3",               "%g0",
        !           166:        "clc",               "stc",               "cli",               "sti",
        !           167:        "cld",               "std",               "%g4",               "%g5"
        !           168: };
        !           169: 
        !           170: /******************************************************************************/
        !           171: 
        !           172: char *op_map_2[] = {
        !           173:        /* 0 */
        !           174:        "%g6",          "%g7",          "lar%Zv %Gv,%Ew",       "lsl%Zv %Gv,%Ew", 
        !           175:        NULL,           NULL,           "clts",                 NULL,
        !           176:        "invd",         "wbinvd",       NULL,                   NULL,
        !           177:        NULL,           NULL,           NULL,                   NULL,
        !           178: 
        !           179:        /* 1 */
        !           180:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           181:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           182: 
        !           183:        /* 2 */
        !           184:        "mov%Zd %Rd,%Cd", "mov%Zd %Rd,%Dd", "mov%Zd %Cd,%Rd", "mov%Zd %Dd,%Rd",
        !           185:        "mov%Zd %Rd,%Td", NULL,         "mov%Zd %Td,%Rd",       NULL,
        !           186:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           187: 
        !           188:        /* 3 */
        !           189:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           190:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           191: 
        !           192:        /* 4 */
        !           193:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           194:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           195: 
        !           196:        /* 5 */
        !           197:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           198:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           199: 
        !           200:        /* 6 */
        !           201:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           202:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           203: 
        !           204:        /* 7 */
        !           205:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           206:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           207: 
        !           208:        /* 8 */
        !           209:        "jo %Jv",       "jno %Jv",      "jb %Jv",       "jae %Jv",
        !           210:        "je %Jv",       "jne %Jv",      "jbe %Jv",      "ja %Jv",
        !           211:        "js %Jv",       "jns %Jv",      "jp %Jv",       "jnp %Jv",
        !           212:        "jl %Jv",       "jge %Jv",      "jle %Jv",      "jg %Jv",
        !           213: 
        !           214:        /* 9 */
        !           215:        "seto %Eb",     "setno %Eb",    "setb %Eb",     "setae %Eb",
        !           216:        "sete %Eb",     "setne %Eb",    "setbe %Eb",    "seta %Eb",
        !           217:        "sets %Eb",     "setns %Eb",    "setp %Eb",     "setnp %Eb",
        !           218:        "setl %Eb",     "setge %Eb",    "setle %Eb",    "setg %Eb",
        !           219: 
        !           220:        /* A */
        !           221:        "push fs",      "pop fs",       NULL,           "bt%Zv %Ev,%Gv",
        !           222:        "shld%Zv %Ev,%Gv,%Ib",  "shld%Zv %Ev,%Gv,cl",
        !           223:                                "cmpxchg%Zb %Eb,%Gb",   "cmpxchg%Zb %Ev,%Gv",
        !           224:        "push gs",      "pop gs",       NULL,           "bts%Zv %Ev,%Gv",
        !           225:        "shrd%Zv %Ev,%Gv,%Ib",  "shrd%Zv %Ev,%Gv,cl",
        !           226:                                        NULL,           "imul%Zv %Gv,%Ev",
        !           227: 
        !           228:        /* B */
        !           229:        NULL,           NULL,           "lss%Zv %Mp",   "btr%Zv %Ev,%Gv",
        !           230:        "lfs%Zv %Mp",   "lgs%Zv %Mp",   "movzx%Zb %Gv,%Eb", "movzx%Zw %Gv,%Ew",
        !           231:        NULL,           NULL,           "%g8%Zv %Ev,%Ib", "btc%Zv %Ev,%Gv",
        !           232:        "bsf%Zv %Gv,%Ev", "bsr%Zv %Gv,%Ev", "movsx%Zb %Gv,%Eb", "movsx%Zw %Gv,%Ew",
        !           233: 
        !           234:        /* C */
        !           235:        "xadd%Zb %Eb,%Gb",      "xadd%Zb %Ev,%Gv",      NULL,           NULL,
        !           236:        NULL,                   NULL,                   NULL,           NULL,
        !           237:        "bswap%Zb %Eb,%Gb",     "bswap%Zb %Ev,%Gv",     NULL,           NULL,
        !           238:        NULL,                   NULL,                   NULL,           NULL,
        !           239: 
        !           240:        /* D */
        !           241:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           242:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           243: 
        !           244:        /* E */
        !           245:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           246:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           247: 
        !           248:        /* F */
        !           249:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           250:        NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL
        !           251: };
        !           252: 
        !           253: /******************************************************************************/
        !           254: 
        !           255: /*
        !           256:  * Intel groups 1 to 8.
        !           257:  */
        !           258: char   *grp_map[9][8] = {
        !           259:        /* grpStrMap[0][] is the %Ev case for grpStrMap[3][]. */
        !           260:        "test%Zv %Ev,%Iv", "test%Zv %Ev,%Iv,",  "not%Zv %Ev",   "neg%Zv %Ev",
        !           261:        "mul%Zv %eax,%Ev", "imul%Zv %eax,%Ev",  "div%Zv %eax,%Ev", "idiv%Zv %eax,%Ev",
        !           262: 
        !           263:        /* grp[1][] */
        !           264:        "add",  "or",   "adc",  "sbb",  "and",  "sub",  "xor",  "cmp",
        !           265: 
        !           266:        /* grp[2][] */
        !           267:        "rol",  "ror",  "rcl",  "rcr",  "shl",  "shr",  "shl",  "sar",
        !           268: 
        !           269:        /* grp[3][] */
        !           270:        "test%Zb %Eb,%Ib", "test%Zb %Eb,%Ib,",  "not%Zb %Eb",    "neg%Zb %Eb",
        !           271:        "mul%Zb al,%Eb",   "imul%Zb al,%Eb",    "div%Zb al,%Eb", "idiv%Zb al,%Eb",
        !           272: 
        !           273:        /* grp[4][] */
        !           274:        "inc%Zb %Eb",   "dec%Zb %Eb",   NULL,           NULL,
        !           275:        NULL,           NULL,           NULL,           NULL,
        !           276: 
        !           277:        /* grp[5][] */
        !           278:        "inc%Zv %Ev",   "dec%Zv %Ev",   "icall %Ev",    "ilcall %Ep",
        !           279:        "ijmp %Ev",     "iljmp %Ep",    "push%Zv %Ev",  NULL,
        !           280: 
        !           281:        /* grp[6][] */
        !           282:        "sldt %Ew",     "str %Ew",      "lldt %Ew",     "ltr %Ew",
        !           283:        "verr %Ew",     "verw %Ew",     NULL,           NULL,
        !           284: 
        !           285:        /* grp[7][] */
        !           286:        "sgdt %Ms",     "sidt %Ms",     "lgdt%Zv %Ms",  "lidt%Zv %Ms",
        !           287:        "smsw %Ew",     NULL,           "lmsw %Ew",     "invlpg %Ms",
        !           288: 
        !           289:        /* grp[8][] */
        !           290:        NULL,   NULL,   NULL,   NULL,   "bt",   "bts",  "btr",  "btc"
        !           291: };
        !           292: 
        !           293: /******************************************************************************/
        !           294: 
        !           295: /*
        !           296:  * NDP opcode tables.
        !           297:  * Each opcode is preceded by an implicit 'f'.
        !           298:  */
        !           299: 
        !           300: /* NDPtab[] is used with memory operand when mod!=3. */
        !           301: char *NDP_op[8][8] = {
        !           302: /*           /0       /1       /2        /3       /4        /5       /6        /7 */
        !           303: /* 0xD8 */  "adds",  "muls",  "coms",  "comps",  "subs",  "subrs",  "divs",  "divrs",
        !           304: /* 0xD9 */   "lds",    NULL,   "sts",   "stps", "ldenv",   "ldcw","nstenv",  "nstcw",
        !           305: /* 0xDA */ "iaddl", "imull", "icoml", "icompl", "isubl", "isubrl", "idivl", "idivrl",
        !           306: /* 0xDB */  "ildl",    NULL,  "istl",  "istpl",    NULL,    "ldt",    NULL,   "stpt",
        !           307: /* 0xDC */  "addl",  "mull",  "coml",  "compl",  "subl",  "subrl",  "divl",  "divrl",
        !           308: /* 0xDD */   "ldl",    NULL,   "stl",   "stpl", "rstor",     NULL, "nsave",    "stsw",
        !           309: /* 0xDE */ "iadds", "imuls", "icoms", "icomps", "isubs", "isubrs", "idivs", "idivrs",
        !           310: /* 0xDF */  "ilds",    NULL,  "ists",  "istps",   "bld",  "ildll",  "bstp",  "istpll"
        !           311: };
        !           312: 
        !           313: /*
        !           314:  * NDPtab3[] is used when mod==3.
        !           315:  * The opcode always takes an NDP register from the r/m field as operand.
        !           316:  * The first character indicates NDP register operand format:
        !           317:  *     1       op takes one fpreg operand "%st(n)"
        !           318:  *     2       op takes operands "%st(0), %st(n)"
        !           319:  *     3       op takes operands "%st(n), %st(0)"
        !           320:  */
        !           321: char *NDP_op_3[8][8] = {
        !           322: /*             0xC0    0xC8    0xD0    0xD8    0xE0    0xE8    0xF0    0xF8 */
        !           323: /* 0xD8 */     "2add", "2mul", "2com","1comp", "2sub", "2subr","2div", "2divr",
        !           324: /* 0xD9 */     "1ld",  "2xch", NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           325: /* 0xDA */     NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           326: /* 0xDB */     NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
        !           327: /* 0xDC */     "3add", "3mul", NULL,   NULL,   "3sub", "3subr","3div", "3divr",
        !           328: /* 0xDD */     "1free",NULL,   "1st",  "1stp", "3ucom","3ucomp", NULL, NULL,
        !           329: /* 0xDE */     "3addp","3mulp",NULL,   NULL,  "3subp","3subrp","3divp","3divrp",
        !           330: /* 0xDF */     NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL
        !           331: };
        !           332: 
        !           333: /*
        !           334:  * NDP_misc_op[] is used when mod==3 and the NDP_op_3[][] contains NULL.
        !           335:  * This 0-terminated sorted list is searched linearly for the remaining opcodes;
        !           336:  * they are too sparse for efficient table lookup.
        !           337:  */
        !           338: NDPMTAB        NDP_misc_op[] = {
        !           339:        { 0xD9D0,       "nop" },
        !           340:        { 0xD9E0,       "chs" },
        !           341:        { 0xD9E1,       "abs" },
        !           342:        { 0xD9E4,       "tst" },
        !           343:        { 0xD9E5,       "xam" },
        !           344:        { 0xD9E8,       "ld1" },
        !           345:        { 0xD9E9,       "ldl2t" },
        !           346:        { 0xD9EA,       "ldl2e" },
        !           347:        { 0xD9EB,       "ldpi" },
        !           348:        { 0xD9EC,       "ldlg2" },
        !           349:        { 0xD9ED,       "ldln2" },
        !           350:        { 0xD9EE,       "ldz" },
        !           351:        { 0xD9F0,       "2xm1" },
        !           352:        { 0xD9F1,       "yl2x" },
        !           353:        { 0xD9F2,       "ptan" },
        !           354:        { 0xD9F3,       "patan" },
        !           355:        { 0xD9F4,       "xtract" },
        !           356:        { 0xD9F5,       "prem1" },
        !           357:        { 0xD9F6,       "decstp" },
        !           358:        { 0xD9F7,       "incstp" },
        !           359:        { 0xD9F8,       "prem" },
        !           360:        { 0xD9F9,       "yl2xp1" },
        !           361:        { 0xD9FA,       "sqrt" },
        !           362:        { 0xD9FB,       "sincos" },
        !           363:        { 0xD9FC,       "rndint" },
        !           364:        { 0xD9FD,       "scale" },
        !           365:        { 0xD9FE,       "sin" },
        !           366:        { 0xD9FF,       "cos" },
        !           367:        { 0xDAE9,       "ucompp" },
        !           368:        { 0xDBE2,       "nclex" },
        !           369:        { 0xDBE3,       "ninit" },
        !           370:        { 0xDBE4,       "setpm" },
        !           371:        { 0xDBF4,       "rstpm" },
        !           372:        { 0xDED9,       "compp" },
        !           373:        { 0xDFE0,       "nstsw\t%ax" },
        !           374:        { 0,            NULL }
        !           375: };
        !           376: 
        !           377: /******************************************************************************/
        !           378: 
        !           379: /* 
        !           380:  * i80386 registers.
        !           381:  */
        !           382: 
        !           383: /* Segment registers. */
        !           384: char   *segReg[] = {"es", "cs", "ss", "ds", "fs", "gs" };
        !           385: 
        !           386: /* General registers. */
        !           387: char   *genReg[3][8] = {
        !           388: /*                 0       1       2       3       4       5       6       7 */
        !           389: /* [0] 8-bit  */  "%al",  "%cl",  "%dl",  "%bl",  "%ah",  "%ch",  "%dh",  "%bh",
        !           390: /* [1] 16-bit */  "%ax",  "%cx",  "%dx",  "%bx",  "%sp",  "%bp",  "%si",  "%di",
        !           391: /* [2] 32-bit */ "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi"
        !           392: };
        !           393: 
        !           394: /* Control registers. */
        !           395: char *ctrlReg[] = {
        !           396:        "%cr0", "%cr1", "%cr2", "%cr3"  
        !           397: };
        !           398: 
        !           399: /* Debug registers. */
        !           400: char *dbgReg[] = {
        !           401:        "%dr0", "%dr1", "%dr2", "%dr3", "%dr4", "%dr5", "%dr6", "%dr7"  
        !           402: };
        !           403: 
        !           404: /* Test registers. */
        !           405: char *tstReg[] = {
        !           406:        NULL, NULL, NULL, NULL, NULL, NULL, "%tr6", "%tr7"      
        !           407: };
        !           408: 
        !           409: /* NDP registers. */
        !           410: char *NDPReg[] = {
        !           411:        "%st", "%st(1)", "%st(2)", "%st(3)", "%st(4)", "%st(5)", "%st(6)", "%st(7)"
        !           412: };
        !           413: 
        !           414: /******************************************************************************/
        !           415: 
        !           416: /*
        !           417:  * Indirect addressing mode tables.
        !           418:  */
        !           419: 
        !           420: /* 16 and 32 bit indirect addressing with the mod r/m byte. */
        !           421: char *modRMtab[2][8] = {
        !           422: 
        !           423:        /* [0] 16 bit indirect addressing. */
        !           424:        "(%bx)(%si)",   "(%bx)(%di)",   "(%bp)(%si)",   "(%bp)(%di)",
        !           425:        "(%si)",        "(%di)",        "(%bp)",        "(%bx)",
        !           426: 
        !           427:        /* [1] 32 bit indirect addressing. */
        !           428:        "(%eax)",       "(%ecx)",       "(%edx)",       "(%ebx)", 
        !           429:        "(%esp)",       "(%ebp)",       "(%esi)",       "(%edi)"                
        !           430: };
        !           431: 
        !           432: /* 32 bit indirect indexed addressing forms with the SIB byte. */
        !           433: char   *sibtab[4][8] = { 
        !           434: 
        !           435:        /* [0] scale by 1 */
        !           436:        "(%eax)",       "(%ecx)",       "(%edx)",       "(%ebx)",
        !           437:        NULL,           "(%ebp)",       "(%esi)",       "(%edi)",
        !           438: 
        !           439:        /* [1] scale by 2 */
        !           440:        "(%eax*2)",     "(%ecx*2)",     "(%edx*2)",     "(%ebx*2)",
        !           441:         NULL,          "(%ebp*2)",     "(%esi*2)",     "(%edi*2)",
        !           442: 
        !           443:        /* [2] scale by 4 */
        !           444:        "(%eax*4)",     "(%ecx*4)",     "(%edx*4)",     "(%ebx*4)", 
        !           445:         NULL,          "(%ebp*4)",     "(%esi*4)",     "(%edi*4)",
        !           446: 
        !           447:        /* [3] scale by 8 */
        !           448:        "(%eax*8)",     "(%ecx*8)",     "(%edx*8)",     "(%ebx*8)", 
        !           449:         NULL,          "(%ebp*8)",     "(%esi*8)",     "(%edi*8)"
        !           450: };
        !           451: 
        !           452: /******************************************************************************/
        !           453: 
        !           454: /* end of db/i386/i386db3.c */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.