00001
00002
00003 #ifndef ROSE_DISASSEMBLER_ARM_H
00004 #define ROSE_DISASSEMBLER_ARM_H
00005
00007 class DisassemblerArm: public Disassembler {
00008 public:
00009 DisassemblerArm()
00010 : decodeUnconditionalInstructions(true), ip(0), insn(0), cond(arm_cond_unknown) {
00011 init();
00012 }
00013
00014 DisassemblerArm(const DisassemblerArm& other)
00015 : Disassembler(other), decodeUnconditionalInstructions(other.decodeUnconditionalInstructions),
00016 ip(other.ip), insn(other.insn), cond(other.cond) {
00017 }
00018
00019 virtual ~DisassemblerArm() {}
00020
00021 virtual Disassembler *clone() const {
00022 return new DisassemblerArm(*this);
00023 }
00024
00026 virtual bool can_disassemble(SgAsmGenericHeader*) const;
00027
00029 virtual SgAsmInstruction *disassembleOne(const MemoryMap *map, rose_addr_t start_va, AddressSet *successors=NULL);
00030
00032 virtual void assembleOne(SgAsmInstruction*, SgUnsignedCharList&) {abort();}
00033
00035 virtual SgAsmInstruction *make_unknown_instruction(const Exception&);
00036
00037 private:
00041 class ExceptionArm: public Exception {
00042 public:
00043 ExceptionArm(const std::string &mesg, const DisassemblerArm *d, size_t bit=0)
00044 : Exception(mesg, d->ip) {
00045
00046 bytes.push_back(d->insn & 0xff);
00047 bytes.push_back((d->insn>>8) & 0xff);
00048 bytes.push_back((d->insn>>16) & 0xff);
00049 bytes.push_back((d->insn>>24) & 0xff);
00050 this->bit = bit;
00051 }
00052 };
00053
00054 static SgAsmArmInstruction *makeInstructionWithoutOperands(uint32_t address, const std::string& mnemonic, int condPos,
00055 ArmInstructionKind kind, ArmInstructionCondition cond,
00056 uint32_t insn);
00057 SgAsmArmRegisterReferenceExpression *makeRegister(uint8_t reg) const;
00058 SgAsmArmRegisterReferenceExpression *makePsrFields(bool useSPSR, uint8_t fields) const;
00059 SgAsmArmRegisterReferenceExpression *makePsr(bool useSPSR) const;
00060
00061 SgAsmExpression *makeRotatedImmediate() const;
00062 SgAsmExpression *makeShifterField() const;
00063 SgAsmArmInstruction *makeDataProcInstruction(uint8_t opcode, bool s, SgAsmExpression* rn, SgAsmExpression* rd,
00064 SgAsmExpression* rhsOperand);
00065 SgAsmDoubleWordValueExpression *makeSplit8bitOffset() const;
00066 SgAsmDoubleWordValueExpression *makeBranchTarget() const;
00067 SgAsmExpression *decodeMemoryAddress(SgAsmExpression* rn) const;
00068 SgAsmArmInstruction *decodeMediaInstruction() const;
00069 SgAsmArmInstruction *decodeMultiplyInstruction() const;
00070 SgAsmArmInstruction *decodeExtraLoadStores() const;
00071 SgAsmArmInstruction *decodeMiscInstruction() const;
00072 SgAsmArmInstruction *disassemble();
00073
00075 void init();
00076
00078 void startInstruction(rose_addr_t start_va, uint32_t c) {
00079 ip = start_va;
00080 insn = c;
00081 cond = arm_cond_unknown;
00082 }
00083
00084
00085 bool decodeUnconditionalInstructions;
00086 uint32_t ip;
00087 uint32_t insn;
00088 ArmInstructionCondition cond;
00089 };
00090
00091 #endif