Annotation of coherent/b/bin/db/i386/i386db3.c, revision 1.1.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.