1 #include "arm.h"
2 #include "arm_common.h"
3 #include "metaarm_emulator.h"
4 
5 namespace REDasm {
6 
ARMAssembler()7 ARMAssembler::ARMAssembler(): ARMCommonAssembler<CS_ARCH_ARM, CS_MODE_ARM>() { }
flags() const8 u32 ARMAssembler::flags() const { return AssemblerFlags::CanEmulate; }
createEmulator(DisassemblerAPI * disassembler) const9 Emulator *ARMAssembler::createEmulator(DisassemblerAPI *disassembler) const { return new MetaARMEmulator(disassembler); }
createPrinter(DisassemblerAPI * disassembler) const10 Printer *ARMAssembler::createPrinter(DisassemblerAPI *disassembler) const { return new MetaARMPrinter(m_cshandle, disassembler); }
11 
pc(const InstructionPtr & instruction) const12 u64 ARMAssembler::pc(const InstructionPtr &instruction) const
13 {
14     /*
15      * https://stackoverflow.com/questions/24091566/why-does-the-arm-pc-register-point-to-the-instruction-after-the-next-one-to-be-e
16      *
17      * In ARM state:
18      *  - The value of the PC is the address of the current instruction plus 8 bytes.
19      */
20 
21     return instruction->address + 8;
22 }
23 
24 } // namespace REDasm
25