RoseBin_support::X86PositionInRegister get_position_in_register(const RegisterDescriptor &rdesc) { if (0==rdesc.get_offset()) { switch (rdesc.get_nbits()) { case 8: return RoseBin_support::x86_regpos_low_byte; case 16: return RoseBin_support::x86_regpos_word; case 32: return RoseBin_support::x86_regpos_dword; case 64: return RoseBin_support::x86_regpos_qword; default: return RoseBin_support::x86_regpos_all; } } else if (8==rdesc.get_offset() && 8==rdesc.get_nbits()) { return RoseBin_support::x86_regpos_high_byte; } else { return RoseBin_support::x86_regpos_unknown; } }
/** Returns the name of an X86 register. * * We use the amd64 architecture because, since it's backward compatible with the 8086, it contains definitions for all the * registers from older architectures. */ std::string unparseX86Register(const RegisterDescriptor ®) { using namespace StringUtility; const RegisterDictionary *dict = RegisterDictionary::dictionary_amd64(); std::string name = dict->lookup(reg); if (name.empty()) { static bool dumped_dict = false; std::cerr <<"unparseX86Register(" <<reg <<"): register descriptor not found in dictionary.\n"; if (!dumped_dict) { std::cerr <<" FIXME: we might be using the amd64 register dictionary. [RPM 2011-03-02]\n"; //std::cerr <<*dict; dumped_dict = true; } return (std::string("BAD_REGISTER(") + numberToString(reg.get_major()) + "." + numberToString(reg.get_minor()) + "." + numberToString(reg.get_offset()) + "." + numberToString(reg.get_nbits()) + ")"); } return name; }