|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.