📄 i386.h
字号:
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 + -