added an ARM disassembler from the android project
This commit is contained in:
		| @@ -181,8 +181,12 @@ | ||||
|     </ProjectReference> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="src\arm\disassembler\arm_disasm.cpp" /> | ||||
|     <ClCompile Include="src\core.cpp" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="src\arm\disassembler\arm_disasm.h" /> | ||||
|   </ItemGroup> | ||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||||
|   <ImportGroup Label="ExtensionTargets"> | ||||
|   </ImportGroup> | ||||
|   | ||||
							
								
								
									
										22
									
								
								src/core/core.vcxproj.filters
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/core/core.vcxproj.filters
									
									
									
									
									
										Normal file
									
								
							| @@ -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
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1003
									
								
								src/core/src/arm/disassembler/arm_disasm.cpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										146
									
								
								src/core/src/arm/disassembler/arm_disasm.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								src/core/src/arm/disassembler/arm_disasm.h
									
									
									
									
									
										Normal 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 */ | ||||
		Reference in New Issue
	
	Block a user