4 changed files with 1175 additions and 0 deletions
-
4src/core/core.vcxproj
-
22src/core/core.vcxproj.filters
-
1003src/core/src/arm/disassembler/arm_disasm.cpp
-
146src/core/src/arm/disassembler/arm_disasm.h
@ -0,0 +1,22 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
|||
<ItemGroup> |
|||
<ClCompile Include="src\core.cpp" /> |
|||
<ClCompile Include="src\arm\disassembler\arm_disasm.cpp"> |
|||
<Filter>arm\disassembler</Filter> |
|||
</ClCompile> |
|||
</ItemGroup> |
|||
<ItemGroup> |
|||
<Filter Include="arm"> |
|||
<UniqueIdentifier>{b84ab55c-588b-45f0-a5ba-f9ebb0442f13}</UniqueIdentifier> |
|||
</Filter> |
|||
<Filter Include="arm\disassembler"> |
|||
<UniqueIdentifier>{61100188-a726-4024-ab16-95ee242b446e}</UniqueIdentifier> |
|||
</Filter> |
|||
</ItemGroup> |
|||
<ItemGroup> |
|||
<ClInclude Include="src\arm\disassembler\arm_disasm.h"> |
|||
<Filter>arm\disassembler</Filter> |
|||
</ClInclude> |
|||
</ItemGroup> |
|||
</Project> |
|||
1003
src/core/src/arm/disassembler/arm_disasm.cpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,146 @@ |
|||
// Copyright 2006 The Android Open Source Project |
|||
|
|||
#ifndef ARMDIS_H |
|||
#define ARMDIS_H |
|||
|
|||
#include <stdint.h> |
|||
|
|||
// Note: this list of opcodes must match the list used to initialize |
|||
// the opflags[] array in opcode.cpp. |
|||
enum Opcode { |
|||
OP_INVALID, |
|||
OP_UNDEFINED, |
|||
OP_ADC, |
|||
OP_ADD, |
|||
OP_AND, |
|||
OP_B, |
|||
OP_BL, |
|||
OP_BIC, |
|||
OP_BKPT, |
|||
OP_BLX, |
|||
OP_BX, |
|||
OP_CDP, |
|||
OP_CLZ, |
|||
OP_CMN, |
|||
OP_CMP, |
|||
OP_EOR, |
|||
OP_LDC, |
|||
OP_LDM, |
|||
OP_LDR, |
|||
OP_LDRB, |
|||
OP_LDRBT, |
|||
OP_LDRH, |
|||
OP_LDRSB, |
|||
OP_LDRSH, |
|||
OP_LDRT, |
|||
OP_MCR, |
|||
OP_MLA, |
|||
OP_MOV, |
|||
OP_MRC, |
|||
OP_MRS, |
|||
OP_MSR, |
|||
OP_MUL, |
|||
OP_MVN, |
|||
OP_ORR, |
|||
OP_PLD, |
|||
OP_RSB, |
|||
OP_RSC, |
|||
OP_SBC, |
|||
OP_SMLAL, |
|||
OP_SMULL, |
|||
OP_STC, |
|||
OP_STM, |
|||
OP_STR, |
|||
OP_STRB, |
|||
OP_STRBT, |
|||
OP_STRH, |
|||
OP_STRT, |
|||
OP_SUB, |
|||
OP_SWI, |
|||
OP_SWP, |
|||
OP_SWPB, |
|||
OP_TEQ, |
|||
OP_TST, |
|||
OP_UMLAL, |
|||
OP_UMULL, |
|||
|
|||
// Define thumb opcodes |
|||
OP_THUMB_UNDEFINED, |
|||
OP_THUMB_ADC, |
|||
OP_THUMB_ADD, |
|||
OP_THUMB_AND, |
|||
OP_THUMB_ASR, |
|||
OP_THUMB_B, |
|||
OP_THUMB_BIC, |
|||
OP_THUMB_BKPT, |
|||
OP_THUMB_BL, |
|||
OP_THUMB_BLX, |
|||
OP_THUMB_BX, |
|||
OP_THUMB_CMN, |
|||
OP_THUMB_CMP, |
|||
OP_THUMB_EOR, |
|||
OP_THUMB_LDMIA, |
|||
OP_THUMB_LDR, |
|||
OP_THUMB_LDRB, |
|||
OP_THUMB_LDRH, |
|||
OP_THUMB_LDRSB, |
|||
OP_THUMB_LDRSH, |
|||
OP_THUMB_LSL, |
|||
OP_THUMB_LSR, |
|||
OP_THUMB_MOV, |
|||
OP_THUMB_MUL, |
|||
OP_THUMB_MVN, |
|||
OP_THUMB_NEG, |
|||
OP_THUMB_ORR, |
|||
OP_THUMB_POP, |
|||
OP_THUMB_PUSH, |
|||
OP_THUMB_ROR, |
|||
OP_THUMB_SBC, |
|||
OP_THUMB_STMIA, |
|||
OP_THUMB_STR, |
|||
OP_THUMB_STRB, |
|||
OP_THUMB_STRH, |
|||
OP_THUMB_SUB, |
|||
OP_THUMB_SWI, |
|||
OP_THUMB_TST, |
|||
|
|||
OP_END // must be last |
|||
}; |
|||
|
|||
class Arm { |
|||
public: |
|||
static char *disasm(uint32_t addr, uint32_t insn, char *buffer); |
|||
static Opcode decode(uint32_t insn); |
|||
|
|||
private: |
|||
static Opcode decode00(uint32_t insn); |
|||
static Opcode decode01(uint32_t insn); |
|||
static Opcode decode10(uint32_t insn); |
|||
static Opcode decode11(uint32_t insn); |
|||
static Opcode decode_mul(uint32_t insn); |
|||
static Opcode decode_ldrh(uint32_t insn); |
|||
static Opcode decode_alu(uint32_t insn); |
|||
|
|||
static char *disasm_alu(Opcode opcode, uint32_t insn, char *ptr); |
|||
static char *disasm_branch(uint32_t addr, Opcode opcode, uint32_t insn, char *ptr); |
|||
static char *disasm_bx(uint32_t insn, char *ptr); |
|||
static char *disasm_bkpt(uint32_t insn, char *ptr); |
|||
static char *disasm_clz(uint32_t insn, char *ptr); |
|||
static char *disasm_memblock(Opcode opcode, uint32_t insn, char *ptr); |
|||
static char *disasm_mem(uint32_t insn, char *ptr); |
|||
static char *disasm_memhalf(uint32_t insn, char *ptr); |
|||
static char *disasm_mcr(Opcode opcode, uint32_t insn, char *ptr); |
|||
static char *disasm_mla(Opcode opcode, uint32_t insn, char *ptr); |
|||
static char *disasm_umlal(Opcode opcode, uint32_t insn, char *ptr); |
|||
static char *disasm_mul(Opcode opcode, uint32_t insn, char *ptr); |
|||
static char *disasm_mrs(uint32_t insn, char *ptr); |
|||
static char *disasm_msr(uint32_t insn, char *ptr); |
|||
static char *disasm_pld(uint32_t insn, char *ptr); |
|||
static char *disasm_swi(uint32_t insn, char *ptr); |
|||
static char *disasm_swp(Opcode opcode, uint32_t insn, char *ptr); |
|||
}; |
|||
|
|||
extern char *disasm_insn_thumb(uint32_t pc, uint32_t insn1, uint32_t insn2, char *result); |
|||
extern Opcode decode_insn_thumb(uint32_t given); |
|||
|
|||
#endif /* ARMDIS_H */ |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue