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; };
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(); };