/*++ Copyright (c) 1995 Microsoft Corporation Module Name: mod_rm.c Abstract: Mod/Rm/Reg decoder. Compiled multiple times to generate the following functions: mod_rm_reg8 - for 8-bit integer instructions mod_rm_reg16 - for 16-bit integer instructions mod_rm_reg32 - for 32-bit integer instructions mod_rm_regst - for floating-point instructions (mod=11 indicates rm bits specify ST(i)). mod_rm_seg16 - for 16-bit integer instructions which specify a segment register in the remaining bits. Author: 29-Jun-1995 BarryBo Revision History: --*/ // THIS FILE IS #include'd INTO FILES WHICH DEFINE THE FOLLOWING MACROS: // MOD_RM_DECODER - name of the decoder // MOD11_RM000 - the name of the thing to use when mod=11,rm=000. // MOD11_RM001 - mod=11,rm=001 // ... // MOD11_RM111 - mod=11,rm=111 // // REG000 - the name of the register to use when reg=000 // ... // REG111 - reg=111 int MOD_RM_DECODER(PDECODERSTATE State, POPERAND op1, POPERAND op2) { int cbInstr; OPERAND ScratchOperand; if (op2 == NULL) { // If caller doesn't care about operand #2, then store the results // to a scratch structure. op2 = &ScratchOperand; } op2->Type = OPND_REGREF; if (State->AdrPrefix) { // ADR: prefix specified. // mm aaa rrr // | | | // | | +--- 'rm' bits from mod/rm // | +------- reg bits // +---------- 'mod' bits from mod/rm switch (*(PBYTE)(eipTemp+1)) { case 0x00: // mod/rm = 00 000, reg=000 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op2->Reg = REG000; break; case 0x01: // mod/rm = 00 001, reg=000 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op2->Reg = REG000; break; case 0x02: // mod/rm = 00 010, reg=000 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op2->Reg = REG000; break; case 0x03: // mod/rm = 00 011, reg=000 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op2->Reg = REG000; break; case 0x04: // mod/rm = 00 100, reg=000 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op2->Reg = REG000; break; case 0x05: // mod/rm = 00 101, reg=000 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op2->Reg = REG000; break; case 0x06: // mod/rm = 00 110, reg=000 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG000; break; case 0x07: // mod/rm = 00 111, reg=000 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op2->Reg = REG000; break; case 0x08: // mod/rm = 00 000, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op2->Reg = REG001; break; case 0x09: // mod/rm = 00 001, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op2->Reg = REG001; break; case 0x0a: // mod/rm = 00 010, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op2->IndexReg = GP_SI; op2->Reg = REG001; break; case 0x0b: // mod/rm = 00 011, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op2->IndexReg = GP_DI; op2->Reg = REG001; break; case 0x0c: // mod/rm = 00 100, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op2->Reg = REG001; break; case 0x0d: // mod/rm = 00 101, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op2->Reg = REG001; break; case 0x0e: // mod/rm = 00 110, reg=001 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG001; break; case 0x0f: // mod/rm = 00 111, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op2->Reg = REG001; break; case 0x10: // mod/rm = 00 000, reg=010 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op2->Reg = REG010; break; case 0x11: // mod/rm = 00 001, reg=010 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op2->Reg = REG010; break; case 0x12: // mod/rm = 00 010, reg=010 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op2->Reg = REG010; break; case 0x13: // mod/rm = 00 011, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op2->Reg = REG010; break; case 0x14: // mod/rm = 00 100, reg=010 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op2->Reg = REG010; break; case 0x15: // mod/rm = 00 101, reg=010 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op2->Reg = REG010; break; case 0x16: // mod/rm = 00 110, reg=010 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG010; break; case 0x17: // mod/rm = 00 111, reg=010 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op2->Reg = REG010; break; case 0x18: // mod/rm = 00 000, reg=011 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op2->Reg = REG011; break; case 0x19: // mod/rm = 00 001, reg=011 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Reg = GP_DI; op2->Reg = REG011; break; case 0x1a: // mod/rm = 00 010, reg=011 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op2->Reg = REG011; break; case 0x1b: // mod/rm = 00 011, reg=011 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op2->Reg = REG011; break; case 0x1c: // mod/rm = 00 100, reg=011 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op2->Reg = REG011; break; case 0x1d: // mod/rm = 00 101, reg=011 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op2->Reg = REG011; break; case 0x1e: // mod/rm = 00 110, reg=011 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG011; break; case 0x1f: // mod/rm = 00 111, reg=011 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op2->Reg = REG011; break; case 0x20: // mod/rm = 00 000, reg=100 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op2->Reg = REG100; break; case 0x21: // mod/rm = 00 001, reg=100 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op2->Reg = REG100; break; case 0x22: // mod/rm = 00 010, reg=100 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op2->Reg = REG100; break; case 0x23: // mod/rm = 00 011, reg=100 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op2->Reg = REG100; break; case 0x24: // mod/rm = 00 100, reg=100 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op2->Reg = REG100; break; case 0x25: // mod/rm = 00 101, reg=100 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op2->Reg = REG100; break; case 0x26: // mod/rm = 00 110, reg=100 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG100; break; case 0x27: // mod/rm = 00 111, reg=100 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op2->Reg = REG100; break; case 0x28: // mod/rm = 00 000, reg=101 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op2->Reg = REG101; break; case 0x29: // mod/rm = 00 001, reg=101 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op2->Reg = REG101; break; case 0x2a: // mod/rm = 00 010, reg=101 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op2->Reg = REG101; break; case 0x2b: // mod/rm = 00 011, reg=101 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op2->Reg = REG101; break; case 0x2c: // mod/rm = 00 100, reg=101 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op2->Reg = REG101; break; case 0x2d: // mod/rm = 00 101, reg=101 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op2->Reg = REG101; break; case 0x2e: // mod/rm = 00 110, reg=101 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG101; break; case 0x2f: // mod/rm = 00 111, reg=101 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op2->Reg = REG101; break; case 0x30: // mod/rm = 00 000, reg=110 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op2->Reg = REG110; break; case 0x31: // mod/rm = 00 001, reg=110 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op2->Reg = REG110; break; case 0x32: // mod/rm = 00 010, reg=110 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op2->Reg = REG110; break; case 0x33: // mod/rm = 00 011, reg=110 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op2->Reg = REG110; break; case 0x34: // mod/rm = 00 100, reg=110 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op2->Reg = REG110; break; case 0x35: // mod/rm = 00 101, reg=110 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op2->Reg = REG110; break; case 0x36: // mod/rm = 00 110, reg=110 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG110; break; case 0x37: // mod/rm = 00 111, reg=110 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op2->Reg = REG110; break; case 0x38: // mod/rm = 00 000, reg=111 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op2->Reg = REG111; break; case 0x39: // mod/rm = 00 001, reg=111 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op2->Reg = REG111; break; case 0x3a: // mod/rm = 00 010, reg=111 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op2->Reg = REG111; break; case 0x3b: // mod/rm = 00 011, reg=111 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op2->Reg = REG111; break; case 0x3c: // mod/rm = 00 100, reg=111 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op2->Reg = REG111; break; case 0x3d: // mod/rm = 00 101, reg=111 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op2->Reg = REG111; break; case 0x3e: // mod/rm = 00 110, reg=111 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG111; break; case 0x3f: // mod/rm = 00 111, reg=111 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op2->Reg = REG111; break; ///////////////////////////////////////////////////////////////////// case 0x40: // mod/rm = 01 000, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x41: // mod/rm = 01 001, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x42: // mod/rm = 01 010, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x43: // mod/rm = 01 011, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x44: // mod/rm = 01 100, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x45: // mod/rm = 01 101, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x46: // mod/rm = 01 110, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x47: // mod/rm = 01 111, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x48: // mod/rm = 01 000, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x49: // mod/rm = 01 001, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x4a: // mod/rm = 01 010, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x4b: // mod/rm = 01 011, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x4c: // mod/rm = 01 100, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x4d: // mod/rm = 01 101, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x4e: // mod/rm = 01 110, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x4f: // mod/rm = 01 111, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x50: // mod/rm = 01 000, reg=010 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x51: // mod/rm = 01 001, reg=010 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x52: // mod/rm = 01 010, reg=010 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x53: // mod/rm = 01 011, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x54: // mod/rm = 01 100, reg=010 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x55: // mod/rm = 01 101, reg=010 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x56: // mod/rm = 01 110, reg=010 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x57: // mod/rm = 01 111, reg=010 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x58: // mod/rm = 01 000, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x59: // mod/rm = 01 001, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x5a: // mod/rm = 01 010, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x5b: // mod/rm = 01 011, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x5c: // mod/rm = 01 100, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x5d: // mod/rm = 01 101, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x5e: // mod/rm = 01 110, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x5f: // mod/rm = 01 111, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x60: // mod/rm = 01 000, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x61: // mod/rm = 01 001, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x62: // mod/rm = 01 010, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x63: // mod/rm = 01 011, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x64: // mod/rm = 01 100, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x65: // mod/rm = 01 101, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x66: // mod/rm = 01 110, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x67: // mod/rm = 01 111, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x68: // mod/rm = 01 000, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x69: // mod/rm = 01 001, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x6a: // mod/rm = 01 010, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x6b: // mod/rm = 01 011, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x6c: // mod/rm = 01 100, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x6d: // mod/rm = 01 101, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x6e: // mod/rm = 01 110, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x6f: // mod/rm = 01 111, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x70: // mod/rm = 01 000, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x71: // mod/rm = 01 001, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x72: // mod/rm = 01 010, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x73: // mod/rm = 01 011, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x74: // mod/rm = 01 100, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x75: // mod/rm = 01 101, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x76: // mod/rm = 01 110, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x77: // mod/rm = 01 111, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x78: // mod/rm = 01 000, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; case 0x79: // mod/rm = 01 001, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; case 0x7a: // mod/rm = 01 010, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; case 0x7b: // mod/rm = 01 011, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; case 0x7c: // mod/rm = 01 100, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; case 0x7d: // mod/rm = 01 101, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; case 0x7e: // mod/rm = 01 110, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; case 0x7f: // mod/rm = 01 111, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; ///////////////////////////////////////////////////////////////////// case 0x80: // mod/rm = 10 000, reg=000 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG000; break; case 0x81: // mod/rm = 10 001, reg=000 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG000; break; case 0x82: // mod/rm = 10 010, reg=000 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG000; break; case 0x83: // mod/rm = 10 011, reg=000 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG000; break; case 0x84: // mod/rm = 10 100, reg=000 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG000; break; case 0x85: // mod/rm = 10 101, reg=000 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG000; break; case 0x86: // mod/rm = 10 110, reg=000 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG000; break; case 0x87: // mod/rm = 10 111, reg=000 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG000; break; case 0x88: // mod/rm = 10 000, reg=001 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG001; break; case 0x89: // mod/rm = 10 001, reg=001 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG001; break; case 0x8a: // mod/rm = 10 010, reg=001 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG001; break; case 0x8b: // mod/rm = 10 011, reg=001 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG001; break; case 0x8c: // mod/rm = 10 100, reg=001 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG001; break; case 0x8d: // mod/rm = 10 101, reg=001 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG001; break; case 0x8e: // mod/rm = 10 110, reg=001 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG001; break; case 0x8f: // mod/rm = 10 111, reg=001 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG001; break; case 0x90: // mod/rm = 10 000, reg=010 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG010; break; case 0x91: // mod/rm = 10 001, reg=010 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG010; break; case 0x92: // mod/rm = 10 010, reg=010 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG010; break; case 0x93: // mod/rm = 10 011, reg=010 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG010; break; case 0x94: // mod/rm = 10 100, reg=010 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG010; break; case 0x95: // mod/rm = 10 101, reg=010 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG010; break; case 0x96: // mod/rm = 10 110, reg=010 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG010; break; case 0x97: // mod/rm = 10 111, reg=010 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG010; break; case 0x98: // mod/rm = 10 000, reg=011 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG011; break; case 0x99: // mod/rm = 10 001, reg=011 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG011; break; case 0x9a: // mod/rm = 10 010, reg=011 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG011; break; case 0x9b: // mod/rm = 10 011, reg=011 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG011; break; case 0x9c: // mod/rm = 10 100, reg=011 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG011; break; case 0x9d: // mod/rm = 10 101, reg=011 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG011; break; case 0x9e: // mod/rm = 10 110, reg=011 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG011; break; case 0x9f: // mod/rm = 10 111, reg=011 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG011; break; case 0xa0: // mod/rm = 10 000, reg=100 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG100; break; case 0xa1: // mod/rm = 10 001, reg=100 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG100; break; case 0xa2: // mod/rm = 10 010, reg=100 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG100; break; case 0xa3: // mod/rm = 10 011, reg=100 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG100; break; case 0xa4: // mod/rm = 10 100, reg=100 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG100; break; case 0xa5: // mod/rm = 10 101, reg=100 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG100; break; case 0xa6: // mod/rm = 10 110, reg=100 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG100; break; case 0xa7: // mod/rm = 10 111, reg=100 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG100; break; case 0xa8: // mod/rm = 10 000, reg=101 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG101; break; case 0xa9: // mod/rm = 10 001, reg=101 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG101; break; case 0xaa: // mod/rm = 10 010, reg=101 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG101; break; case 0xab: // mod/rm = 10 011, reg=101 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG101; break; case 0xac: // mod/rm = 10 100, reg=101 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG101; break; case 0xad: // mod/rm = 10 101, reg=101 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG101; break; case 0xae: // mod/rm = 10 110, reg=101 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG101; break; case 0xaf: // mod/rm = 10 111, reg=101 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG101; break; case 0xb0: // mod/rm = 10 000, reg=110 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG110; break; case 0xb1: // mod/rm = 10 001, reg=110 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG110; break; case 0xb2: // mod/rm = 10 010, reg=110 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG110; break; case 0xb3: // mod/rm = 10 011, reg=110 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG110; break; case 0xb4: // mod/rm = 10 100, reg=110 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG110; break; case 0xb5: // mod/rm = 10 101, reg=110 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG110; break; case 0xb6: // mod/rm = 10 110, reg=110 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG110; break; case 0xb7: // mod/rm = 10 111, reg=110 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG110; break; case 0xb8: // mod/rm = 10 000, reg=111 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG111; break; case 0xb9: // mod/rm = 10 001, reg=111 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG111; break; case 0xba: // mod/rm = 10 010, reg=111 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG111; break; case 0xbb: // mod/rm = 10 011, reg=111 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->IndexReg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG111; break; case 0xbc: // mod/rm = 10 100, reg=111 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_SI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG111; break; case 0xbd: // mod/rm = 10 101, reg=111 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_DI; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG111; break; case 0xbe: // mod/rm = 10 110, reg=111 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BP; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG111; break; case 0xbf: // mod/rm = 10 111, reg=111 cbInstr = 3; op1->Type = OPND_ADDRREF; op1->Reg = GP_BX; op1->Immed = GET_SHORT(eipTemp+2); op2->Reg = REG111; break; ///////////////////////////////////////////////////////////////////// case 0xc0: // mod/rm = 11 000, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG000; break; case 0xc1: // mod/rm = 11 001, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG000; break; case 0xc2: // mod/rm = 11 010, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG000; break; case 0xc3: // mod/rm = 11 011, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG000; break; case 0xc4: // mod/rm = 11 100, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG000; break; case 0xc5: // mod/rm = 11 101, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG000; break; case 0xc6: // mod/rm = 11 110, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG000; break; case 0xc7: // mod/rm = 11 111, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG000; break; case 0xc8: // mod/rm = 11 000, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG001; break; case 0xc9: // mod/rm = 11 001, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG001; break; case 0xca: // mod/rm = 11 010, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG001; break; case 0xcb: // mod/rm = 11 011, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG001; break; case 0xcc: // mod/rm = 11 100, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG001; break; case 0xcd: // mod/rm = 11 101, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG001; break; case 0xce: // mod/rm = 11 110, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG001; break; case 0xcf: // mod/rm = 11 111, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG001; break; case 0xd0: // mod/rm = 11 000, reg=010 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG010; break; case 0xd1: // mod/rm = 11 001, reg=010 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG010; break; case 0xd2: // mod/rm = 11 010, reg=010 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG010; break; case 0xd3: // mod/rm = 11 011, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG010; break; case 0xd4: // mod/rm = 11 100, reg=010 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG010; break; case 0xd5: // mod/rm = 11 101, reg=010 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG010; break; case 0xd6: // mod/rm = 11 110, reg=010 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG010; break; case 0xd7: // mod/rm = 11 111, reg=010 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG010; break; case 0xd8: // mod/rm = 11 000, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG011; break; case 0xd9: // mod/rm = 11 001, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG011; break; case 0xda: // mod/rm = 11 010, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG011; break; case 0xdb: // mod/rm = 11 011, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG011; break; case 0xdc: // mod/rm = 11 100, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG011; break; case 0xdd: // mod/rm = 11 101, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG011; break; case 0xde: // mod/rm = 11 110, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG011; break; case 0xdf: // mod/rm = 11 111, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG011; break; case 0xe0: // mod/rm = 11 000, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG100; break; case 0xe1: // mod/rm = 11 001, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG100; break; case 0xe2: // mod/rm = 11 010, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG100; break; case 0xe3: // mod/rm = 11 011, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG100; break; case 0xe4: // mod/rm = 11 100, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG100; break; case 0xe5: // mod/rm = 11 101, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG100; break; case 0xe6: // mod/rm = 11 110, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG100; break; case 0xe7: // mod/rm = 11 111, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG100; break; case 0xe8: // mod/rm = 11 000, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG101; break; case 0xe9: // mod/rm = 11 001, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG101; break; case 0xea: // mod/rm = 11 010, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG101; break; case 0xeb: // mod/rm = 11 011, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG101; break; case 0xec: // mod/rm = 11 100, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG101; break; case 0xed: // mod/rm = 11 101, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG101; break; case 0xee: // mod/rm = 11 110, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG101; break; case 0xef: // mod/rm = 11 111, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG101; break; case 0xf0: // mod/rm = 11 000, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG110; break; case 0xf1: // mod/rm = 11 001, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG110; break; case 0xf2: // mod/rm = 11 010, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG110; break; case 0xf3: // mod/rm = 11 011, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG110; break; case 0xf4: // mod/rm = 11 100, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG110; break; case 0xf5: // mod/rm = 11 101, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG110; break; case 0xf6: // mod/rm = 11 110, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG110; break; case 0xf7: // mod/rm = 11 111, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG110; break; case 0xf8: // mod/rm = 11 000, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG111; break; case 0xf9: // mod/rm = 11 001, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG111; break; case 0xfa: // mod/rm = 11 010, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG111; break; case 0xfb: // mod/rm = 11 011, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG111; break; case 0xfc: // mod/rm = 11 100, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG111; break; case 0xfd: // mod/rm = 11 101, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG111; break; case 0xfe: // mod/rm = 11 110, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG111; break; default: case 0xff: // mod/rm = 11 111, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG111; break; } #if DBG State->AdrPrefix = FALSE; #endif return cbInstr; } // else no ADR: prefix found... // mm aaa rrr // | | | // | | +--- 'rm' bits from mod/rm // | +------- reg bits // +---------- 'mod' bits from mod/rm switch (*(PBYTE)(eipTemp+1)) { case 0x00: // mod/rm = 00 000, reg=000 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op2->Reg = REG000; break; case 0x01: // mod/rm = 00 001, reg=000 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op2->Reg = REG000; break; case 0x02: // mod/rm = 00 010, reg=000 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op2->Reg = REG000; break; case 0x03: // mod/rm = 00 011, reg=000 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op2->Reg = REG000; break; case 0x04: // mod/rm = 00 100, reg=000 // s-i-b present cbInstr = 1 + scaled_index((BYTE *)(eipTemp+1), op1); op2->Reg = REG000; break; case 0x05: // mod/rm = 00 101, reg=000 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG000; break; case 0x06: // mod/rm = 00 110, reg=000 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op2->Reg = REG000; break; case 0x07: // mod/rm = 00 111, reg=000 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op2->Reg = REG000; break; case 0x08: // mod/rm = 00 000, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op2->Reg = REG001; break; case 0x09: // mod/rm = 00 001, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op2->Reg = REG001; break; case 0x0a: // mod/rm = 00 010, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op2->Reg = REG001; break; case 0x0b: // mod/rm = 00 011, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op2->Reg = REG001; break; case 0x0c: // mod/rm = 00 100, reg=001 // s-i-b present cbInstr = 1 + scaled_index((BYTE *)(eipTemp+1), op1); op2->Reg = REG001; break; case 0x0d: // mod/rm = 00 101, reg=001 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG001; break; case 0x0e: // mod/rm = 00 110, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op2->Reg = REG001; break; case 0x0f: // mod/rm = 00 111, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op2->Reg = REG001; break; case 0x10: // mod/rm = 00 000, reg=010 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op2->Reg = REG010; break; case 0x11: // mod/rm = 00 001, reg=010 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op2->Reg = REG010; break; case 0x12: // mod/rm = 00 010, reg=010 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op2->Reg = REG010; break; case 0x13: // mod/rm = 00 011, reg=001 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op2->Reg = REG010; break; case 0x14: // mod/rm = 00 100, reg=010 // s-i-b present cbInstr = 1 + scaled_index((BYTE *)(eipTemp+1), op1); op2->Reg = REG010; break; case 0x15: // mod/rm = 00 101, reg=010 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG010; break; case 0x16: // mod/rm = 00 110, reg=010 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op2->Reg = REG010; break; case 0x17: // mod/rm = 00 111, reg=010 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op2->Reg = REG010; break; case 0x18: // mod/rm = 00 000, reg=011 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op2->Reg = REG011; break; case 0x19: // mod/rm = 00 001, reg=011 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op2->Reg = REG011; break; case 0x1a: // mod/rm = 00 010, reg=011 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op2->Reg = REG011; break; case 0x1b: // mod/rm = 00 011, reg=011 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op2->Reg = REG011; break; case 0x1c: // mod/rm = 00 100, reg=011 // s-i-b present cbInstr = 1 + scaled_index((BYTE *)(eipTemp+1), op1); op2->Reg = REG011; break; case 0x1d: // mod/rm = 00 101, reg=011 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG011; break; case 0x1e: // mod/rm = 00 110, reg=011 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op2->Reg = REG011; break; case 0x1f: // mod/rm = 00 111, reg=011 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op2->Reg = REG011; break; case 0x20: // mod/rm = 00 000, reg=100 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op2->Reg = REG100; break; case 0x21: // mod/rm = 00 001, reg=100 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op2->Reg = REG100; break; case 0x22: // mod/rm = 00 010, reg=100 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op2->Reg = REG100; break; case 0x23: // mod/rm = 00 011, reg=100 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op2->Reg = REG100; break; case 0x24: // mod/rm = 00 100, reg=100 // s-i-b present cbInstr = 1 + scaled_index((BYTE *)(eipTemp+1), op1); op2->Reg = REG100; break; case 0x25: // mod/rm = 00 101, reg=100 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG100; break; case 0x26: // mod/rm = 00 110, reg=100 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op2->Reg = REG100; break; case 0x27: // mod/rm = 00 111, reg=100 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op2->Reg = REG100; break; case 0x28: // mod/rm = 00 000, reg=101 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op2->Reg = REG101; break; case 0x29: // mod/rm = 00 001, reg=101 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op2->Reg = REG101; break; case 0x2a: // mod/rm = 00 010, reg=101 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op2->Reg = REG101; break; case 0x2b: // mod/rm = 00 011, reg=101 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op2->Reg = REG101; break; case 0x2c: // mod/rm = 00 100, reg=101 // s-i-b present cbInstr = 1 + scaled_index((BYTE *)(eipTemp+1), op1); op2->Reg = REG101; break; case 0x2d: // mod/rm = 00 101, reg=101 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG101; break; case 0x2e: // mod/rm = 00 110, reg=101 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op2->Reg = REG101; break; case 0x2f: // mod/rm = 00 111, reg=101 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op2->Reg = REG101; break; case 0x30: // mod/rm = 00 000, reg=110 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op2->Reg = REG110; break; case 0x31: // mod/rm = 00 001, reg=110 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op2->Reg = REG110; break; case 0x32: // mod/rm = 00 010, reg=110 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op2->Reg = REG110; break; case 0x33: // mod/rm = 00 011, reg=110 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op2->Reg = REG110; break; case 0x34: // mod/rm = 00 100, reg=110 // s-i-b present cbInstr = 1 + scaled_index((BYTE *)(eipTemp+1), op1); op2->Reg = REG110; break; case 0x35: // mod/rm = 00 101, reg=110 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG110; break; case 0x36: // mod/rm = 00 110, reg=110 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op2->Reg = REG110; break; case 0x37: // mod/rm = 00 111, reg=110 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op2->Reg = REG110; break; case 0x38: // mod/rm = 00 000, reg=111 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op2->Reg = REG111; break; case 0x39: // mod/rm = 00 001, reg=111 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op2->Reg = REG111; break; case 0x3a: // mod/rm = 00 010, reg=111 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op2->Reg = REG111; break; case 0x3b: // mod/rm = 00 011, reg=111 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op2->Reg = REG111; break; case 0x3c: // mod/rm = 00 100, reg=111 // s-i-b present cbInstr = 1 + scaled_index((BYTE *)(eipTemp+1), op1); op2->Reg = REG111; break; case 0x3d: // mod/rm = 00 101, reg=111 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG111; break; case 0x3e: // mod/rm = 00 110, reg=111 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op2->Reg = REG111; break; case 0x3f: // mod/rm = 00 111, reg=111 cbInstr = 1; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op2->Reg = REG111; break; ///////////////////////////////////////////////////////////////////// case 0x40: // mod/rm = 01 000, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x41: // mod/rm = 01 001, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x42: // mod/rm = 01 010, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x43: // mod/rm = 01 011, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x44: // mod/rm = 01 100, reg=000 // s-i-b present cbInstr = 2 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = (DWORD)(long)*(char *)(eipTemp+cbInstr); op2->Reg = REG000; break; case 0x45: // mod/rm = 01 101, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x46: // mod/rm = 01 110, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x47: // mod/rm = 01 111, reg=000 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG000; break; case 0x48: // mod/rm = 01 000, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x49: // mod/rm = 01 001, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x4a: // mod/rm = 01 010, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x4b: // mod/rm = 01 011, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x4c: // mod/rm = 01 100, reg=001 // s-i-b present cbInstr = 2 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = (DWORD)(long)*(char *)(eipTemp+cbInstr); op2->Reg = REG001; break; case 0x4d: // mod/rm = 01 101, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x4e: // mod/rm = 01 110, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x4f: // mod/rm = 01 111, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG001; break; case 0x50: // mod/rm = 01 000, reg=010 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x51: // mod/rm = 01 001, reg=010 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x52: // mod/rm = 01 010, reg=010 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x53: // mod/rm = 01 011, reg=001 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x54: // mod/rm = 01 100, reg=010 // s-i-b present cbInstr = 2 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = (DWORD)(long)*(char *)(eipTemp+cbInstr); op2->Reg = REG010; break; case 0x55: // mod/rm = 01 101, reg=010 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x56: // mod/rm = 01 110, reg=010 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x57: // mod/rm = 01 111, reg=010 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG010; break; case 0x58: // mod/rm = 01 000, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x59: // mod/rm = 01 001, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x5a: // mod/rm = 01 010, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x5b: // mod/rm = 01 011, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x5c: // mod/rm = 01 100, reg=011 // s-i-b present cbInstr = 2 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = (DWORD)(long)*(char *)(eipTemp+cbInstr); op2->Reg = REG011; break; case 0x5d: // mod/rm = 01 101, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x5e: // mod/rm = 01 110, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x5f: // mod/rm = 01 111, reg=011 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG011; break; case 0x60: // mod/rm = 01 000, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x61: // mod/rm = 01 001, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x62: // mod/rm = 01 010, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x63: // mod/rm = 01 011, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x64: // mod/rm = 01 100, reg=100 // s-i-b present cbInstr = 2 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = (DWORD)(long)*(char *)(eipTemp+cbInstr); op2->Reg = REG100; break; case 0x65: // mod/rm = 01 101, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x66: // mod/rm = 01 110, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x67: // mod/rm = 01 111, reg=100 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG100; break; case 0x68: // mod/rm = 01 000, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x69: // mod/rm = 01 001, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x6a: // mod/rm = 01 010, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x6b: // mod/rm = 01 011, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x6c: // mod/rm = 01 100, reg=101 // s-i-b present cbInstr = 2 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = (DWORD)(long)*(char *)(eipTemp+cbInstr); op2->Reg = REG101; break; case 0x6d: // mod/rm = 01 101, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x6e: // mod/rm = 01 110, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x6f: // mod/rm = 01 111, reg=101 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG101; break; case 0x70: // mod/rm = 01 000, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x71: // mod/rm = 01 001, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x72: // mod/rm = 01 010, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x73: // mod/rm = 01 011, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x74: // mod/rm = 01 100, reg=110 // s-i-b present cbInstr = 2 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = (DWORD)(long)*(char *)(eipTemp+cbInstr); op2->Reg = REG110; break; case 0x75: // mod/rm = 01 101, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x76: // mod/rm = 01 110, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x77: // mod/rm = 01 111, reg=110 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG110; break; case 0x78: // mod/rm = 01 000, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; case 0x79: // mod/rm = 01 001, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; case 0x7a: // mod/rm = 01 010, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; case 0x7b: // mod/rm = 01 011, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; case 0x7c: // mod/rm = 01 100, reg=111 // s-i-b present cbInstr = 2 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = (DWORD)(long)*(char *)(eipTemp+cbInstr); op2->Reg = REG111; break; case 0x7d: // mod/rm = 01 101, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; case 0x7e: // mod/rm = 01 110, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; case 0x7f: // mod/rm = 01 111, reg=111 cbInstr = 2; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = (DWORD)(long)*(char *)(eipTemp+2); op2->Reg = REG111; break; ///////////////////////////////////////////////////////////////////// case 0x80: // mod/rm = 10 000, reg=000 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG000; break; case 0x81: // mod/rm = 10 001, reg=000 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG000; break; case 0x82: // mod/rm = 10 010, reg=000 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG000; break; case 0x83: // mod/rm = 10 011, reg=000 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG000; break; case 0x84: // mod/rm = 10 100, reg=000 // s-i-b present cbInstr = 5 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = GET_LONG(eipTemp+cbInstr-3); op2->Reg = REG000; break; case 0x85: // mod/rm = 10 101, reg=000 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG000; break; case 0x86: // mod/rm = 10 110, reg=000 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG000; break; case 0x87: // mod/rm = 10 111, reg=000 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG000; break; case 0x88: // mod/rm = 10 000, reg=001 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG001; break; case 0x89: // mod/rm = 10 001, reg=001 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG001; break; case 0x8a: // mod/rm = 10 010, reg=001 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG001; break; case 0x8b: // mod/rm = 10 011, reg=001 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG001; break; case 0x8c: // mod/rm = 10 100, reg=001 // s-i-b present cbInstr = 5 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = GET_LONG(eipTemp+cbInstr-3); op2->Reg = REG001; break; case 0x8d: // mod/rm = 10 101, reg=001 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG001; break; case 0x8e: // mod/rm = 10 110, reg=001 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG001; break; case 0x8f: // mod/rm = 10 111, reg=001 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG001; break; case 0x90: // mod/rm = 10 000, reg=010 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG010; break; case 0x91: // mod/rm = 10 001, reg=010 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG010; break; case 0x92: // mod/rm = 10 010, reg=010 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG010; break; case 0x93: // mod/rm = 10 011, reg=010 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG010; break; case 0x94: // mod/rm = 10 100, reg=010 // s-i-b present cbInstr = 5 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = GET_LONG(eipTemp+cbInstr-3); op2->Reg = REG010; break; case 0x95: // mod/rm = 10 101, reg=010 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG010; break; case 0x96: // mod/rm = 10 110, reg=010 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG010; break; case 0x97: // mod/rm = 10 111, reg=010 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG010; break; case 0x98: // mod/rm = 10 000, reg=011 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG011; break; case 0x99: // mod/rm = 10 001, reg=011 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG011; break; case 0x9a: // mod/rm = 10 010, reg=011 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG011; break; case 0x9b: // mod/rm = 10 011, reg=011 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG011; break; case 0x9c: // mod/rm = 10 100, reg=011 // s-i-b present cbInstr = 5 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = GET_LONG(eipTemp+cbInstr-3); op2->Reg = REG011; break; case 0x9d: // mod/rm = 10 101, reg=011 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG011; break; case 0x9e: // mod/rm = 10 110, reg=011 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG011; break; case 0x9f: // mod/rm = 10 111, reg=011 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG011; break; case 0xa0: // mod/rm = 10 000, reg=100 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG100; break; case 0xa1: // mod/rm = 10 001, reg=100 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG100; break; case 0xa2: // mod/rm = 10 010, reg=100 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG100; break; case 0xa3: // mod/rm = 10 011, reg=100 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG100; break; case 0xa4: // mod/rm = 10 100, reg=100 // s-i-b present cbInstr = 5 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = GET_LONG(eipTemp+cbInstr-3); op2->Reg = REG100; break; case 0xa5: // mod/rm = 10 101, reg=100 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG100; break; case 0xa6: // mod/rm = 10 110, reg=100 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG100; break; case 0xa7: // mod/rm = 10 111, reg=100 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG100; break; case 0xa8: // mod/rm = 10 000, reg=101 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG101; break; case 0xa9: // mod/rm = 10 001, reg=101 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG101; break; case 0xaa: // mod/rm = 10 010, reg=101 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG101; break; case 0xab: // mod/rm = 10 011, reg=101 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG101; break; case 0xac: // mod/rm = 10 100, reg=101 // s-i-b present cbInstr = 5 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = GET_LONG(eipTemp+cbInstr-3); op2->Reg = REG101; break; case 0xad: // mod/rm = 10 101, reg=101 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG101; break; case 0xae: // mod/rm = 10 110, reg=101 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG101; break; case 0xaf: // mod/rm = 10 111, reg=101 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG101; break; case 0xb0: // mod/rm = 10 000, reg=110 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG110; break; case 0xb1: // mod/rm = 10 001, reg=110 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG110; break; case 0xb2: // mod/rm = 10 010, reg=110 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG110; break; case 0xb3: // mod/rm = 10 011, reg=110 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG110; break; case 0xb4: // mod/rm = 10 100, reg=110 // s-i-b present cbInstr = 5 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = GET_LONG(eipTemp+cbInstr-3); op2->Reg = REG110; break; case 0xb5: // mod/rm = 10 101, reg=110 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG110; break; case 0xb6: // mod/rm = 10 110, reg=110 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG110; break; case 0xb7: // mod/rm = 10 111, reg=110 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG110; break; case 0xb8: // mod/rm = 10 000, reg=111 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EAX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG111; break; case 0xb9: // mod/rm = 10 001, reg=111 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ECX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG111; break; case 0xba: // mod/rm = 10 010, reg=111 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG111; break; case 0xbb: // mod/rm = 10 011, reg=111 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBX; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG111; break; case 0xbc: // mod/rm = 10 100, reg=111 // s-i-b present cbInstr = 5 + scaled_index((BYTE *)(eipTemp+1), op1); op1->Immed = GET_LONG(eipTemp+cbInstr-3); op2->Reg = REG111; break; case 0xbd: // mod/rm = 10 101, reg=111 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EBP; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG111; break; case 0xbe: // mod/rm = 10 110, reg=111 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_ESI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG111; break; case 0xbf: // mod/rm = 10 111, reg=111 cbInstr = 5; op1->Type = OPND_ADDRREF; op1->Reg = GP_EDI; op1->Immed = GET_LONG(eipTemp+2); op2->Reg = REG111; break; ///////////////////////////////////////////////////////////////////// case 0xc0: // mod/rm = 11 000, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG000; break; case 0xc1: // mod/rm = 11 001, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG000; break; case 0xc2: // mod/rm = 11 010, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG000; break; case 0xc3: // mod/rm = 11 011, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG000; break; case 0xc4: // mod/rm = 11 100, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG000; break; case 0xc5: // mod/rm = 11 101, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG000; break; case 0xc6: // mod/rm = 11 110, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG000; break; case 0xc7: // mod/rm = 11 111, reg=000 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG000; break; case 0xc8: // mod/rm = 11 000, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG001; break; case 0xc9: // mod/rm = 11 001, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG001; break; case 0xca: // mod/rm = 11 010, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG001; break; case 0xcb: // mod/rm = 11 011, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG001; break; case 0xcc: // mod/rm = 11 100, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG001; break; case 0xcd: // mod/rm = 11 101, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG001; break; case 0xce: // mod/rm = 11 110, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG001; break; case 0xcf: // mod/rm = 11 111, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG001; break; case 0xd0: // mod/rm = 11 000, reg=010 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG010; break; case 0xd1: // mod/rm = 11 001, reg=010 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG010; break; case 0xd2: // mod/rm = 11 010, reg=010 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG010; break; case 0xd3: // mod/rm = 11 011, reg=001 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG010; break; case 0xd4: // mod/rm = 11 100, reg=010 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG010; break; case 0xd5: // mod/rm = 11 101, reg=010 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG010; break; case 0xd6: // mod/rm = 11 110, reg=010 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG010; break; case 0xd7: // mod/rm = 11 111, reg=010 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG010; break; case 0xd8: // mod/rm = 11 000, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG011; break; case 0xd9: // mod/rm = 11 001, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG011; break; case 0xda: // mod/rm = 11 010, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG011; break; case 0xdb: // mod/rm = 11 011, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG011; break; case 0xdc: // mod/rm = 11 100, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG011; break; case 0xdd: // mod/rm = 11 101, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG011; break; case 0xde: // mod/rm = 11 110, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG011; break; case 0xdf: // mod/rm = 11 111, reg=011 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG011; break; case 0xe0: // mod/rm = 11 000, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG100; break; case 0xe1: // mod/rm = 11 001, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG100; break; case 0xe2: // mod/rm = 11 010, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG100; break; case 0xe3: // mod/rm = 11 011, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG100; break; case 0xe4: // mod/rm = 11 100, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG100; break; case 0xe5: // mod/rm = 11 101, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG100; break; case 0xe6: // mod/rm = 11 110, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG100; break; case 0xe7: // mod/rm = 11 111, reg=100 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG100; break; case 0xe8: // mod/rm = 11 000, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG101; break; case 0xe9: // mod/rm = 11 001, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG101; break; case 0xea: // mod/rm = 11 010, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG101; break; case 0xeb: // mod/rm = 11 011, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG101; break; case 0xec: // mod/rm = 11 100, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG101; break; case 0xed: // mod/rm = 11 101, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG101; break; case 0xee: // mod/rm = 11 110, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG101; break; case 0xef: // mod/rm = 11 111, reg=101 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG101; break; case 0xf0: // mod/rm = 11 000, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG110; break; case 0xf1: // mod/rm = 11 001, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG110; break; case 0xf2: // mod/rm = 11 010, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG110; break; case 0xf3: // mod/rm = 11 011, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG110; break; case 0xf4: // mod/rm = 11 100, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG110; break; case 0xf5: // mod/rm = 11 101, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG110; break; case 0xf6: // mod/rm = 11 110, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG110; break; case 0xf7: // mod/rm = 11 111, reg=110 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG110; break; case 0xf8: // mod/rm = 11 000, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM000; op2->Reg = REG111; break; case 0xf9: // mod/rm = 11 001, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM001; op2->Reg = REG111; break; case 0xfa: // mod/rm = 11 010, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM010; op2->Reg = REG111; break; case 0xfb: // mod/rm = 11 011, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM011; op2->Reg = REG111; break; case 0xfc: // mod/rm = 11 100, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM100; op2->Reg = REG111; break; case 0xfd: // mod/rm = 11 101, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM101; op2->Reg = REG111; break; case 0xfe: // mod/rm = 11 110, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM110; op2->Reg = REG111; break; default: case 0xff: // mod/rm = 11 111, reg=111 cbInstr = 1; op1->Type = OPND_REGREF; op1->Reg = MOD11_RM111; op2->Reg = REG111; break; } return cbInstr; }