Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1287 lines
64 KiB

/********************************** module *********************************/
/* */
/* d3.h */
/* disassembler tables for CodeView's disassembler */
/* */
/***************************************************************************/
/* */
/* @ Purpose: */
/* */
/* @ Functions included: */
/* */
/* Revision History: */
/* */
/* [03] 31-dec-91 DavidGra */
/* */
/* Correctly handle rep/lock prefices. */
/* */
/* [02] 15-nov-91 DavidGra */
/* */
/* Fix cmpxchg - these are extended opcodes B0 & B1 instead */
/* of A6 & A7 as the intel documentation claims. */
/* */
/* [01] 15-nov-91 DavidGra */
/* */
/* Make the 8c form of MOV output WORD PTR [] */
/* */
/* [00] 15-nov-91 DavidGra */
/* */
/* Added support to correctly handle MOV[S|Z]X */
/* */
/* @ Author: Gerd Immeyer @ Version: */
/* */
/* @ Creation Date: 10.19.89 @ Modification Date: */
/* */
/***************************************************************************/
#ifdef HOST32
typedef unsigned char CBC;
#else
typedef unsigned char _based(_segname("_CODE")) CBC;
#endif
/* Strings: Operand mnemonics, Segment overrides, etc. for disasm */
CBC dszAAA[] = "aaa";
CBC dszAAD[] = "aad";
CBC dszAAM[] = "aam";
CBC dszAAS[] = "aas";
CBC dszADC[] = "adc";
CBC dszADD[] = "add";
CBC dszADDRPRFX[] = "";
CBC dszAND[] = "and";
CBC dszARPL[] = "arpl";
CBC dszBOP[] = "bop";
CBC dszBOUND[] = "bound";
CBC dszBSF[] = "bsf";
CBC dszBSR[] = "bsr";
#if 0
CBC dszBST[] = "bst";
#endif
CBC dszBSWAP[] = "bswap";
CBC dszBT[] = "bt";
CBC dszBTC[] = "btc";
CBC dszBTR[] = "btr";
CBC dszBTS[] = "bts";
CBC dszCALL[] = "call";
CBC dszCBW[] = "cbw";
#if 0
CBC dszCDQ[] = "cdq";
#endif
CBC dszCLC[] = "clc";
CBC dszCLD[] = "cld";
CBC dszCLI[] = "cli";
CBC dszCLTS[] = "clts";
CBC dszCMC[] = "cmc";
CBC dszCMP[] = "cmp";
#if 0
CBC dszCMPS[] = "cmps";
#endif
CBC dszCMPSB[] = "cmpsb";
#if 0
CBC dszCMPSD[] = "cmpsd";
#endif
CBC dszCMPSW[] = "cmpsw";
CBC dszCMPXCHG[] = "cmpxchg";
CBC dszCS_[] = "cs:";
CBC dszCWD[] = "cwd";
CBC dszCWDE[] = "cwde";
CBC dszDAA[] = "daa";
CBC dszDAS[] = "das";
CBC dszDEC[] = "dec";
CBC dszDIV[] = "div";
CBC dszDS_[] = "ds:";
CBC dszENTER[] = "enter";
CBC dszES_[] = "es:";
CBC dszF2XM1[] = "f2xm1";
CBC dszFABS[] = "fabs";
CBC dszFADD[] = "fadd";
CBC dszFADDP[] = "faddp";
CBC dszFBLD[] = "fbld";
CBC dszFBSTP[] = "fbstp";
CBC dszFCHS[] = "fchs";
#if 0
CBC dszFCLEX[] = "fclex";
#endif
CBC dszFCOM[] = "fcom";
CBC dszFCOMP[] = "fcomp";
CBC dszFCOMPP[] = "fcompp";
CBC dszFCOS[] = "fcos";
CBC dszFDECSTP[] = "fdecstp";
CBC dszFDISI[] = "fdisi";
CBC dszFDIV[] = "fdiv";
CBC dszFDIVP[] = "fdivp";
CBC dszFDIVR[] = "fdivr";
CBC dszFDIVRP[] = "fdivrp";
CBC dszFENI[] = "feni";
CBC dszFFREE[] = "ffree";
CBC dszFIADD[] = "fiadd";
CBC dszFICOM[] = "ficom";
CBC dszFICOMP[] = "ficomp";
CBC dszFIDIV[] = "fidiv";
CBC dszFIDIVR[] = "fidivr";
CBC dszFILD[] = "fild";
CBC dszFIMUL[] = "fimul";
CBC dszFINCSTP[] = "fincstp";
#if 0
CBC dszFINIT[] = "finit";
#endif
CBC dszFIST[] = "fist";
CBC dszFISTP[] = "fistp";
CBC dszFISUB[] = "fisub";
CBC dszFISUBR[] = "fisubr";
CBC dszFLD[] = "fld";
CBC dszFLD1[] = "fld1";
CBC dszFLDCW[] = "fldcw";
CBC dszFLDENV[] = "fldenv";
CBC dszFLDL2E[] = "fldl2e";
CBC dszFLDL2T[] = "fldl2t";
CBC dszFLDLG2[] = "fldlg2";
CBC dszFLDLN2[] = "fldln2";
CBC dszFLDPI[] = "fldpi";
CBC dszFLDZ[] = "fldz";
CBC dszFMUL[] = "fmul";
CBC dszFMULP[] = "fmulp";
CBC dszFNCLEX[] = "fnclex";
#if 0
CBC dszFNDISI[] = "fndisi";
CBC dszFNENI[] = "fneni";
#endif
CBC dszFNINIT[] = "fninit";
CBC dszFNOP[] = "fnop";
CBC dszFNSAVE[] = "fnsave";
CBC dszFNSTCW[] = "fnstcw";
CBC dszFNSTENV[] = "fnstenv";
CBC dszFNSTSW[] = "fnstsw";
CBC dszFPATAN[] = "fpatan";
CBC dszFPREM[] = "fprem";
CBC dszFPREM1[] = "fprem1";
CBC dszFPTAN[] = "fptan";
CBC dszFRNDINT[] = "frndint";
CBC dszFRSTOR[] = "frstor";
#if 0
CBC dszFSAVE[] = "fsave";
#endif
CBC dszFSCALE[] = "fscale";
CBC dszFSETPM[] = "fsetpm";
CBC dszFSIN[] = "fsin";
CBC dszFSINCOS[] = "fsincos";
CBC dszFSQRT[] = "fsqrt";
CBC dszFST[] = "fst";
#if 0
CBC dszFSTCW[] = "fstcw";
CBC dszFSTENV[] = "fstenv";
#endif
CBC dszFSTP[] = "fstp";
#if 0
CBC dszFSTSW[] = "fstsw";
#endif
CBC dszFSUB[] = "fsub";
CBC dszFSUBP[] = "fsubp";
CBC dszFSUBR[] = "fsubr";
CBC dszFSUBRP[] = "fsubrp";
CBC dszFS_[] = "fs:";
CBC dszFTST[] = "ftst";
CBC dszFUCOM[] = "fucom";
CBC dszFUCOMP[] = "fucomp";
CBC dszFUCOMPP[] = "fucompp";
CBC dszFWAIT[] = "fwait";
CBC dszFXAM[] = "fxam";
CBC dszFXCH[] = "fxch";
CBC dszFXTRACT[] = "fxtract";
CBC dszFYL2X[] = "fyl2x";
CBC dszFYL2XP1[] = "fyl2xp1";
CBC dszGS_[] = "gs:";
CBC dszHLT[] = "hlt";
#if 0
CBC dszIBTS[] = "ibts";
#endif
CBC dszIDIV[] = "idiv";
CBC dszIMUL[] = "imul";
CBC dszIN[] = "in";
CBC dszINC[] = "inc";
#if 0
CBC dszINS[] = "ins";
#endif
CBC dszINSB[] = "insb";
#if 0
CBC dszINSD[] = "insd";
#endif
CBC dszINSW[] = "insw";
CBC dszINT[] = "int";
CBC dszINTO[] = "into";
CBC dszINVD[] = "invd";
CBC dszINVLPG[] = "invlpg";
CBC dszIRET[] = "iret";
#if 0
CBC dszIRETD[] = "iretd";
#endif
CBC dszJA[] = "ja";
CBC dszJAE[] = "jae";
CBC dszJB[] = "jb";
CBC dszJBE[] = "jbe";
CBC dszJCXZ[] = "jcxz";
CBC dszJE[] = "je";
CBC dszJECXZ[] = "jecxz";
CBC dszJG[] = "jg";
CBC dszJGE[] = "jge";
CBC dszJL[] = "jl";
CBC dszJLE[] = "jle";
CBC dszJMP[] = "jmp";
CBC dszJNE[] = "jne";
CBC dszJNO[] = "jno";
CBC dszJNP[] = "jnp";
CBC dszJNS[] = "jns";
CBC dszJO[] = "jo";
CBC dszJP[] = "jp";
CBC dszJS[] = "js";
CBC dszLAHF[] = "lahf";
CBC dszLAR[] = "lar";
CBC dszLDS[] = "lds";
CBC dszLEA[] = "lea";
CBC dszLEAVE[] = "leave";
CBC dszLES[] = "les";
CBC dszLFS[] = "lfs";
CBC dszLGDT[] = "lgdt";
CBC dszLGS[] = "lgs";
CBC dszLIDT[] = "lidt";
CBC dszLLDT[] = "lldt";
CBC dszLMSW[] = "lmsw";
CBC dszLOADALL[] = "loadall";
CBC dszLOCK[] = "lock";
#if 0
CBC dszLODS[] = "lods";
#endif
CBC dszLODSB[] = "lodsb";
#if 0
CBC dszLODSD[] = "lodsd";
#endif
CBC dszLODSW[] = "lodsw";
CBC dszLOOP[] = "loop";
CBC dszLOOPE[] = "loope";
CBC dszLOOPNE[] = "loopne";
#if 0
CBC dszLOOPNZ[] = "loopnz";
CBC dszLOOPZ[] = "loopz";
#endif
CBC dszLSL[] = "lsl";
CBC dszLSS[] = "lss";
CBC dszLTR[] = "ltr";
CBC dszMOV[] = "mov";
#if 0
CBC dszMOVS[] = "movs";
#endif
CBC dszMOVSB[] = "movsb";
#if 0
CBC dszMOVSD[] = "movsd";
#endif
CBC dszMOVSW[] = "movsw";
CBC dszMOVSX[] = "movsx";
CBC dszMOVZX[] = "movzx";
CBC dszMUL[] = "mul";
CBC dszMULTI[] = "";
CBC dszNEG[] = "neg";
CBC dszNOP[] = "nop";
CBC dszNOT[] = "not";
CBC dszOPPRFX[] = "";
CBC dszOR[] = "or";
CBC dszOUT[] = "out";
#if 0
CBC dszOUTS[] = "outs";
#endif
CBC dszOUTSB[] = "outsb";
#if 0
CBC dszOUTSD[] = "outsd";
#endif
CBC dszOUTSW[] = "outsw";
CBC dszPOP[] = "pop";
CBC dszPOPA[] = "popa";
#if 0
CBC dszPOPAD[] = "popad";
#endif
CBC dszPOPF[] = "popf";
#if 0
CBC dszPOPFD[] = "popfd";
#endif
CBC dszPUSH[] = "push";
CBC dszPUSHA[] = "pusha";
#if 0
CBC dszPUSHAD[] = "pushad";
#endif
CBC dszPUSHF[] = "pushf";
#if 0
CBC dszPUSHFD[] = "pushfd";
#endif
CBC dszRCL[] = "rcl";
CBC dszRCR[] = "rcr";
CBC dszREP[] = "rep";
#if 0
CBC dszREPE[] = "repe";
#endif
CBC dszREPNE[] = "repne";
#if 0
CBC dszREPNZ[] = "repnz";
CBC dszREPZ[] = "repz";
CBC dszRET[] = "ret";
#endif
CBC dszRETF[] = "retf";
CBC dszRETN[] = "retn";
CBC dszROL[] = "rol";
CBC dszROR[] = "ror";
CBC dszSAHF[] = "sahf";
CBC dszSAL[] = "sal";
CBC dszSAR[] = "sar";
CBC dszSBB[] = "sbb";
#if 0
CBC dszSCAS[] = "scas";
#endif
CBC dszSCASB[] = "scasb";
#if 0
CBC dszSCASD[] = "scasd";
#endif
CBC dszSCASW[] = "scasw";
CBC dszSETA[] = "seta";
CBC dszSETAE[] = "setae";
CBC dszSETB[] = "setb";
CBC dszSETBE[] = "setbe";
CBC dszSETE[] = "sete";
CBC dszSETG[] = "setg";
CBC dszSETGE[] = "setge";
CBC dszSETL[] = "setl";
CBC dszSETLE[] = "setle";
#if 0
CBC dszSETNAE[] = "setnae";
#endif
CBC dszSETNE[] = "setne";
CBC dszSETNO[] = "setno";
CBC dszSETNP[] = "setnp";
CBC dszSETNS[] = "setns";
CBC dszSETO[] = "seto";
CBC dszSETP[] = "setp";
CBC dszSETS[] = "sets";
CBC dszSGDT[] = "sgdt";
CBC dszSHL[] = "shl";
CBC dszSHLD[] = "shld";
CBC dszSHR[] = "shr";
CBC dszSHRD[] = "shrd";
CBC dszSIDT[] = "sidt";
CBC dszSLDT[] = "sldt";
CBC dszSMSW[] = "smsw";
CBC dszSS_[] = "ss:";
CBC dszSTC[] = "stc";
CBC dszSTD[] = "std";
CBC dszSTI[] = "sti";
#if 0
CBC dszSTOS[] = "stos";
#endif
CBC dszSTOSB[] = "stosb";
#if 0
CBC dszSTOSD[] = "stosd";
#endif
CBC dszSTOSW[] = "stosw";
CBC dszSTR[] = "str";
CBC dszSUB[] = "sub";
CBC dszTEST[] = "test";
CBC dszVERR[] = "verr";
CBC dszVERW[] = "verw";
CBC dszWAIT[] = "wait";
CBC dszWBINVD[] = "wbinvd";
CBC dszXADD[] = "xadd";
#if 0
CBC dszXBTS[] = "xbts";
#endif
CBC dszXCHG[] = "xchg";
CBC dszXLAT[] = "xlat";
CBC dszXOR[] = "xor";
CBC dszRESERVED[] = "???";
#if 0
CBC dszDB[] = "db";
#endif // 0
#define MRM 0x40 /* (1 << 3) */
#define COM 0x80 /* (2 << 3) */
#define END 0xc0 /* (3 << 3) */
/* Enumeration of valid actions that can be included in the action table */
enum oprtyp {
ADDRP, ADR_OVR, ALSTR, ALT, /* 00-03 */
AXSTR, BOREG, BREG, BRSTR, /* 04-07 */
BYT, CHR, CREG, DWRD, /* 08-0b */
EDWRD, EGROUPT, FARPTR, GROUP, /* 0c-0f */
GROUPT, IB, IST, IST_ST, /* 10-13 */
IV, IW, LMODRM, MODRM, /* 14-17 */
NOP, OFFS, OPC0F, OPR_OVR, /* 18-1b */
QWRD, REL16, REL8, REP, /* 1c-1f */
SEG_OVR, SREG2, SREG3, ST_IST, /* 20-23 */
STROP, TBYT, UBYT, VAR, /* 24-27 */
VOREG, VREG, EWRD, WRD, /* 28-2b */
WREG, DREG, WRSTR, OPR16, /* 2c-2f */
FWRD, BOP /* 30-33 */
};
/* Enumeration of indices into the action table for instruction classes */
#define O_DoDB 0
#define O_NoOperands 0
#define O_NoOpAlt4 O_NoOperands+1
#define O_NoOpAlt3 O_NoOpAlt4+2
#define O_NoOpAlt2 O_NoOpAlt3+2
#define O_NoOpAlt1 O_NoOpAlt2+2
#define O_NoOpAlt0 O_NoOpAlt1+2
#define O_NoOpStrSI O_NoOpAlt0+2
#define O_NoOpStrDI O_NoOpStrSI+2
#define O_NoOpStrSIDI O_NoOpStrDI+2
#define O_bModrm_Reg O_NoOpStrSIDI+2
#define O_vModrm_Reg O_bModrm_Reg+3
#define O_Modrm_Reg O_vModrm_Reg+3
#define O_bReg_Modrm O_Modrm_Reg+3
#define O_fReg_Modrm O_bReg_Modrm+3
#define O_Reg_Modrm O_fReg_Modrm+3
#define O_AL_Ib O_Reg_Modrm+3
#define O_AX_Iv O_AL_Ib+2
#define O_sReg2 O_AX_Iv+2
#define O_oReg O_sReg2+1
#define O_DoBound O_oReg+1
#define O_Iv O_DoBound+3
#define O_wModrm_Reg O_Iv+1
#define O_Ib O_wModrm_Reg+3
#define O_Imulb O_Ib+1
#define O_Imul O_Imulb+4
#define O_Rel8 O_Imul+4
#define O_bModrm_Ib O_Rel8+1
#define O_Modrm_Ib O_bModrm_Ib+3
#define O_Modrm_Iv O_Modrm_Ib+3
#define O_Modrm_sReg3 O_Modrm_Iv+3
#define O_sReg3_Modrm O_Modrm_sReg3+4
#define O_Modrm O_sReg3_Modrm+4
#define O_FarPtr O_Modrm+2
#define O_AL_Offs O_FarPtr+1
#define O_Offs_AL O_AL_Offs+2
#define O_AX_Offs O_Offs_AL+2
#define O_Offs_AX O_AX_Offs+2
#define O_oReg_Ib O_Offs_AX+2
#define O_oReg_Iv O_oReg_Ib+2
#define O_Iw O_oReg_Iv+2
#define O_Enter O_Iw+1
#define O_Ubyte_AL O_Enter+2
#define O_Ubyte_AX O_Ubyte_AL+2
#define O_AL_Ubyte O_Ubyte_AX+2
#define O_AX_Ubyte O_AL_Ubyte+2
#define O_DoInAL O_AX_Ubyte+2
#define O_DoInAX O_DoInAL+3
#define O_DoOutAL O_DoInAX+3
#define O_DoOutAX O_DoOutAL+3
#define O_Rel16 O_DoOutAX+3
#define O_ADR_OVERRIDE O_Rel16+1
#define O_OPR_OVERRIDE O_ADR_OVERRIDE+1
#define O_SEG_OVERRIDE O_OPR_OVERRIDE+1
#define O_DoInt3 O_SEG_OVERRIDE+1
#if (O_DoInt3 != 117)
#error "operand table has been modified!"
#endif
/* #define O_DoInt O_DoInt3+2 */
#define O_DoInt 119
#define O_OPC0F O_DoInt+1
#define O_GROUP11 O_OPC0F+1
#define O_GROUP13 O_GROUP11+5
#define O_GROUP12 O_GROUP13+5
#define O_GROUP21 O_GROUP12+5
#define O_GROUP22 O_GROUP21+5
#define O_GROUP23 O_GROUP22+5
#define O_GROUP24 O_GROUP23+6
#define O_GROUP25 O_GROUP24+6
#define O_GROUP26 O_GROUP25+6
#define O_GROUP4 O_GROUP26+6
#define O_GROUP6 O_GROUP4+4
#define O_GROUP8 O_GROUP6+4
#define O_GROUP31 O_GROUP8+5
#define O_GROUP32 O_GROUP31+3
#define O_GROUP5 O_GROUP32+3
#define O_GROUP7 O_GROUP5+3
#define O_x87_ESC O_GROUP7+3
#define O_bModrm O_x87_ESC+2
#define O_wModrm O_bModrm+2
#define O_dModrm O_wModrm+2
#define O_fModrm O_dModrm+2
#define O_vModrm O_fModrm+2
#define O_vModrm_Iv O_vModrm+2
#define O_Reg_bModrm O_vModrm_Iv+3
#define O_Reg_wModrm O_Reg_bModrm+3
#define O_Modrm_Reg_Ib O_Reg_wModrm+3
#define O_Modrm_Reg_CL O_Modrm_Reg_Ib+4
#define O_ST_iST O_Modrm_Reg_CL+5
#define O_iST O_ST_iST+2
#define O_iST_ST O_iST+2
#define O_qModrm O_iST_ST+2
#define O_tModrm O_qModrm+2
#define O_DoRep O_tModrm+2
#define O_Modrm_CReg O_DoRep+1
#define O_CReg_Modrm O_Modrm_CReg+3
#define O_AX_oReg O_CReg_Modrm+3
#define O_fw_Modrm O_AX_oReg+2
#define O_AX O_fw_Modrm+2
#define O_BOP O_AX+2
#define O_length O_BOP+2
#if( O_length > 255 )
#error "operand table too large!"
#endif
/* The action table: range of lists of actions to be taken for each */
/* possible instruction class. */
static CBC actiontbl[] = {
/* NoOperands */ (CBC) (NOP+END),
/* NoOpAlt4 */ (CBC) (ALT+END), (CBC) (4),
/* NoOpAlt3 */ (CBC) (ALT+END), (CBC) (3),
/* NoOpAlt2 */ (CBC) (ALT+END), (CBC) (2),
/* NoOpAlt1 */ (CBC) (ALT+END), (CBC) (1),
/* NoOpAlt0 */ (CBC) (ALT+END), (CBC) (0),
/* NoOpStrSI */ (CBC) (STROP+END),(CBC) (1),
/* NoOpStrDI */ (CBC) (STROP+END),(CBC) (2),
/* NoOpStrSIDI */ (CBC) (STROP+END),(CBC) (3),
/* bModrm_Reg */ (CBC) (BYT+MRM), (CBC) (LMODRM+COM),(CBC) (BREG+END),
/* vModrm_Reg */ (CBC) (VAR+MRM), (CBC) (LMODRM+COM),(CBC) (VREG+END),
/* Modrm_Reg */ (CBC) (VAR+MRM), (CBC) (LMODRM+COM),(CBC) (VREG+END),
/* bReg_Modrm */ (CBC) (BYT+MRM), (CBC) (BREG+COM), (CBC) (LMODRM+END),
/* fReg_Modrm */ (CBC) (FARPTR+MRM),(CBC) (VREG+COM), (CBC) (LMODRM+END),
/* Reg_Modrm */ (CBC) (VAR+MRM), (CBC) (VREG+COM), (CBC) (LMODRM+END),
/* AL_Ib */ (CBC) (ALSTR+COM),(CBC) (IB+END),
/* AX_Iv */ (CBC) (AXSTR+COM),(CBC) (IV+END),
/* sReg2 */ (CBC) (SREG2+END),
/* oReg */ (CBC) (VOREG+END),
/* DoBound */ (CBC) (VAR+MRM), (CBC) (VREG+COM), (CBC) (MODRM+END),
/* Iv */ (CBC) (IV+END),
/* wModrm_Reg */ (CBC) (WRD+MRM), (CBC) (LMODRM+COM),(CBC) (WREG+END),
/* Ib */ (CBC) (IB+END),
/* Imulb */ (CBC) (VAR+MRM), (CBC) (VREG+COM), (CBC) (LMODRM+COM),(CBC) (IB+END),
/* Imul */ (CBC) (VAR+MRM), (CBC) (VREG+COM), (CBC) (LMODRM+COM),(CBC) (IV+END),
/* REL8 */ (CBC) (REL8+END),
/* bModrm_Ib */ (CBC) (BYT+MRM), (CBC) (LMODRM+COM),(CBC) (IB+END),
/* Modrm_Ib */ (CBC) (VAR+MRM), (CBC) (LMODRM+COM),(CBC) (IB+END),
/* Modrm_Iv */ (CBC) (VAR+MRM), (CBC) (LMODRM+COM),(CBC) (IV+END),
/* Modrm_sReg3 */ OPR16, (CBC) (WRD+MRM), (CBC) (LMODRM+COM), (CBC) (SREG3+END),
/* sReg3_Modrm */ OPR16, (CBC) (WRD+MRM), (CBC) (SREG3+COM), (CBC) (LMODRM+END),
/* Modrm */ (CBC) (VAR+MRM), (CBC) (LMODRM+END),
/* FarPtr */ (CBC) (ADDRP+END),
/* AL_Offs */ (CBC) (ALSTR+COM),(CBC) (OFFS+END),
/* Offs_AL */ (CBC) (OFFS+COM), (CBC) (ALSTR+END),
/* AX_Offs */ (CBC) (AXSTR+COM),(CBC) (OFFS+END),
/* Offs_AX */ (CBC) (OFFS+COM), (CBC) (AXSTR+END),
/* oReg_Ib */ (CBC) (BOREG+COM),(CBC) (IB+END),
/* oReg_Iv */ (CBC) (VOREG+COM),(CBC) (IV+END),
/* Iw */ (CBC) (IW+END),
/* enter */ (CBC) (IW+COM), (CBC) (IB+END),
/* Ubyte_AL */ (CBC) (UBYT+COM), (CBC) (ALSTR+END),
/* Ubyte_AX */ (CBC) (UBYT+COM), (CBC) (AXSTR+END),
/* AL_Ubyte */ (CBC) (ALSTR+COM),(CBC) (UBYT+END),
/* AX_Ubyte */ (CBC) (AXSTR+COM),(CBC) (UBYT+END),
/* DoInAL */ (CBC) (ALSTR+COM),(CBC) (WRSTR+END), (CBC) (2),
/* DoInAX */ (CBC) (AXSTR+COM),(CBC) (WRSTR+END), (CBC) (2),
/* DoOutAL */ (CBC) (WRSTR+COM),(CBC) (2), (CBC) (ALSTR+END),
/* DoOutAX */ (CBC) (WRSTR+COM),(CBC) (2), (CBC) (AXSTR+END),
/* REL16 */ (CBC) (REL16+END),
/* ADR_OVERRIDE*/ (CBC) (ADR_OVR),
/* OPR_OVERRIDE*/ (CBC) (OPR_OVR),
/* SEG_OVERRIDE*/ (CBC) (SEG_OVR),
/* DoInt3 */ (CBC) (CHR+END), (CBC) ('3'),
/* DoInt */ (CBC) (UBYT+END),
/* Opcode0F */ (CBC) (OPC0F),
/* group1_1 */ (CBC) (BYT+MRM), (CBC) (GROUP), (CBC) (0), (CBC) (LMODRM+COM),(CBC) (IB+END),
/* group1_3 */ (CBC) (VAR+MRM), (CBC) (GROUP), (CBC) (0), (CBC) (LMODRM+COM),(CBC) (IB+END),
/* group1_2 */ (CBC) (VAR+MRM), (CBC) (GROUP), (CBC) (0), (CBC) (LMODRM+COM),(CBC) (IV+END),
/* group2_1 */ (CBC) (BYT+MRM), (CBC) (GROUP), (CBC) (1), (CBC) (LMODRM+COM),(CBC) (IB+END),
/* group2_2 */ (CBC) (VAR+MRM), (CBC) (GROUP), (CBC) (1), (CBC) (LMODRM+COM),(CBC) (IB+END),
/* group2_3 */ (CBC) (BYT+MRM), (CBC) (GROUP), (CBC) (1), (CBC) (LMODRM+COM),(CBC) (CHR+END), (CBC) ('1'),
/* group2_4 */ (CBC) (VAR+MRM), (CBC) (GROUP), (CBC) (1), (CBC) (LMODRM+COM),(CBC) (CHR+END), (CBC) ('1'),
/* group2_5 */ (CBC) (BYT+MRM), (CBC) (GROUP), (CBC) (1), (CBC) (LMODRM+COM),(CBC) (BRSTR+END),(CBC) (1),
/* group2_6 */ (CBC) (VAR+MRM), (CBC) (GROUP), (CBC) (1), (CBC) (LMODRM+COM),(CBC) (BRSTR+END),(CBC) (1),
/* group4 */ (CBC) (BYT+MRM), (CBC) (GROUP), (CBC) (2), (CBC) (LMODRM+END),
/* group6 */ (CBC) (WRD+MRM), (CBC) (GROUP), (CBC) (3), (CBC) (LMODRM+END),
/* group8 */ (CBC) (VAR+MRM), (CBC) (GROUP), (CBC) (4), (CBC) (LMODRM+COM),(CBC) (IB+END),
/* group3_1 */ (CBC) (BYT), (CBC) (GROUPT),(CBC) (20),
/* group3_2 */ (CBC) (VAR), (CBC) (GROUPT),(CBC) (21),
/* group5 */ (CBC) (VAR), (CBC) (GROUPT),(CBC) (22), // ????
/* group7 */ (CBC) (NOP), (CBC) (GROUPT),(CBC) (23),
/* x87_ESC */ (CBC) (NOP+MRM), (CBC) (EGROUPT),
/* bModrm */ (CBC) (BYT+MRM), (CBC) (LMODRM+END),
/* wModrm */ (CBC) (WRD+MRM), (CBC) (LMODRM+END),
/* dModrm */ (CBC) (DWRD+MRM), (CBC) (LMODRM+END),
/* fModrm */ (CBC) (FARPTR+MRM),(CBC) (LMODRM+END),
/* vModrm */ (CBC) (VAR+MRM), (CBC) (LMODRM+END),
/* vModrm_Iv */ (CBC) (VAR+MRM), (CBC) (LMODRM+COM),(CBC) (IV+END),
/* reg_bModrm */ (CBC) (BYT+MRM), (CBC) (VREG+COM), (CBC) (LMODRM+END),
/* reg_wModrm */ (CBC) (EWRD+MRM), (CBC) (DREG+COM), (CBC) (LMODRM+END), // [00]
/* Modrm_Reg_Ib*/ (CBC) (VAR+MRM), (CBC) (LMODRM+COM), (CBC) (VREG+COM), (CBC) (IB+END),
/* Modrm_Reg_CL*/ (CBC) (VAR+MRM), (CBC) (LMODRM+COM), (CBC) (VREG+COM), (CBC) (BRSTR+END),(CBC) (1),
/* ST_iST */ (CBC) (NOP+MRM), (CBC) (ST_IST+END),
/* iST */ (CBC) (NOP+MRM), (CBC) (IST+END),
/* iST_ST */ (CBC) (NOP+MRM), (CBC) (IST_ST+END),
/* qModrm */ (CBC) (QWRD+MRM), (CBC) (LMODRM+END),
/* tModrm */ (CBC) (TBYT+MRM), (CBC) (LMODRM+END),
/* REP */ (CBC) (REP),
/* Modrm_CReg */ (CBC) (EDWRD+MRM),(CBC) (MODRM+COM), (CBC) (CREG+END),
/* CReg_Modrm */ (CBC) (EDWRD+MRM),(CBC) (CREG+COM), (CBC) (MODRM+END),
/* AX_oReg */ (CBC) (AXSTR+COM), (CBC) (VOREG+END),
/* fw_Modrm */ (CBC) (FWRD+MRM), (CBC) (LMODRM+END),
/* AX */ (CBC) (OPR16), (CBC) (AXSTR+END),
/* BOP */ (CBC) (BOP), (CBC) (UBYT+END)
};
#ifdef HOST_i386
#pragma pack(1)
#endif
typedef struct Tdistbl{
CBC *instruct;
unsigned char opr;
} Tdistbl;
/* List of ordered pairs for each instruction: */
/* (pointer to string literal mnemonic, */
/* instruction class index for action table) */
static Tdistbl distbl[] = {
dszADD, O_bModrm_Reg, /* 00 ADD mem/reg, reg (byte) */
dszADD, O_Modrm_Reg, /* 01 ADD mem/reg, reg (var) */
dszADD, O_bReg_Modrm, /* 02 ADD reg, mem/reg (byte) */
dszADD, O_Reg_Modrm, /* 03 ADD reg, mem/reg (var) */
dszADD, O_AL_Ib, /* 04 ADD AL, I */
dszADD, O_AX_Iv, /* 05 ADD AX, I */
dszPUSH, O_sReg2, /* 06 PUSH ES */
dszPOP, O_sReg2, /* 07 POP ES */
dszOR, O_bModrm_Reg, /* 08 OR mem/reg, reg (byte) */
dszOR, O_Modrm_Reg, /* 09 OR mem/reg, reg (word) */
dszOR, O_bReg_Modrm, /* 0A OR reg, mem/reg (byte) */
dszOR, O_Reg_Modrm, /* 0B OR reg, mem/reg (word) */
dszOR, O_AL_Ib, /* 0C OR AL, I */
dszOR, O_AX_Iv, /* 0D OR AX, I */
dszPUSH, O_sReg2, /* 0E PUSH CS */
dszMULTI, O_OPC0F, /* 0F CLTS & protection ctl(286) */
dszADC, O_bModrm_Reg, /* 10 ADC mem/reg, reg (byte) */
dszADC, O_Modrm_Reg, /* 11 ADC mem/reg, reg (word) */
dszADC, O_bReg_Modrm, /* 12 ADC reg, mem/reg (byte) */
dszADC, O_Reg_Modrm, /* 13 ADC reg, mem/reg (word) */
dszADC, O_AL_Ib, /* 14 ADC AL, I */
dszADC, O_AX_Iv, /* 15 ADC AX, I */
dszPUSH, O_sReg2, /* 16 PUSH SS */
dszPOP, O_sReg2, /* 17 POP SS */
dszSBB, O_bModrm_Reg, /* 18 SBB mem/reg, reg (byte) */
dszSBB, O_Modrm_Reg, /* 19 SBB mem/reg, reg (word) */
dszSBB, O_bReg_Modrm, /* 1A SBB reg, mem/reg (byte) */
dszSBB, O_Reg_Modrm, /* 1B SBB reg, mem/reg (word) */
dszSBB, O_AL_Ib, /* 1C SBB AL, I */
dszSBB, O_AX_Iv, /* 1D SBB AX, I */
dszPUSH, O_sReg2, /* 1E PUSH DS */
dszPOP, O_sReg2, /* 1F POP DS */
dszAND, O_bModrm_Reg, /* 20 AND mem/reg, reg (byte) */
dszAND, O_Modrm_Reg, /* 21 AND mem/reg, reg (word) */
dszAND, O_bReg_Modrm, /* 22 AND reg, mem/reg (byte) */
dszAND, O_Reg_Modrm, /* 23 AND reg, mem/reg (word) */
dszAND, O_AL_Ib, /* 24 AND AL, I */
dszAND, O_AX_Iv, /* 25 AND AX, I */
dszES_, O_SEG_OVERRIDE, /* 26 SEG ES: */
dszDAA, O_NoOperands, /* 27 DAA */
dszSUB, O_bModrm_Reg, /* 28 SUB mem/reg, reg (byte) */
dszSUB, O_Modrm_Reg, /* 29 SUB mem/reg, reg (word) */
dszSUB, O_bReg_Modrm, /* 2A SUB reg, mem/reg (byte) */
dszSUB, O_Reg_Modrm, /* 2B SUB reg, mem/reg (word) */
dszSUB, O_AL_Ib, /* 2C SUB AL, I */
dszSUB, O_AX_Iv, /* 2D SUB AX, I */
dszCS_, O_SEG_OVERRIDE, /* 2E SEG CS: */
dszDAS, O_NoOperands, /* 2F DAS */
dszXOR, O_bModrm_Reg, /* 30 XOR mem/reg, reg (byte) */
dszXOR, O_Modrm_Reg, /* 31 XOR mem/reg, reg (word) */
dszXOR, O_bReg_Modrm, /* 32 XOR reg, mem/reg (byte) */
dszXOR, O_Reg_Modrm, /* 33 XOR reg, mem/reg (word) */
dszXOR, O_AL_Ib, /* 34 XOR AL, I */
dszXOR, O_AX_Iv, /* 35 XOR AX, I */
dszSS_, O_SEG_OVERRIDE, /* 36 SEG SS: */
dszAAA, O_NoOperands, /* 37 AAA */
dszCMP, O_bModrm_Reg, /* 38 CMP mem/reg, reg (byte) */
dszCMP, O_Modrm_Reg, /* 39 CMP mem/reg, reg (word) */
dszCMP, O_bReg_Modrm, /* 3A CMP reg, mem/reg (byte) */
dszCMP, O_Reg_Modrm, /* 3B CMP reg, mem/reg (word) */
dszCMP, O_AL_Ib, /* 3C CMP AL, I */
dszCMP, O_AX_Iv, /* 3D CMP AX, I */
dszDS_, O_SEG_OVERRIDE, /* 3E SEG DS: */
dszAAS, O_NoOperands, /* 3F AAS */
dszINC, O_oReg, /* 40 INC AX */
dszINC, O_oReg, /* 41 INC CX */
dszINC, O_oReg, /* 42 INC DX */
dszINC, O_oReg, /* 43 INC BX */
dszINC, O_oReg, /* 44 INC SP */
dszINC, O_oReg, /* 45 INC BP */
dszINC, O_oReg, /* 46 INC SI */
dszINC, O_oReg, /* 47 INC DI */
dszDEC, O_oReg, /* 48 DEC AX */
dszDEC, O_oReg, /* 49 DEC CX */
dszDEC, O_oReg, /* 4A DEC DX */
dszDEC, O_oReg, /* 4B DEC BX */
dszDEC, O_oReg, /* 4C DEC SP */
dszDEC, O_oReg, /* 4D DEC BP */
dszDEC, O_oReg, /* 4E DEC SI */
dszDEC, O_oReg, /* 4F DEC DI */
dszPUSH, O_oReg, /* 50 PUSH AX */
dszPUSH, O_oReg, /* 51 PUSH CX */
dszPUSH, O_oReg, /* 52 PUSH DX */
dszPUSH, O_oReg, /* 53 PUSH BX */
dszPUSH, O_oReg, /* 54 PUSH SP */
dszPUSH, O_oReg, /* 55 PUSH BP */
dszPUSH, O_oReg, /* 56 PUSH SI */
dszPUSH, O_oReg, /* 57 PUSH DI */
dszPOP, O_oReg, /* 58 POP AX */
dszPOP, O_oReg, /* 59 POP CX */
dszPOP, O_oReg, /* 5A POP DX */
dszPOP, O_oReg, /* 5B POP BX */
dszPOP, O_oReg, /* 5C POP SP */
dszPOP, O_oReg, /* 5D POP BP */
dszPOP, O_oReg, /* 5E POP SI */
dszPOP, O_oReg, /* 5F POP DI */
dszPUSHA, O_NoOpAlt3, /* 60 PUSHA (286) / PUSHAD (386) */
dszPOPA, O_NoOpAlt3, /* 61 POPA (286) / POPAD (286) */
dszBOUND, O_DoBound, /* 62 BOUND reg, Modrm (286) */
dszARPL, O_Modrm_Reg, /* 63 ARPL Modrm, reg (286) */
dszFS_, O_SEG_OVERRIDE, /* 64 */
dszGS_, O_SEG_OVERRIDE, /* 65 */
dszOPPRFX,O_OPR_OVERRIDE, /* 66 */
dszADDRPRFX,O_ADR_OVERRIDE, /* 67 */
dszPUSH, O_Iv, /* 68 PUSH word (286) */
dszIMUL, O_Imul, /* 69 IMUL (286) */
dszPUSH, O_Ib, /* 6A PUSH byte (286) */
dszIMUL, O_Imulb, /* 6B IMUL (286) */
dszINSB, O_NoOperands, /* 6C INSB (286) */
dszINSW, O_NoOpAlt2, /* 6D INSW (286) / INSD (386) */
dszOUTSB, O_NoOperands, /* 6E OUTSB (286) */
dszOUTSW, O_NoOpAlt2, /* 6F OUTSW (286) / OUTSD (386) */
dszJO, O_Rel8, /* 70 JO */
dszJNO, O_Rel8, /* 71 JNO */
dszJB, O_Rel8, /* 72 JB or JNAE or JC */
dszJAE, O_Rel8, /* 73 JNB or JAE or JNC */
dszJE, O_Rel8, /* 74 JE or JZ */
dszJNE, O_Rel8, /* 75 JNE or JNZ */
dszJBE, O_Rel8, /* 76 JBE or JNA */
dszJA, O_Rel8, /* 77 JNBE or JA */
dszJS, O_Rel8, /* 78 JS */
dszJNS, O_Rel8, /* 79 JNS */
dszJP, O_Rel8, /* 7A JP or JPE */
dszJNP, O_Rel8, /* 7B JNP or JPO */
dszJL, O_Rel8, /* 7C JL or JNGE */
dszJGE, O_Rel8, /* 7D JNL or JGE */
dszJLE, O_Rel8, /* 7E JLE or JNG */
dszJG, O_Rel8, /* 7F JNLE or JG */
dszMULTI, O_GROUP11, /* 80 */
dszMULTI, O_GROUP12, /* 81 */
dszRESERVED, O_DoDB, /* 82 */
dszMULTI, O_GROUP13, /* 83 */
dszTEST, O_bModrm_Reg, /* 84 TEST reg, mem/reg (byte) */
dszTEST, O_Modrm_Reg, /* 85 TEST reg, mem/reg (word) */
dszXCHG, O_bModrm_Reg, /* 86 XCHG reg, mem/reg (byte) */
dszXCHG, O_Modrm_Reg, /* 87 XCHG reg, mem/reg (word) */
dszMOV, O_bModrm_Reg, /* 88 MOV mem/reg, reg (byte) */
dszMOV, O_Modrm_Reg, /* 89 MOV mem/reg, reg (word) */
dszMOV, O_bReg_Modrm, /* 8A MOV reg, mem/reg (byte) */
dszMOV, O_Reg_Modrm, /* 8B MOV reg, mem/reg (word) */
dszMOV, O_Modrm_sReg3, /* 8C MOV mem/reg, segreg */
dszLEA, O_Reg_Modrm, /* 8D LEA reg, mem */
dszMOV, O_sReg3_Modrm, /* 8E MOV segreg, mem/reg */
dszPOP, O_Modrm, /* 8F POP mem/reg */
dszNOP, O_NoOperands, /* 90 NOP */
dszXCHG, O_AX_oReg, /* 91 XCHG AX,CX */
dszXCHG, O_AX_oReg, /* 92 XCHG AX,DX */
dszXCHG, O_AX_oReg, /* 93 XCHG AX,BX */
dszXCHG, O_AX_oReg, /* 94 XCHG AX,SP */
dszXCHG, O_AX_oReg, /* 95 XCHG AX,BP */
dszXCHG, O_AX_oReg, /* 96 XCHG AX,SI */
dszXCHG, O_AX_oReg, /* 97 XCHG AX,DI */
dszCBW, O_NoOpAlt0, /* 98 CBW / CWDE (386) */
dszCWD, O_NoOpAlt1, /* 99 CWD / CDQ (386) */
dszCALL, O_FarPtr, /* 9A CALL seg:off */
dszWAIT, O_NoOperands, /* 9B WAIT */
dszPUSHF, O_NoOpAlt3, /* 9C PUSHF / PUSHFD (386) */
dszPOPF, O_NoOpAlt3, /* 9D POPF / POPFD (386) */
dszSAHF, O_NoOperands, /* 9E SAHF */
dszLAHF, O_NoOperands, /* 9F LAHF */
dszMOV, O_AL_Offs, /* A0 MOV AL, mem */
dszMOV, O_AX_Offs, /* A1 MOV AX, mem */
dszMOV, O_Offs_AL, /* A2 MOV mem, AL */
dszMOV, O_Offs_AX, /* A3 MOV mem, AX */
dszMOVSB, O_NoOpStrSIDI, /* A4 MOVSB */
dszMOVSW, O_NoOpStrSIDI, /* A5 MOVSW / MOVSD (386) */
dszCMPSB, O_NoOpStrSIDI, /* A6 CMPSB */
dszCMPSW, O_NoOpStrSIDI, /* A7 CMPSW / CMPSD (386) */
dszTEST, O_AL_Ib, /* A8 TEST AL, I */
dszTEST, O_AX_Iv, /* A9 TEST AX, I */
dszSTOSB, O_NoOpStrDI, /* AA STOSB */
dszSTOSW, O_NoOpStrDI, /* AB STOSW / STOSD (386) */
dszLODSB, O_NoOpStrSI, /* AC LODSB */
dszLODSW, O_NoOpStrSI, /* AD LODSW / LODSD (386) */
dszSCASB, O_NoOpStrDI, /* AE SCASB */
dszSCASW, O_NoOpStrDI, /* AF SCASW / SCASD (386) */
dszMOV, O_oReg_Ib, /* B0 MOV AL, I */
dszMOV, O_oReg_Ib, /* B1 MOV CL, I */
dszMOV, O_oReg_Ib, /* B2 MOV DL, I */
dszMOV, O_oReg_Ib, /* B3 MOV BL, I */
dszMOV, O_oReg_Ib, /* B4 MOV AH, I */
dszMOV, O_oReg_Ib, /* B5 MOV CH, I */
dszMOV, O_oReg_Ib, /* B6 MOV DH, I */
dszMOV, O_oReg_Ib, /* B7 MOV BH, I */
dszMOV, O_oReg_Iv, /* B8 MOV AX, I */
dszMOV, O_oReg_Iv, /* B9 MOV CX, I */
dszMOV, O_oReg_Iv, /* BA MOV DX, I */
dszMOV, O_oReg_Iv, /* BB MOV BX, I */
dszMOV, O_oReg_Iv, /* BC MOV SP, I */
dszMOV, O_oReg_Iv, /* BD MOV BP, I */
dszMOV, O_oReg_Iv, /* BE MOV SI, I */
dszMOV, O_oReg_Iv, /* BF MOV DI, I */
dszMULTI, O_GROUP21, /* C0 shifts & rotates (286) */
dszMULTI, O_GROUP22, /* C1 shifts & rotates (286) */
dszRETN, O_Iw, /* C2 RET Rel16 */
dszRETN, O_NoOperands, /* C3 RET */
dszLES, O_BOP, /* C4 LES reg, mem */
dszLDS, O_fReg_Modrm, /* C5 LDS reg, mem */
dszMOV, O_bModrm_Ib, /* C6 MOV mem/reg, I(byte) */
dszMOV, O_Modrm_Iv, /* C7 MOV mem/reg, I(word) */
dszENTER, O_Enter, /* C8 ENTER (286) */
dszLEAVE, O_NoOperands, /* C9 LEAVE (286) */
dszRETF, O_Iw, /* CA RETF I(word) */
dszRETF, O_NoOperands, /* CB RETF */
dszINT, O_DoInt3, /* CC INT 3 */
dszINT, O_DoInt, /* CD INT */
dszINTO, O_NoOperands, /* CE INTO */
dszIRET, O_NoOpAlt3, /* CF IRET / IRETD (386) */
dszMULTI, O_GROUP23, /* D0 shifts & rotates,1 (byte) */
dszMULTI, O_GROUP24, /* D1 shifts & rotates,1 (word) */
dszMULTI, O_GROUP25, /* D2 shifts & rotates,CL (byte) */
dszMULTI, O_GROUP26, /* D3 shifts & rotates,CL (word) */
dszAAM, O_Ib, /* D4 AAM */
dszAAD, O_Ib, /* D5 AAD */
dszRESERVED, O_DoDB, /* D6 */
dszXLAT, O_NoOperands, /* D7 XLAT */
dszMULTI, O_x87_ESC, /* D8 ESC */
dszMULTI, O_x87_ESC, /* D9 ESC */
dszMULTI, O_x87_ESC, /* DA ESC */
dszMULTI, O_x87_ESC, /* DB ESC */
dszMULTI, O_x87_ESC, /* DC ESC */
dszMULTI, O_x87_ESC, /* DD ESC */
dszMULTI, O_x87_ESC, /* DE ESC */
dszMULTI, O_x87_ESC, /* DF ESC */
dszLOOPNE,O_Rel8, /* E0 LOOPNE or LOOPNZ */
dszLOOPE, O_Rel8, /* E1 LOOPE or LOOPZ */
dszLOOP, O_Rel8, /* E2 LOOP */
dszJCXZ, O_Rel8, /* E3 JCXZ / JECXZ (386) */
dszIN, O_AL_Ubyte, /* E4 IN AL, I */
dszIN, O_AX_Ubyte, /* E5 IN AX, I */
dszOUT, O_Ubyte_AL, /* E6 OUT I, AL */
dszOUT, O_Ubyte_AX, /* E7 OUT I, AX */
dszCALL, O_Rel16, /* E8 CALL Rel16 */
dszJMP, O_Rel16, /* E9 JMP Rel16 */
dszJMP, O_FarPtr, /* EA JMP seg:off */
dszJMP, O_Rel8, /* EB JMP Rel8 */
dszIN, O_DoInAL, /* EC IN AL, DX */
dszIN, O_DoInAX, /* ED IN AX, DX */
dszOUT, O_DoOutAL, /* EE OUT DX, AL */
dszOUT, O_DoOutAX, /* EF OUT DX, AX */
dszLOCK, O_DoRep, /* F0 LOCK */
dszRESERVED, O_DoDB, /* F1 */
dszREPNE, O_DoRep, /* F2 REPNE or REPNZ */
dszREP, O_DoRep, /* F3 REP or REPE or REPZ */
dszHLT, O_NoOperands, /* F4 HLT */
dszCMC, O_NoOperands, /* F5 CMC */
dszMULTI, O_GROUP31, /* F6 TEST, NOT, NEG, MUL, IMUL, */
dszMULTI, O_GROUP32, /* F7 DIv, IDIv F6=Byte F7=Word */
dszCLC, O_NoOperands, /* F8 CLC */
dszSTC, O_NoOperands, /* F9 STC */
dszCLI, O_NoOperands, /* FA CLI */
dszSTI, O_NoOperands, /* FB STI */
dszCLD, O_NoOperands, /* FC CLD */
dszSTD, O_NoOperands, /* FD STD */
dszMULTI, O_GROUP4, /* FE INC, DEC mem/reg (byte) */
dszMULTI, O_GROUP5, /* FF INC, DEC, CALL, JMP, PUSH */
dszMULTI, O_GROUP6, /* 0 MULTI */
dszMULTI, O_GROUP7, /* 1 MULTI */
dszLAR, O_Reg_Modrm, /* 2 LAR */
dszLSL, O_Reg_Modrm, /* 3 LSL */
dszRESERVED, O_DoDB, /* 4 */
dszLOADALL, O_NoOperands, /* 5 LOADALL */
dszCLTS, O_NoOperands, /* 6 CLTS */
dszRESERVED, O_DoDB, /* 7 */
dszINVD, O_NoOperands, /* 8 INVD */
dszWBINVD, O_NoOperands, /* 9 WBINVD */
dszRESERVED, O_DoDB, /* A */
dszRESERVED, O_DoDB, /* B */
dszRESERVED, O_DoDB, /* C */
dszRESERVED, O_DoDB, /* D */
dszRESERVED, O_DoDB, /* E */
dszRESERVED, O_DoDB, /* F */
dszMOV, O_Modrm_CReg, /* 20 MOV */
dszMOV, O_Modrm_CReg, /* 21 MOV */
dszMOV, O_CReg_Modrm, /* 22 MOV */
dszMOV, O_CReg_Modrm, /* 23 MOV */
dszMOV, O_Modrm_CReg, /* 24 MOV */
dszRESERVED, O_DoDB, /* 25 */
dszMOV, O_CReg_Modrm, /* 26 MOV */
dszSETGE, O_bModrm, /* 7D SETGE or SETNL */
dszRESERVED, O_DoDB, /* 7E */
dszRESERVED, O_DoDB, /* 7F */
dszJO, O_Rel16, /* 80 JO */
dszJNO, O_Rel16, /* 81 JNO */
dszJB, O_Rel16, /* 82 JB */
dszJAE, O_Rel16, /* 83 JAE or JNB */
dszJE, O_Rel16, /* 84 JE */
dszJNE, O_Rel16, /* 85 JNE */
dszJBE, O_Rel16, /* 86 JBE */
dszJA, O_Rel16, /* 87 JA or JNBE */
dszJS, O_Rel16, /* 88 JS */
dszJNS, O_Rel16, /* 89 JNS */
dszJP, O_Rel16, /* 8A JP */
dszJNP, O_Rel16, /* 8B JNP */
dszJL, O_Rel16, /* 8C JL */
dszJGE, O_Rel16, /* 8D JGE or JNL */
dszJLE, O_Rel16, /* 8E JLE */
dszJG, O_Rel16, /* 8F JG or JNLE */
dszSETO, O_bModrm, /* 90 SETO */
dszSETNO, O_bModrm, /* 91 SETNO */
dszSETB, O_bModrm, /* 92 SETB */
dszSETAE, O_bModrm, /* 93 SETAE or SETNB */
dszSETE, O_bModrm, /* 94 SETE */
dszSETNE, O_bModrm, /* 95 SETNE */
dszSETBE, O_bModrm, /* 96 SETBE */
dszSETA, O_bModrm, /* 97 SETNBE */
dszSETS, O_bModrm, /* 98 SETS */
dszSETNS, O_bModrm, /* 99 SETNS */
dszSETP, O_bModrm, /* 9A SETP */
dszSETNP, O_bModrm, /* 9B SETNP */
dszSETL, O_bModrm, /* 9C SETL */
dszSETGE, O_bModrm, /* 9D SETGE */
dszSETLE, O_bModrm, /* 9E SETLE */
dszSETG, O_bModrm, /* 9F SETG or SETNLE */
dszPUSH, O_sReg2, /* A0 PUSH FS */
dszPOP, O_sReg2, /* A1 POP FS */
dszRESERVED, O_DoDB, /* A2 */
dszBT, O_Modrm_Reg, /* A3 BT */
dszSHLD, O_Modrm_Reg_Ib, /* A4 SHLD */
dszSHLD, O_Modrm_Reg_CL, /* A5 SHLD */
dszRESERVED, O_DoDB, /* A6 [02] */
dszRESERVED, O_DoDB, /* A7 [02] */
dszPUSH, O_sReg2, /* A8 PUSH GS */
dszPOP, O_sReg2, /* A9 POP GS */
dszRESERVED, O_DoDB, /* AA */
dszBTS, O_vModrm_Reg, /* AB BTS */
dszSHRD, O_Modrm_Reg_Ib, /* AC SHRD */
dszSHRD, O_Modrm_Reg_CL, /* AD SHRD */
dszRESERVED, O_DoDB, /* AE */
dszIMUL, O_Reg_Modrm, /* AF IMUL */
dszCMPXCHG,O_bModrm_Reg, /* B0 XBTS [02] */
dszCMPXCHG,O_Modrm_Reg, /* B1 IBTS [02] */
dszLSS, O_fReg_Modrm, /* B2 LSS */
dszBTR, O_Modrm_Reg, /* B3 BTR */
dszLFS, O_fReg_Modrm, /* B4 LFS */
dszLGS, O_fReg_Modrm, /* B5 LGS */
dszMOVZX, O_Reg_bModrm, /* B6 MOVZX */
dszMOVZX, O_Reg_wModrm, /* B7 MOVZX */
dszRESERVED, O_DoDB, /* B8 */
dszRESERVED, O_DoDB, /* B9 */
dszMULTI, O_GROUP8, /* BA MULTI */
dszBTC, O_Modrm_Reg, /* BB BTC */
dszBSF, O_Reg_Modrm, /* BC BSF */
dszBSR, O_Reg_Modrm, /* BD BSR */
dszMOVSX, O_Reg_bModrm, /* BE MOVSX */
dszMOVSX, O_Reg_wModrm, /* BF MOVSX */
dszXADD, O_bModrm_Reg, /* C0 XADD */
dszXADD, O_Modrm_Reg, /* C1 XADD */
dszRESERVED, O_DoDB, /* C2 */
dszRESERVED, O_DoDB, /* C3 */
dszRESERVED, O_DoDB, /* C4 */
dszRESERVED, O_DoDB, /* C5 */
dszRESERVED, O_DoDB, /* C6 */
dszRESERVED, O_DoDB, /* C7 */
dszBSWAP, O_oReg, /* C8 BSWAP */
dszBSWAP, O_oReg, /* C9 BSWAP */
dszBSWAP, O_oReg, /* CA BSWAP */
dszBSWAP, O_oReg, /* CB BSWAP */
dszBSWAP, O_oReg, /* CC BSWAP */
dszBSWAP, O_oReg, /* CD BSWAP */
dszBSWAP, O_oReg, /* CE BSWAP */
dszBSWAP, O_oReg /* CF BSWAP */
};
/* Auxilary lists of mnemonics for groups of two byte instructions: */
/* All of the instructions within each of these groups are of the same */
/* class, so only the mnemonic string is needed, the index into the */
/* action table is implicit. */
static CBC *group[][8] = {
/* 00 */ {dszADD, dszOR, dszADC, dszSBB, /* group 1 */
dszAND, dszSUB, dszXOR, dszCMP},
/* 01 */ {dszROL, dszROR, dszRCL, dszRCR, /* group 2 */
dszSHL, dszSHR, dszRESERVED, dszSAR},
/* 02 */ {dszINC, dszDEC, dszRESERVED, dszRESERVED, /* group 4 */
dszRESERVED, dszRESERVED, dszRESERVED, dszRESERVED},
/* 03 */ {dszSLDT, dszSTR, dszLLDT, dszLTR, /* group 6 */
dszVERR, dszVERW, dszRESERVED, dszRESERVED},
/* 04 */ {dszRESERVED, dszRESERVED, dszRESERVED, dszRESERVED, /* group 8 */
dszBT, dszBTS, dszBTR, dszBTC}
};
/* Auxilary orderd pairs for groups of two byte instructions structured */
/* the same was as distbl above. */
static Tdistbl groupt[][8] = {
/* 00 00 x87-D8-1 */
{ dszFADD, O_dModrm, /* D8-0 FADD */
dszFMUL, O_dModrm, /* D8-1 FMUL */
dszFCOM, O_dModrm, /* D8-2 FCOM */
dszFCOMP, O_dModrm, /* D8-3 FCOMP */
dszFSUB, O_dModrm, /* D8-4 FSUB */
dszFSUBR, O_dModrm, /* D8-5 FSUBR */
dszFDIV, O_dModrm, /* D8-6 FDIV */
dszFDIVR, O_dModrm }, /* D8-7 FDIVR */
/* 01 x87-D8-2 */
{ dszFADD, O_ST_iST, /* D8-0 FADD */
dszFMUL, O_ST_iST, /* D8-1 FMUL */
dszFCOM, O_iST, /* D8-2 FCOM */
dszFCOMP, O_iST, /* D8-3 FCOMP */
dszFSUB, O_ST_iST, /* D8-4 FSUB */
dszFSUBR, O_ST_iST, /* D8-5 FSUBR */
dszFDIV, O_ST_iST, /* D8-6 FDIV */
dszFDIVR, O_ST_iST }, /* D8-7 FDIVR */
/* 02 01 x87-D9-1 */
{ dszFLD, O_dModrm, /* D9-0 FLD */
dszRESERVED, O_DoDB, /* D9-1 */
dszFST, O_dModrm, /* D9-2 FST */
dszFSTP, O_dModrm, /* D9-3 FSTP */
dszFLDENV, O_Modrm, /* D9-4 FLDENV */
dszFLDCW, O_Modrm, /* D9-5 FLDCW */
dszFNSTENV, O_Modrm, /* D9-6 FNSTENV */
dszFNSTCW, O_Modrm }, /* D9-7 FNSTCW */
/* 03 01 x87-D9-2 TTT=0,1,2,3 */
{ dszFLD, O_iST, /* D9-0 FLD */
dszFXCH, O_iST, /* D9-1 FXCH */
dszFNOP, O_NoOperands, /* D9-2 FNOP */
dszFSTP, O_iST, /* D9-3 FSTP */
dszRESERVED, O_DoDB, /* D9-4 */
dszRESERVED, O_DoDB, /* D9-5 */
dszRESERVED, O_DoDB, /* D9-6 */
dszRESERVED, O_DoDB }, /* D9-7 */
/* 04 02 x89-DA-1 */
{ dszFIADD, O_dModrm, /* DA-0 FIADD */
dszFIMUL, O_dModrm, /* DA-1 FIMUL */
dszFICOM, O_dModrm, /* DA-2 FICOM */
dszFICOMP, O_dModrm, /* DA-3 FICOMP */
dszFISUB, O_dModrm, /* DA-4 FISUB */
dszFISUBR, O_dModrm, /* DA-5 FISUBR */
dszFIDIV, O_dModrm, /* DA-6 FIDIV */
dszFIDIVR, O_dModrm }, /* DA-7 FIDIVR */
/* 05 x87-DA-2 */
{ dszRESERVED, O_DoDB, /* DA-0 */
dszRESERVED, O_DoDB, /* DA-1 */
dszRESERVED, O_DoDB, /* DA-2 */
dszRESERVED, O_DoDB, /* DA-3 */
dszRESERVED, O_DoDB, /* DA-4 */
dszFUCOMPP, O_NoOperands, /* DA-5 */
dszRESERVED, O_DoDB, /* DA-6 */
dszRESERVED, O_DoDB }, /* DA-7 */
/* 06 03 x87-DB-1 */
{ dszFILD, O_dModrm, /* DB-0 FILD */
dszRESERVED, O_DoDB, /* DB-1 */
dszFIST, O_dModrm, /* DB-2 FIST */
dszFISTP, O_dModrm, /* DB-3 FISTP */
dszRESERVED, O_DoDB, /* DB-4 */
dszFLD, O_tModrm, /* DB-5 FLD */
dszRESERVED, O_DoDB, /* DB-6 */
dszFSTP, O_tModrm }, /* DB-7 FSTP */
/* 07 x87-DB-2 ttt=4 */
{ dszFENI, O_NoOperands, /* DB-0 FENI */
dszFDISI, O_NoOperands, /* DB-1 FDISI */
dszFNCLEX, O_NoOperands, /* DB-2 FNCLEX */
dszFNINIT, O_NoOperands, /* DB-3 FNINIT */
dszFSETPM, O_DoDB, /* DB-4 FSETPM */
dszRESERVED, O_DoDB, /* DB-5 */
dszRESERVED, O_DoDB, /* DB-6 */
dszRESERVED, O_DoDB }, /* DB-7 */
/* 08 04 x87-DC-1 */
{ dszFADD, O_qModrm, /* DC-0 FADD */
dszFMUL, O_qModrm, /* DC-1 FMUL */
dszFCOM, O_qModrm, /* DC-2 FCOM */
dszFCOMP, O_qModrm, /* DC-3 FCOMP */
dszFSUB, O_qModrm, /* DC-4 FSUB */
dszFSUBR, O_qModrm, /* DC-5 FSUBR */
dszFDIV, O_qModrm, /* DC-6 FDIV */
dszFDIVR, O_qModrm }, /* DC-7 FDIVR */
/* 09 x87-DC-2 */
{ dszFADD, O_iST_ST, /* DC-0 FADD */
dszFMUL, O_iST_ST, /* DC-1 FMUL */
dszFCOM, O_iST, /* DC-2 FCOM */
dszFCOMP, O_iST, /* DC-3 FCOMP */
dszFSUBR, O_iST_ST, /* DC-4 FSUBR */
dszFSUB, O_iST_ST, /* DC-5 FSUB */
dszFDIVR, O_iST_ST, /* DC-6 FDIVR */
dszFDIV, O_iST_ST }, /* DC-7 FDIV */
/* 10 05 x87-DD-1 */
{ dszFLD, O_qModrm, /* DD-0 FLD */
dszRESERVED, O_DoDB, /* DD-1 */
dszFST, O_qModrm, /* DD-2 FST */
dszFSTP, O_qModrm, /* DD-3 FSTP */
dszFRSTOR, O_Modrm, /* DD-4 FRSTOR */
dszRESERVED, O_DoDB, /* DD-5 */
dszFNSAVE, O_Modrm, /* DD-6 FNSAVE */
dszFNSTSW, O_Modrm }, /* DD-7 FNSTSW */
/* 11 x87-DD-2 */
{ dszFFREE, O_iST, /* DD-0 FFREE */
dszFSTP, O_iST, /* DD-1 FSTP */
dszFST, O_iST, /* DD-2 FST */
dszFSTP, O_iST, /* DD-3 FSTP */
dszFUCOM, O_iST, /* DD-4 FUCOM */
dszFUCOMP, O_iST, /* DD-5 FUCOMP */
dszRESERVED, O_DoDB, /* DD-6 */
dszRESERVED, O_DoDB }, /* DD-7 */
/* 12 06 x87-DE-1 */
{ dszFIADD, O_wModrm, /* DE-0 FIADD */
dszFIMUL, O_wModrm, /* DE-1 FIMUL */
dszFICOM, O_wModrm, /* DE-2 FICOM */
dszFICOMP, O_wModrm, /* DE-3 FICOMP */
dszFISUB, O_wModrm, /* DE-4 FISUB */
dszFISUBR, O_wModrm, /* DE-5 FISUBR */
dszFIDIV, O_wModrm, /* DE-6 FIDIV */
dszFIDIVR, O_wModrm }, /* DE-7 FIDIVR */
/* 13 x87-DE-2 */
{ dszFADDP, O_iST_ST, /* DE-0 FADDP */
dszFMULP, O_iST_ST, /* DE-1 FMULP */
dszFCOMP, O_iST, /* DE-2 FCOMP */
dszFCOMPP, O_NoOperands, /* DE-3 FCOMPP */
dszFSUBRP, O_iST_ST, /* DE-4 FSUBRP */
dszFSUBP, O_iST_ST, /* DE-5 FSUBP */
dszFDIVRP, O_iST_ST, /* DE-6 FDIVRP */
dszFDIVP, O_iST_ST}, /* DE-7 FDIVP */
/* 14 07 x87-DF-1 */
{ dszFILD, O_wModrm, /* DF-0 FILD */
dszRESERVED, O_DoDB, /* DF-1 */
dszFIST, O_wModrm, /* DF-2 FIST */
dszFISTP, O_wModrm, /* DF-3 FISTP */
dszFBLD, O_tModrm, /* DF-4 FBLD */
dszFILD, O_qModrm, /* DF-5 FILD */
dszFBSTP, O_tModrm, /* DF-6 FBSTP */
dszFISTP, O_qModrm }, /* DF-7 FISTP */
/* 15 x87-DF-2 */
{ dszFFREE, O_iST, /* DF-0 FFREE */
dszFXCH, O_iST, /* DF-1 FXCH */
dszFST, O_iST, /* DF-2 FST */
dszFSTP, O_iST, /* DF-3 FSTP */
dszFNSTSW, O_AX, /* DF-4 FNSTSW */
dszRESERVED, O_DoDB, /* DF-5 */
dszRESERVED, O_DoDB, /* DF-6 */
dszRESERVED, O_DoDB }, /* DF-7 */
/* 16 01 x87-D9 Mod=3 TTT=4 */
{ dszFCHS, O_NoOperands, /* D9-0 FCHS */
dszFABS, O_NoOperands, /* D9-1 FABS */
dszRESERVED, O_DoDB, /* D9-2 */
dszRESERVED, O_DoDB, /* D9-3 */
dszFTST, O_NoOperands, /* D9-4 FTST */
dszFXAM, O_NoOperands, /* D9-5 FXAM */
dszRESERVED, O_DoDB, /* D9-6 */
dszRESERVED, O_DoDB }, /* D9-7 */
/* 17 01 x87-D9 Mod=3 TTT=5 */
{ dszFLD1, O_NoOperands, /* D9-0 FLD1 */
dszFLDL2T, O_NoOperands, /* D9-1 FLDL2T */
dszFLDL2E, O_NoOperands, /* D9-2 FLDL2E */
dszFLDPI, O_NoOperands, /* D9-3 FLDPI */
dszFLDLG2, O_NoOperands, /* D9-4 FLDLG2 */
dszFLDLN2, O_NoOperands, /* D9-5 FLDLN2 */
dszFLDZ, O_NoOperands, /* D9-6 FLDZ */
dszRESERVED, O_DoDB }, /* D9-7 */
/* 18 01 x87-D9 Mod=3 TTT=6 */
{ dszF2XM1, O_NoOperands, /* D9-0 F2XM1 */
dszFYL2X, O_NoOperands, /* D9-1 FYL2X */
dszFPTAN, O_NoOperands, /* D9-2 FPTAN */
dszFPATAN, O_NoOperands, /* D9-3 FPATAN */
dszFXTRACT, O_NoOperands, /* D9-4 FXTRACT */
dszFPREM1, O_NoOperands, /* D9-5 FPREM1 */
dszFDECSTP, O_NoOperands, /* D9-6 FDECSTP */
dszFINCSTP, O_NoOperands }, /* D9-7 FINCSTP */
/* 19 01 x87-D9 Mod=3 TTT=7 */
{ dszFPREM, O_NoOperands, /* D9-0 FPREM */
dszFYL2XP1, O_NoOperands, /* D9-1 FYL2XP1 */
dszFSQRT, O_NoOperands, /* D9-2 FSQRT */
dszFSINCOS, O_NoOperands, /* D9-3 FSINCOS */
dszFRNDINT, O_NoOperands, /* D9-4 FRNDINT */
dszFSCALE, O_NoOperands, /* D9-5 FSCALE */
dszFSIN, O_NoOperands, /* D9-6 FSIN */
dszFCOS, O_NoOperands }, /* D9-7 FCOS */
/* 20 group 3 */
{ dszTEST, O_bModrm_Ib, /* F6-0 TEST */
dszRESERVED, O_DoDB, /* F6-1 */
dszNOT, O_bModrm, /* F6-2 NOT */
dszNEG, O_bModrm, /* F6-3 NEG */
dszMUL, O_bModrm, /* F6-4 MUL */
dszIMUL, O_bModrm, /* F6-5 IMUL */
dszDIV, O_bModrm, /* F6-6 DIV */
dszIDIV, O_bModrm }, /* F6-7 IDIV */
/* 21 group 3 */
{ dszTEST, O_vModrm_Iv, /* F7-0 TEST */
dszRESERVED, O_DoDB, /* F7-1 */
dszNOT, O_vModrm, /* F7-2 NOT */
dszNEG, O_vModrm, /* F7-3 NEG */
dszMUL, O_vModrm, /* F7-4 MUL */
dszIMUL, O_vModrm, /* F7-5 IMUL */
dszDIV, O_vModrm, /* F7-6 DIV */
dszIDIV, O_vModrm }, /* F7-7 IDIV */
/* 22 group 5 */
{ dszINC, O_vModrm, /* FF-0 INC */
dszDEC, O_vModrm, /* FF-1 DEC */
dszCALL, O_vModrm, /* FF-2 CALL */
dszCALL, O_fModrm, /* FF-3 CALL */
dszJMP, O_vModrm, /* FF-4 JMP */
dszJMP, O_fModrm, /* FF-5 JMP */
dszPUSH, O_vModrm, /* FF-6 PUSH */
dszRESERVED, O_DoDB }, /* FF-7 */
/* 23 group 7 */
{ dszSGDT, O_fw_Modrm, /* 0F-0 SGDT */
dszSIDT, O_fw_Modrm, /* 0F-1 SIDT */
dszLGDT, O_fw_Modrm, /* 0F-2 LGDT */
dszLIDT, O_fw_Modrm, /* 0F-3 LIDT */
dszSMSW, O_wModrm, /* 0F-4 MSW */
dszRESERVED, O_DoDB, /* 0F-5 */
dszLMSW, O_wModrm, /* 0F-6 LMSW */
dszINVLPG, O_bModrm } /* 0F-7 INVLPG */
};
#pragma pack ()
/*************************** end of d3.h ********************************/