示例#1
0
文件: X86_emu.c 项目: zuloloxi/bolt
Da_emulate_result Da_emulate_SETcc (Da* d, bool cond, CONTEXT * ctx, MemoryCache *mem, unsigned ins_prefixes, address FS)
{
    obj dst;

    obj_byte2 (cond ? 1 : 0, &dst);

    bool b=Da_op_set_value_of_op (&d->op[0], &dst, ctx, mem, d->prefix_codes, FS);
    if (b==false)
        return DA_EMULATED_CANNOT_WRITE_MEMORY;

    CONTEXT_add_to_PC(ctx, d->ins_len);
    return DA_EMULATED_OK;
};
示例#2
0
bool Da_op_get_value_of_op (struct Da_op *op, address * rt_adr, const CONTEXT * ctx, struct MemoryCache *mem, 
        const char *fname, unsigned fileline, obj *result, unsigned ins_prefixes, address FS)
{
    bool b;

    if (op->type==DA_OP_TYPE_REGISTER)
    {
        oassert (op->reg != R_ABSENT);
        // get from ctx
        X86_register_get_value (op->reg, ctx, result);
        return true;
    };

    if (op->type==DA_OP_TYPE_VALUE)
    {
        obj_copy2 (result, &op->val._v);
        return true;
    };

    if (op->type==DA_OP_TYPE_VALUE_IN_MEMORY)
    {
        *rt_adr=(REG)Da_op_calc_adr_of_op (op, ctx, mem, ins_prefixes, FS);
                                      
	//if ((*rt_adr)&(~0x7fffff0f000) == 0x7fffffd0000+2)
        if(0)
	{
		printf ("%s() line %d adr=0x"PRI_REG_HEX"\n", __FUNCTION__, __LINE__, *rt_adr);
	};

        switch (op->value_width_in_bits)
        {
        case 8:
            {
                BYTE out;
                b=MC_ReadByte (mem, *rt_adr, &out);
                if (b)
                {
                    obj_byte2((uint8_t)out, result);
                    return true;
                }
                else
                    return false;
            };
        case 16:
            {
                WORD out;
                b=MC_ReadWyde (mem, *rt_adr, &out);
                if (b)
                {
                    obj_wyde2((uint16_t)out, result);
                    return true;
                }
                else
                    return false;
            };
        case 32:
            {
                DWORD out;
                b=MC_ReadTetrabyte (mem, *rt_adr, &out);
                if (b)
                {
                    obj_tetra2((uint32_t)out, result);
                    return true;
                }
                else
                    return false;
            };
        case 64:
            {
                DWORD64 out;
                b=MC_ReadOctabyte (mem, *rt_adr, &out);
                if (b)
                {
                    obj_octa2((uint64_t)out, result);
                    return true;
                }
                else
                    return false;
            };
        case 128:
            {
                M128A xmm;
                if (MC_ReadBuffer (mem, *rt_adr, sizeof (M128A), (BYTE*)&xmm)==false)
                    return false;
                obj_xmm2 ((uint8_t*)&xmm, result);
                return true;
            };
        default:
            oassert(!"unknown value_width_in_bits");
            fatal_error();
            break;
        };

        oassert(0);
    };

#if 0
	L ("%s(): type=%d!\n", __FUNCTION__, type);
#endif
	oassert(0); // should not be here
    fatal_error();
};