⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i386.h

📁 早期freebsd实现
💻 H
📖 第 1 页 / 共 3 页
字号:
   in assembler syntax. */{"fsub", 1, 0xd8e0, _, ShortForm, FloatReg, 0, 0},{"fsub", 2, 0xd8e0, _, ShortForm, FloatReg, FloatAcc, 0},#ifdef NON_BROKEN_OPCODES{"fsub", 2, 0xdce8, _, ShortForm, FloatAcc, FloatReg, 0},#else{"fsub", 2, 0xdce0, _, ShortForm, FloatAcc, FloatReg, 0},#endif{"fsub", 0, 0xdce1, _, NoModrm, 0, 0, 0},{"fsubp", 1, 0xdae0, _, ShortForm, FloatReg, 0, 0},{"fsubp", 2, 0xdae0, _, ShortForm, FloatReg, FloatAcc, 0},#ifdef NON_BROKEN_OPCODES{"fsubp", 2, 0xdee8, _, ShortForm, FloatAcc, FloatReg, 0},#else{"fsubp", 2, 0xdee0, _, ShortForm, FloatAcc, FloatReg, 0},#endif{"fsubp", 0, 0xdee1, _, NoModrm, 0, 0, 0},{"fsubs", 1, 0xd8, 4, Modrm, Mem, 0, 0},{"fisubl", 1, 0xda, 4, Modrm, Mem, 0, 0},{"fsubl", 1, 0xdc, 4, Modrm, Mem, 0, 0},{"fisubs", 1, 0xde, 4, Modrm, Mem, 0, 0},/* sub reverse */{"fsubr", 1, 0xd8e8, _, ShortForm, FloatReg, 0, 0},{"fsubr", 2, 0xd8e8, _, ShortForm, FloatReg, FloatAcc, 0},#ifdef NON_BROKEN_OPCODES{"fsubr", 2, 0xdce0, _, ShortForm, FloatAcc, FloatReg, 0},#else{"fsubr", 2, 0xdce8, _, ShortForm, FloatAcc, FloatReg, 0},#endif{"fsubr", 0, 0xdce9, _, NoModrm, 0, 0, 0},{"fsubrp", 1, 0xdae8, _, ShortForm, FloatReg, 0, 0},{"fsubrp", 2, 0xdae8, _, ShortForm, FloatReg, FloatAcc, 0},#ifdef NON_BROKEN_OPCODES{"fsubrp", 2, 0xdee0, _, ShortForm, FloatAcc, FloatReg, 0},#else{"fsubrp", 2, 0xdee8, _, ShortForm, FloatAcc, FloatReg, 0},#endif{"fsubrp", 0, 0xdee9, _, NoModrm, 0, 0, 0},{"fsubrs", 1, 0xd8, 5, Modrm, Mem, 0, 0},{"fisubrl", 1, 0xda, 5, Modrm, Mem, 0, 0},{"fsubrl", 1, 0xdc, 5, Modrm, Mem, 0, 0},{"fisubrs", 1, 0xde, 5, Modrm, Mem, 0, 0},/* mul */{"fmul", 1, 0xd8c8, _, ShortForm, FloatReg, 0, 0},{"fmul", 2, 0xd8c8, _, ShortForm|FloatD, FloatReg, FloatAcc, 0},{"fmul", 0, 0xdcc9, _, NoModrm, 0, 0, 0},{"fmulp", 1, 0xdac8, _, ShortForm, FloatReg, 0, 0},{"fmulp", 2, 0xdac8, _, ShortForm|FloatD, FloatReg, FloatAcc, 0},{"fmulp", 0, 0xdec9, _, NoModrm, 0, 0, 0},{"fmuls", 1, 0xd8, 1, Modrm, Mem, 0, 0},{"fimull", 1, 0xda, 1, Modrm, Mem, 0, 0},{"fmull", 1, 0xdc, 1, Modrm, Mem, 0, 0},{"fimuls", 1, 0xde, 1, Modrm, Mem, 0, 0},/* div *//* Note:  intel has decided that certain of these operations are reversed   in assembler syntax. */{"fdiv", 1, 0xd8f0, _, ShortForm, FloatReg, 0, 0},{"fdiv", 2, 0xd8f0, _, ShortForm, FloatReg, FloatAcc, 0},#ifdef NON_BROKEN_OPCODES{"fdiv", 2, 0xdcf8, _, ShortForm, FloatAcc, FloatReg, 0},#else{"fdiv", 2, 0xdcf0, _, ShortForm, FloatAcc, FloatReg, 0},#endif{"fdiv", 0, 0xdcf1, _, NoModrm, 0, 0, 0},{"fdivp", 1, 0xdaf0, _, ShortForm, FloatReg, 0, 0},{"fdivp", 2, 0xdaf0, _, ShortForm, FloatReg, FloatAcc, 0},#ifdef NON_BROKEN_OPCODES{"fdivp", 2, 0xdef8, _, ShortForm, FloatAcc, FloatReg, 0},#else{"fdivp", 2, 0xdef0, _, ShortForm, FloatAcc, FloatReg, 0},#endif{"fdivp", 0, 0xdef1, _, NoModrm, 0, 0, 0},{"fdivs", 1, 0xd8, 6, Modrm, Mem, 0, 0},{"fidivl", 1, 0xda, 6, Modrm, Mem, 0, 0},{"fdivl", 1, 0xdc, 6, Modrm, Mem, 0, 0},{"fidivs", 1, 0xde, 6, Modrm, Mem, 0, 0},/* div reverse */{"fdivr", 1, 0xd8f8, _, ShortForm, FloatReg, 0, 0},{"fdivr", 2, 0xd8f8, _, ShortForm, FloatReg, FloatAcc, 0},#ifdef NON_BROKEN_OPCODES{"fdivr", 2, 0xdcf0, _, ShortForm, FloatAcc, FloatReg, 0},#else{"fdivr", 2, 0xdcf8, _, ShortForm, FloatAcc, FloatReg, 0},#endif{"fdivr", 0, 0xdcf9, _, NoModrm, 0, 0, 0},{"fdivrp", 1, 0xdaf8, _, ShortForm, FloatReg, 0, 0},{"fdivrp", 2, 0xdaf8, _, ShortForm, FloatReg, FloatAcc, 0},#ifdef NON_BROKEN_OPCODES{"fdivrp", 2, 0xdef0, _, ShortForm, FloatAcc, FloatReg, 0},#else{"fdivrp", 2, 0xdef8, _, ShortForm, FloatAcc, FloatReg, 0},#endif{"fdivrp", 0, 0xdef9, _, NoModrm, 0, 0, 0},{"fdivrs", 1, 0xd8, 7, Modrm, Mem, 0, 0},{"fidivrl", 1, 0xda, 7, Modrm, Mem, 0, 0},{"fdivrl", 1, 0xdc, 7, Modrm, Mem, 0, 0},{"fidivrs", 1, 0xde, 7, Modrm, Mem, 0, 0},{"f2xm1", 0,   0xd9f0, _, NoModrm, 0, 0, 0},{"fyl2x", 0,   0xd9f1, _, NoModrm, 0, 0, 0},{"fptan", 0,   0xd9f2, _, NoModrm, 0, 0, 0},{"fpatan", 0,  0xd9f3, _, NoModrm, 0, 0, 0},{"fxtract", 0, 0xd9f4, _, NoModrm, 0, 0, 0},{"fprem1", 0,  0xd9f5, _, NoModrm, 0, 0, 0},{"fdecstp", 0,  0xd9f6, _, NoModrm, 0, 0, 0},{"fincstp", 0,  0xd9f7, _, NoModrm, 0, 0, 0},{"fprem", 0,   0xd9f8, _, NoModrm, 0, 0, 0},{"fyl2xp1", 0, 0xd9f9, _, NoModrm, 0, 0, 0},{"fsqrt", 0,   0xd9fa, _, NoModrm, 0, 0, 0},{"fsincos", 0, 0xd9fb, _, NoModrm, 0, 0, 0},{"frndint", 0, 0xd9fc, _, NoModrm, 0, 0, 0},{"fscale", 0,  0xd9fd, _, NoModrm, 0, 0, 0},{"fsin", 0,    0xd9fe, _, NoModrm, 0, 0, 0},{"fcos", 0,    0xd9ff, _, NoModrm, 0, 0, 0},{"fchs", 0, 0xd9e0, _, NoModrm, 0, 0, 0},{"fabs", 0, 0xd9e1, _, NoModrm, 0, 0, 0},/* processor control */{"fninit", 0, 0xdbe3, _, NoModrm, 0, 0, 0},{"finit", 0, 0xdbe3, _, NoModrm, 0, 0, 0},{"fldcw", 1, 0xd9, 5, Modrm, Mem, 0, 0},{"fnstcw", 1, 0xd9, 7, Modrm, Mem, 0, 0},{"fstcw", 1, 0xd9, 7, Modrm, Mem, 0, 0},{"fnstsw", 1, 0xdfe0, _, NoModrm, Acc, 0, 0},{"fnstsw", 1, 0xdd, 7, Modrm, Mem, 0, 0},{"fnstsw", 0, 0xdfe0, _, NoModrm, 0, 0, 0},{"fstsw", 1, 0xdfe0, _, NoModrm, Acc, 0, 0},{"fstsw", 1, 0xdd, 7, Modrm, Mem, 0, 0},{"fstsw", 0, 0xdfe0, _, NoModrm, 0, 0, 0},{"fnclex", 0, 0xdbe2, _, NoModrm, 0, 0, 0},{"fclex", 0, 0xdbe2, _, NoModrm, 0, 0, 0},/* We ignore the short format (287) versions of fstenv/fldenv & fsave/frstor instructions;  i'm not sure how to add them or how they are different. My 386/387 book offers no details about this.*/{"fnstenv", 1, 0xd9, 6, Modrm, Mem, 0, 0},{"fstenv", 1, 0xd9, 6, Modrm, Mem, 0, 0},{"fldenv", 1, 0xd9, 4, Modrm, Mem, 0, 0},{"fnsave", 1, 0xdd, 6, Modrm, Mem, 0, 0},{"fsave", 1, 0xdd, 6, Modrm, Mem, 0, 0},{"frstor", 1, 0xdd, 4, Modrm, Mem, 0, 0},{"ffree", 1, 0xddc0, _, ShortForm, FloatReg, 0, 0},{"fnop", 0, 0xd9d0, _, NoModrm, 0, 0, 0},{"fwait", 0, 0x9b, _, NoModrm, 0, 0, 0},/*  opcode prefixes; we allow them as seperate insns too  (see prefix table below)*/{"aword", 0, 0x67, _, NoModrm, 0, 0, 0},{"addr16", 0, 0x67, _, NoModrm, 0, 0, 0},{"word", 0, 0x66, _, NoModrm, 0, 0, 0},{"data16", 0, 0x66, _, NoModrm, 0, 0, 0},{"lock", 0, 0xf0, _, NoModrm, 0, 0, 0},{"cs", 0, 0x2e, _, NoModrm, 0, 0, 0},{"ds", 0, 0x3e, _, NoModrm, 0, 0, 0},{"es", 0, 0x26, _, NoModrm, 0, 0, 0},{"fs", 0, 0x64, _, NoModrm, 0, 0, 0},{"gs", 0, 0x65, _, NoModrm, 0, 0, 0},{"ss", 0, 0x36, _, NoModrm, 0, 0, 0},{"rep", 0, 0xf3, _, NoModrm, 0, 0, 0},{"repe", 0, 0xf3, _, NoModrm, 0, 0, 0},{"repz", 0, 0xf3, _, NoModrm, 0, 0, 0},{"repne", 0, 0xf2, _, NoModrm, 0, 0, 0},{"repnz", 0, 0xf2, _, NoModrm, 0, 0, 0},{"", 0, 0, 0, 0, 0, 0, 0}	/* sentinal */};#undef _static const template *i386_optab_end   = i386_optab + sizeof (i386_optab)/sizeof(i386_optab[0]);/* 386 register table */static const reg_entry i386_regtab[] = {  /* 8 bit regs */  {"al", Reg8|Acc, 0}, {"cl", Reg8|ShiftCount, 1}, {"dl", Reg8, 2},  {"bl", Reg8, 3},  {"ah", Reg8, 4}, {"ch", Reg8, 5}, {"dh", Reg8, 6}, {"bh", Reg8, 7},  /* 16 bit regs */  {"ax", Reg16|Acc, 0}, {"cx", Reg16, 1}, {"dx", Reg16|InOutPortReg, 2}, {"bx", Reg16, 3},  {"sp", Reg16, 4}, {"bp", Reg16, 5}, {"si", Reg16, 6}, {"di", Reg16, 7},  /* 32 bit regs */  {"eax", Reg32|Acc, 0}, {"ecx", Reg32, 1}, {"edx", Reg32, 2}, {"ebx", Reg32, 3},  {"esp", Reg32, 4}, {"ebp", Reg32, 5}, {"esi", Reg32, 6}, {"edi", Reg32, 7},  /* segment registers */  {"es", SReg2, 0}, {"cs", SReg2, 1}, {"ss", SReg2, 2},  {"ds", SReg2, 3}, {"fs", SReg3, 4}, {"gs", SReg3, 5},  /* control registers */  {"cr0", Control, 0},   {"cr2", Control, 2},   {"cr3", Control, 3},  /* debug registers */  {"db0", Debug, 0},   {"db1", Debug, 1},   {"db2", Debug, 2},  {"db3", Debug, 3},   {"db6", Debug, 6},   {"db7", Debug, 7},  /* test registers */  {"tr6", Test, 6}, {"tr7", Test, 7},  /* float registers */  {"st(0)", FloatReg|FloatAcc, 0},  {"st", FloatReg|FloatAcc, 0},  {"st(1)", FloatReg, 1}, {"st(2)", FloatReg, 2},   {"st(3)", FloatReg, 3}, {"st(4)", FloatReg, 4}, {"st(5)", FloatReg, 5},   {"st(6)", FloatReg, 6}, {"st(7)", FloatReg, 7}};#define MAX_REG_NAME_SIZE 8	/* for parsing register names from input */static const reg_entry *i386_regtab_end  = i386_regtab + sizeof(i386_regtab)/sizeof(i386_regtab[0]);/* segment stuff */static const seg_entry cs = { "cs", 0x2e };static const seg_entry ds = { "ds", 0x3e };static const seg_entry ss = { "ss", 0x36 };static const seg_entry es = { "es", 0x26 };static const seg_entry fs = { "fs", 0x64 };static const seg_entry gs = { "gs", 0x65 };static const seg_entry null = { "", 0x0 };/*  This table is used to store the default segment register implied by all  possible memory addressing modes.  It is indexed by the mode & modrm entries of the modrm byte as follows:      index = (mode<<3) | modrm;*/static const seg_entry *one_byte_segment_defaults[] = {  /* mode 0 */  &ds, &ds, &ds, &ds, &null, &ds, &ds, &ds,  /* mode 1 */  &ds, &ds, &ds, &ds, &null, &ss, &ds, &ds,  /* mode 2 */  &ds, &ds, &ds, &ds, &null, &ss, &ds, &ds,  /* mode 3 --- not a memory reference; never referenced */};static const seg_entry *two_byte_segment_defaults[] = {  /* mode 0 */  &ds, &ds, &ds, &ds, &ss, &ds, &ds, &ds,  /* mode 1 */  &ds, &ds, &ds, &ds, &ss, &ds, &ds, &ds,  /* mode 2 */  &ds, &ds, &ds, &ds, &ss, &ds, &ds, &ds,  /* mode 3 --- not a memory reference; never referenced */};static const prefix_entry i386_prefixtab[] = {  { "addr16", 0x67 },		/* address size prefix ==> 16bit addressing				 * (How is this useful?) */#define WORD_PREFIX_OPCODE 0x66  { "data16", 0x66 },		/* operand size prefix */  { "lock", 0xf0 },		/* bus lock prefix */  { "wait", 0x9b },		/* wait for coprocessor */  { "cs", 0x2e }, { "ds", 0x3e }, /* segment overrides ... */  { "es", 0x26 }, { "fs", 0x64 },  { "gs", 0x65 }, { "ss", 0x36 },/* REPE & REPNE used to detect rep/repne with a non-string instruction */#define REPNE 0xf2#define REPE  0xf3  { "rep", 0xf3 }, 		/* repeat string instructions */  { "repe", 0xf3 },  { "repz", 0xf3 },  { "repne", 0xf2 }, { "repnz", 0xf2 }};static const prefix_entry *i386_prefixtab_end  = i386_prefixtab + sizeof(i386_prefixtab)/sizeof(i386_prefixtab[0]);/* end of i386-opcode.h */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -