⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arm-dis.c

📁 qemu性能直逼VMware的仿真器QEMU 的模擬速度約為實機的 25%;約為 Bochs 的 60 倍。Plex86、User-Mode-Linux、VMware 和 Virtual PC 則比
💻 C
📖 第 1 页 / 共 4 页
字号:
  {0x40C0, 0xFFC0, "lsr\t%0-2r, %3-5r"},  {0x4100, 0xFFC0, "asr\t%0-2r, %3-5r"},  {0x4140, 0xFFC0, "adc\t%0-2r, %3-5r"},  {0x4180, 0xFFC0, "sbc\t%0-2r, %3-5r"},  {0x41C0, 0xFFC0, "ror\t%0-2r, %3-5r"},  {0x4200, 0xFFC0, "tst\t%0-2r, %3-5r"},  {0x4240, 0xFFC0, "neg\t%0-2r, %3-5r"},  {0x4280, 0xFFC0, "cmp\t%0-2r, %3-5r"},  {0x42C0, 0xFFC0, "cmn\t%0-2r, %3-5r"},  {0x4300, 0xFFC0, "orr\t%0-2r, %3-5r"},  {0x4340, 0xFFC0, "mul\t%0-2r, %3-5r"},  {0x4380, 0xFFC0, "bic\t%0-2r, %3-5r"},  {0x43C0, 0xFFC0, "mvn\t%0-2r, %3-5r"},  /* format 13 */  {0xB000, 0xFF80, "add\tsp, #%0-6W"},  {0xB080, 0xFF80, "sub\tsp, #%0-6W"},  /* format 5 */  {0x4700, 0xFF80, "bx\t%S"},  {0x4400, 0xFF00, "add\t%D, %S"},  {0x4500, 0xFF00, "cmp\t%D, %S"},  {0x4600, 0xFF00, "mov\t%D, %S"},  /* format 14 */  {0xB400, 0xFE00, "push\t%N"},  {0xBC00, 0xFE00, "pop\t%O"},  /* format 2 */  {0x1800, 0xFE00, "add\t%0-2r, %3-5r, %6-8r"},  {0x1A00, 0xFE00, "sub\t%0-2r, %3-5r, %6-8r"},  {0x1C00, 0xFE00, "add\t%0-2r, %3-5r, #%6-8d"},  {0x1E00, 0xFE00, "sub\t%0-2r, %3-5r, #%6-8d"},  /* format 8 */  {0x5200, 0xFE00, "strh\t%0-2r, [%3-5r, %6-8r]"},  {0x5A00, 0xFE00, "ldrh\t%0-2r, [%3-5r, %6-8r]"},  {0x5600, 0xF600, "ldrs%11?hb\t%0-2r, [%3-5r, %6-8r]"},  /* format 7 */  {0x5000, 0xFA00, "str%10'b\t%0-2r, [%3-5r, %6-8r]"},  {0x5800, 0xFA00, "ldr%10'b\t%0-2r, [%3-5r, %6-8r]"},  /* format 1 */  {0x0000, 0xF800, "lsl\t%0-2r, %3-5r, #%6-10d"},  {0x0800, 0xF800, "lsr\t%0-2r, %3-5r, #%6-10d"},  {0x1000, 0xF800, "asr\t%0-2r, %3-5r, #%6-10d"},  /* format 3 */  {0x2000, 0xF800, "mov\t%8-10r, #%0-7d"},  {0x2800, 0xF800, "cmp\t%8-10r, #%0-7d"},  {0x3000, 0xF800, "add\t%8-10r, #%0-7d"},  {0x3800, 0xF800, "sub\t%8-10r, #%0-7d"},  /* format 6 */  {0x4800, 0xF800, "ldr\t%8-10r, [pc, #%0-7W]\t(%0-7a)"},  /* TODO: Disassemble PC relative "LDR rD,=<symbolic>" */  /* format 9 */  {0x6000, 0xF800, "str\t%0-2r, [%3-5r, #%6-10W]"},  {0x6800, 0xF800, "ldr\t%0-2r, [%3-5r, #%6-10W]"},  {0x7000, 0xF800, "strb\t%0-2r, [%3-5r, #%6-10d]"},  {0x7800, 0xF800, "ldrb\t%0-2r, [%3-5r, #%6-10d]"},  /* format 10 */  {0x8000, 0xF800, "strh\t%0-2r, [%3-5r, #%6-10H]"},  {0x8800, 0xF800, "ldrh\t%0-2r, [%3-5r, #%6-10H]"},  /* format 11 */  {0x9000, 0xF800, "str\t%8-10r, [sp, #%0-7W]"},  {0x9800, 0xF800, "ldr\t%8-10r, [sp, #%0-7W]"},  /* format 12 */  {0xA000, 0xF800, "add\t%8-10r, pc, #%0-7W\t(adr %8-10r,%0-7a)"},  {0xA800, 0xF800, "add\t%8-10r, sp, #%0-7W"},  /* format 15 */  {0xC000, 0xF800, "stmia\t%8-10r!,%M"},  {0xC800, 0xF800, "ldmia\t%8-10r!,%M"},  /* format 18 */  {0xE000, 0xF800, "b\t%0-10B"},  {0xE800, 0xF800, "undefined"},  /* format 19 */  {0xF000, 0xF800, ""}, /* special processing required in disassembler */  {0xF800, 0xF800, "second half of BL instruction %0-15x"},  /* format 16 */  {0xD000, 0xFF00, "beq\t%0-7B"},  {0xD100, 0xFF00, "bne\t%0-7B"},  {0xD200, 0xFF00, "bcs\t%0-7B"},  {0xD300, 0xFF00, "bcc\t%0-7B"},  {0xD400, 0xFF00, "bmi\t%0-7B"},  {0xD500, 0xFF00, "bpl\t%0-7B"},  {0xD600, 0xFF00, "bvs\t%0-7B"},  {0xD700, 0xFF00, "bvc\t%0-7B"},  {0xD800, 0xFF00, "bhi\t%0-7B"},  {0xD900, 0xFF00, "bls\t%0-7B"},  {0xDA00, 0xFF00, "bge\t%0-7B"},  {0xDB00, 0xFF00, "blt\t%0-7B"},  {0xDC00, 0xFF00, "bgt\t%0-7B"},  {0xDD00, 0xFF00, "ble\t%0-7B"},  /* format 17 */  {0xDE00, 0xFF00, "bal\t%0-7B"},  {0xDF00, 0xFF00, "swi\t%0-7d"},  /* format 9 */  {0x6000, 0xF800, "str\t%0-2r, [%3-5r, #%6-10W]"},  {0x6800, 0xF800, "ldr\t%0-2r, [%3-5r, #%6-10W]"},  {0x7000, 0xF800, "strb\t%0-2r, [%3-5r, #%6-10d]"},  {0x7800, 0xF800, "ldrb\t%0-2r, [%3-5r, #%6-10d]"},  /* the rest */  {0x0000, 0x0000, "undefined instruction %0-15x"},  {0x0000, 0x0000, 0}};#define BDISP23(x) ((((((x) & 0x07ff) << 11) | (((x) & 0x07ff0000) >> 16)) \                     ^ 0x200000) - 0x200000) /* 23bit */#ifndef streq#define streq(a,b)	(strcmp ((a), (b)) == 0)#endif#ifndef strneq#define strneq(a,b,n)	(strncmp ((a), (b), (n)) == 0)#endif#ifndef NUM_ELEM#define NUM_ELEM(a)     (sizeof (a) / sizeof (a)[0])#endifstatic char * arm_conditional[] ={"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc", "hi", "ls", "ge", "lt", "gt", "le", "", "nv"};typedef struct{  const char * name;  const char * description;  const char * reg_names[16];}arm_regname;static arm_regname regnames[] ={  { "raw" , "Select raw register names",    { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}},  { "gcc",  "Select register names used by GCC",    { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl",  "fp",  "ip",  "sp",  "lr",  "pc" }},  { "std",  "Select register names used in ARM's ISA documentation",    { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp",  "lr",  "pc" }},  { "apcs", "Select register names used in the APCS",    { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl",  "fp",  "ip",  "sp",  "lr",  "pc" }},  { "atpcs", "Select register names used in the ATPCS",    { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7",  "v8",  "IP",  "SP",  "LR",  "PC" }},  { "special-atpcs", "Select special register names used in the ATPCS",    { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL",  "FP",  "IP",  "SP",  "LR",  "PC" }}};/* Default to STD register name set.  */static unsigned int regname_selected = 2;#define NUM_ARM_REGNAMES  NUM_ELEM (regnames)#define arm_regnames      regnames[regname_selected].reg_namesstatic boolean force_thumb = false;static char * arm_fp_const[] ={"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"};static char * arm_shift[] = {"lsl", "lsr", "asr", "ror"};/* Forward declarations.  */static void arm_decode_shift PARAMS ((long, fprintf_ftype, void *));static int  print_insn_arm1 PARAMS ((bfd_vma, struct disassemble_info *, long));static int  print_insn_thumb PARAMS ((bfd_vma, struct disassemble_info *, long));static void parse_disassembler_options PARAMS ((char *));int get_arm_regname_num_options (void);int set_arm_regname_option (int option);int get_arm_regnames (int option, const char **setname,		      const char **setdescription,		      const char ***register_names);/* Functions.  */intget_arm_regname_num_options (){  return NUM_ARM_REGNAMES;}intset_arm_regname_option (option)     int option;{  int old = regname_selected;  regname_selected = option;  return old;}intget_arm_regnames (option, setname, setdescription, register_names)     int option;     const char **setname;     const char **setdescription;     const char ***register_names;{  *setname = regnames[option].name;  *setdescription = regnames[option].description;  *register_names = regnames[option].reg_names;  return 16;}static voidarm_decode_shift (given, func, stream)     long given;     fprintf_ftype func;     void * stream;{  func (stream, "%s", arm_regnames[given & 0xf]);    if ((given & 0xff0) != 0)    {      if ((given & 0x10) == 0)	{	  int amount = (given & 0xf80) >> 7;	  int shift = (given & 0x60) >> 5;	  	  if (amount == 0)	    {	      if (shift == 3)		{		  func (stream, ", rrx");		  return;		}	      	      amount = 32;	    }	  	  func (stream, ", %s #%d", arm_shift[shift], amount);	}      else	func (stream, ", %s %s", arm_shift[(given & 0x60) >> 5],	      arm_regnames[(given & 0xf00) >> 8]);    }}/* Print one instruction from PC on INFO->STREAM.   Return the size of the instruction (always 4 on ARM). */static intprint_insn_arm1 (pc, info, given)     bfd_vma                   pc;     struct disassemble_info * info;     long                      given;{  struct arm_opcode *  insn;  void *               stream = info->stream;  fprintf_ftype        func   = info->fprintf_func;  for (insn = arm_opcodes; insn->assembler; insn++)    {      if ((given & insn->mask) == insn->value)	{	  char * c;	  	  for (c = insn->assembler; *c; c++)	    {	      if (*c == '%')		{		  switch (*++c)		    {		    case '%':		      func (stream, "%%");		      break;		    case 'a':		      if (((given & 0x000f0000) == 0x000f0000)			  && ((given & 0x02000000) == 0))			{			  int offset = given & 0xfff;			  			  func (stream, "[pc"); 			  if (given & 0x01000000)			    {			      if ((given & 0x00800000) == 0)				offset = - offset;			  			      /* Pre-indexed.  */			      func (stream, ", #%d]", offset);			      offset += pc + 8;			      /* Cope with the possibility of write-back				 being used.  Probably a very dangerous thing				 for the programmer to do, but who are we to				 argue ?  */			      if (given & 0x00200000)				func (stream, "!");			    }			  else			    {			      /* Post indexed.  */			      func (stream, "], #%d", offset);			      /* ie ignore the offset.  */			      offset = pc + 8;			    }			  			  func (stream, "\t; ");			  info->print_address_func (offset, info);			}		      else			{			  func (stream, "[%s", 				arm_regnames[(given >> 16) & 0xf]);			  if ((given & 0x01000000) != 0)			    {			      if ((given & 0x02000000) == 0)				{				  int offset = given & 0xfff;				  if (offset)				    func (stream, ", %s#%d",					  (((given & 0x00800000) == 0)					   ? "-" : ""), offset);				}			      else				{				  func (stream, ", %s",					(((given & 0x00800000) == 0)					 ? "-" : ""));				  arm_decode_shift (given, func, stream);				}			      func (stream, "]%s", 				    ((given & 0x00200000) != 0) ? "!" : "");			    }			  else			    {			      if ((given & 0x02000000) == 0)				{				  int offset = given & 0xfff;				  if (offset)				    func (stream, "], %s#%d",					  (((given & 0x00800000) == 0)					   ? "-" : ""), offset);				  else 				    func (stream, "]");				}			      else				{				  func (stream, "], %s",					(((given & 0x00800000) == 0) 					 ? "-" : ""));				  arm_decode_shift (given, func, stream);				}			    }			}		      break;		    case 's':                      if ((given & 0x004f0000) == 0x004f0000)			{                          /* PC relative with immediate offset.  */			  int offset = ((given & 0xf00) >> 4) | (given & 0xf);			  			  if ((given & 0x00800000) == 0)			    offset = -offset;			  			  func (stream, "[pc, #%d]\t; ", offset);			  			  (*info->print_address_func)			    (offset + pc + 8, info);			}		      else			{			  func (stream, "[%s", 				arm_regnames[(given >> 16) & 0xf]);			  if ((given & 0x01000000) != 0)			    {                              /* Pre-indexed.  */			      if ((given & 0x00400000) == 0x00400000)				{                                  /* Immediate.  */                                  int offset = ((given & 0xf00) >> 4) | (given & 0xf);				  if (offset)				    func (stream, ", %s#%d",					  (((given & 0x00800000) == 0)					   ? "-" : ""), offset);				}			      else				{                                  /* Register.  */				  func (stream, ", %s%s",					(((given & 0x00800000) == 0)					 ? "-" : ""),                                        arm_regnames[given & 0xf]);				}			      func (stream, "]%s", 				    ((given & 0x00200000) != 0) ? "!" : "");			    }			  else			    {                              /* Post-indexed.  */			      if ((given & 0x00400000) == 0x00400000)				{                                  /* Immediate.  */                                  int offset = ((given & 0xf00) >> 4) | (given & 0xf);				  if (offset)				    func (stream, "], %s#%d",					  (((given & 0x00800000) == 0)					   ? "-" : ""), offset);				  else 				    func (stream, "]");				}			      else				{                                  /* Register.  */				  func (stream, "], %s%s",					(((given & 0x00800000) == 0)					 ? "-" : ""),                                        arm_regnames[given & 0xf]);				}			    }			}		      break;			  		    case 'b':		      (*info->print_address_func)			(BDISP (given) * 4 + pc + 8, info);		      break;		    case 'c':		      func (stream, "%s",			    arm_conditional [(given >> 28) & 0xf]);		      break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -