Example #1
0
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;
    }
}
Example #2
0
/** 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 &reg) {
    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;
}