DisassemblerArm.h

Go to the documentation of this file.
00001 /* Disassembly specific to the ARM architecture. */
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             /* Convert four-byte instruction to little-endian buffer. FIXME: assumes little-endian ARM system */
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     /* Per-instruction data members (mostly set by startInstruction()) */
00085     bool decodeUnconditionalInstructions;       
00086     uint32_t ip;                                
00087     uint32_t insn;                              
00088     ArmInstructionCondition cond;
00089 };
00090 
00091 #endif

Generated on Tue Jan 31 05:31:37 2012 for ROSE by  doxygen 1.4.7