Пример #1
0
/* ====================================================================
 *
 * ==================================================================== */
void __bea_callspec__ XMMrm32XMMreg(PDISASM pMyDisasm)
{
    MOD_RM_SSE(&(*pMyDisasm).Argument1, pMyDisasm);
    RegSSE_Opcode(&(*pMyDisasm).Argument2, pMyDisasm);
    (*pMyDisasm).Argument1.ArgSize = 32;
    GV.EIP_ += GV.DECALAGE_EIP;
}
Пример #2
0
/* ====================================================================
 *
 * ==================================================================== */
void __bea_callspec__ G13_(PDISASM pMyDisasm)
{
    Int32 MyNumber;

    GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_))) >> 3) & 0x7;
    if (GV.REGOPCODE == 2) {
        GV.ImmediatSize = 8;
        if ((*pMyDisasm).Prefix.OperandSizeState == InUsePrefix) {
            PrefOpSizeMandatory(pMyDisasm);
            (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE;
            MOD_RM_SSE(&(*pMyDisasm).Argument1, pMyDisasm);
        }
        else {
            (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE;
            MOD_RM_MMX(&(*pMyDisasm).Argument1, pMyDisasm);
        }
        (*pMyDisasm).Argument1.AccessMode = READ+WRITE;
        if (GV.MOD_== 0x3) {
            (*pMyDisasm).Instruction.Mnemonic = I_PSRLD;
        }
        else {
            FailDecode(pMyDisasm);
        }
        GV.EIP_ += 2;
        if (!Security(0, pMyDisasm)) return;

        MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1));
        (*pMyDisasm).Instruction.Immediat = MyNumber;
        (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_;
        (*pMyDisasm).Argument2.ArgSize = 8;
    }
    else if (GV.REGOPCODE == 4) {
        GV.ImmediatSize = 8;
        if ((*pMyDisasm).Prefix.OperandSizeState == InUsePrefix) {
            PrefOpSizeMandatory(pMyDisasm);
            (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE;
            (*pMyDisasm).Argument1.ArgSize = 128;
            MOD_RM_SSE(&(*pMyDisasm).Argument1, pMyDisasm);
        }
        else {
            (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE;
            MOD_RM_MMX(&(*pMyDisasm).Argument1, pMyDisasm);
        }
        (*pMyDisasm).Argument1.AccessMode = READ+WRITE;
        if (GV.MOD_== 0x3) {
            (*pMyDisasm).Instruction.Mnemonic = I_PSRAD;
        }
        else {
            FailDecode(pMyDisasm);
        }
        GV.EIP_ += 2;
        if (!Security(0, pMyDisasm)) return;

        MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1));
        (*pMyDisasm).Instruction.Immediat = MyNumber;
        (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_;
        (*pMyDisasm).Argument2.ArgSize = 8;
    }
    else if (GV.REGOPCODE == 6) {
        GV.ImmediatSize = 8;
        if ((*pMyDisasm).Prefix.OperandSizeState == InUsePrefix) {
            PrefOpSizeMandatory(pMyDisasm);
            (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE;
            (*pMyDisasm).Argument1.ArgSize = 128;
            MOD_RM_SSE(&(*pMyDisasm).Argument1, pMyDisasm);
        }
        else {
            (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE;
            MOD_RM_MMX(&(*pMyDisasm).Argument1, pMyDisasm);
        }
        (*pMyDisasm).Argument1.AccessMode = READ+WRITE;
        if (GV.MOD_== 0x3) {
            (*pMyDisasm).Instruction.Mnemonic = I_PSLLD;
        }
        else {
            FailDecode(pMyDisasm);
        }
        GV.EIP_ += 2;
        if (!Security(0, pMyDisasm)) return;

        MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1));
        (*pMyDisasm).Instruction.Immediat = MyNumber;
        (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_;
        (*pMyDisasm).Argument2.ArgSize = 8;
    }

    else {
        FailDecode(pMyDisasm);
    }

}
Пример #3
0
/* ====================================================================
 *  SSE r/m, MMX reg
 * ==================================================================== */
void __bea_callspec__ XMMrmMMreg(PDISASM pMyDisasm)
{
    MOD_RM_SSE(&(*pMyDisasm).Argument1, pMyDisasm);
    RegMMX_Opcode(&(*pMyDisasm).Argument2, pMyDisasm);
    GV.EIP_ += GV.DECALAGE_EIP;
}