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

📄 sparc_disas.cpp

📁 usb-jtag转换,sparc芯片反汇编,sparc芯片调试的工具,可以对芯片内的gpio,sdram,flash进行读写,还可以一次下载64K大小的数据,反汇编,在线调试.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	int i = 0;
	int simm = 0;
	PC_OP_TYPE insn;

	int tmpAddr = 0;
	int tmpAddr1 = 0;
	
	// initialize local parameter
	strcpy(bl2, "  ");
	strcpy(bb, "    ");

	op1  = (op >> 30) & 0x00000003; // op( 31 downto 30 )
	op2  = (op >> 22) & 0x00000007; // op( 24 downto 22 )
	op3  = (op >> 19) & 0x0000003f; // op( 24 downto 19 )
	opf  = (op >>  5) & 0x000001ff; // op( 13 downto 5  )
	cond = (op >> 25) & 0x0000000f; // op( 28 downto 25 )
	annul= (op >> 29) & 0x00000001; // op( 29 )
	rs1  = (op >> 14) & 0x0000001f; // op( 18 downto 14 )
	rs2  = (op >>  0) & 0x0000001f; // op( 4  downto 0  )
	rd   = (op >> 25) & 0x0000001f; // op( 29 downto 25 )
	i    = (op >> 13) & 0x00000001; // op( 13 )
	simm = (op >>  0) & 0x00001fff; // op (12 downto 0 )

	insn.op = op;
	insn.pc = pc;
	
	switch (op1)
	{
    case CALL:
		tmpAddr = pc + (op << 2);
		tostf(pc);
		strcat(dis_info, bb);
		strcat(dis_info, "call");
		strcat(dis_info, bl2);
		tost(tmpAddr);
		return dis_info;
    case FMT2:
      switch (op2)
	  {
      case SETHI:
		  if (rd == 0)
		  {
			  tostf(pc);
			  strcat(dis_info, bb);
			  strcat(dis_info, "nop");
		  }
		  else
		  {
			  tostf(pc);
			  strcat(dis_info, bb);
			  strcat(dis_info, "sethi");
			  strcat(dis_info, bl2);
			  strcat(dis_info, "%hi(0x");
			  tost(op << 10);
			  strcat(dis_info, "), ");
			  ireg2st(rd);
		  }
		  return dis_info;
      case BICC:
	  case FBFCC:
		  tmpAddr1 = 0;
		  tmpAddr1 = tmpAddr1 | ((op & 0x3fffff) << 2);
		  if ((tmpAddr1 >> 23) & 0x1)
		  {
			  tmpAddr1 = tmpAddr1 | 0xff000000;
		  }
		  else
		  {
			  tmpAddr1 = tmpAddr1 & 0x00ffffff;
		  }
		  tmpAddr1 = tmpAddr1 + pc;
		  if (op2 == BICC)
		  {
			  if ((op >> 29) & 0x1)
			  {
				  tostf(pc);
				  strcat(dis_info, bb);
				  strcat(dis_info, "b");
				  branchop(insn);
				  strcat(dis_info, ",a");
				  strcat(dis_info, bl2);
				  tost(tmpAddr1);
			  }
			  else
			  {
				  tostf(pc);
				  strcat(dis_info, bb);
				  strcat(dis_info, "b");
				  branchop(insn);
				  strcat(dis_info, bl2);
				  tost(tmpAddr1);
			  }
		  }
		  else
		  {
			  if ((op >> 29) & 0x1)
			  {
				  tostf(pc);
				  strcat(dis_info, bb);
				  strcat(dis_info, "fb");
				  fbranchop(insn);
				  strcat(dis_info, ",a");
				  strcat(dis_info, bl2);
				  tost(tmpAddr1);
			  }
			  else
			  {
				  tostf(pc);
				  strcat(dis_info, bb);
				  strcat(dis_info, "fb");
				  fbranchop(insn);
				  strcat(dis_info, bl2);
				  tost(tmpAddr1);
			  }
		  }


		  return dis_info;
      default:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "unimp");
		  strcat(dis_info, bl2);
		  strcat(dis_info, "0");
		  return dis_info;
	  }
    case FMT3:
      switch (op3)
	  {
      case IAND:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "and");
		  strcat(dis_info, bl2);
		  regres(insn, HEX);
		  return dis_info;
      case IADD:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "add");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case IOR: 

//		  if ((i == 0) && (rs1 == 0) && (rs2 == 0))
//		  {
//			  tostf(pc);
//			  strcat(dis_info, bb);
//			  strcat(dis_info, "clr");
//			  strcat(dis_info, bl2);
//			  ireg2st(rd);
//		  }
//		  else if ( ((i == 1) && (simm == 0)) || (rs1 == 0))
//				{
//					tostf(pc);
//					strcat(dis_info, bb);
//					strcat(dis_info, "mov");
//					strcat(dis_info, bl2);
//					regres(insn, HEX);
//				}
		  // change postion to fix "clr" and "mov" priority
		  if ( (((i == 1) && (simm == 0)) || (rs1 == 0)) && ((insn.op & 0xffffff) != 0x00102000) )
		  {
			  tostf(pc);
			  strcat(dis_info, bb);
			  strcat(dis_info, "mov");
			  strcat(dis_info, bl2);
			  regres(insn, HEX);
		  }
		  else if ((rs1 == 0) && (rs2 == 0))
				{
					tostf(pc);
					strcat(dis_info, bb);
					strcat(dis_info, "clr");
					strcat(dis_info, bl2);
					ireg2st(rd);
				}
				else
				{
					tostf(pc);
					strcat(dis_info, bb);
					strcat(dis_info, "or");
					strcat(dis_info, bl2);
					regres(insn, HEX);
				}
		  return dis_info;
      case IXOR:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "xor");
		  strcat(dis_info, bl2);
		  regres(insn, HEX);
		  return dis_info;
      case ISUB:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "sub");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case ANDN:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "andn");
		  strcat(dis_info, bl2);
		  regres(insn, HEX);
		  return dis_info;
      case ORN:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "orn");
		  strcat(dis_info, bl2);
		  regres(insn, HEX);
		  return dis_info;
      case IXNOR:
		  if ((i == 0) && ( (rs1 == rd) || (rs2 == 0)))
		  {
			  tostf(pc);
			  strcat(dis_info, bb);
			  strcat(dis_info, "not");
			  strcat(dis_info, bl2);
			  ireg2st(rd);
		  }
		  else
		  {
			  tostf(pc);
			  strcat(dis_info, bb);
			  strcat(dis_info, "xnor");
			  strcat(dis_info, bl2);
			  ireg2st(rd);
		  }
		  return dis_info;
      case ADDX:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "addx");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case SUBX:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "subx");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case ADDCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "addcc");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case ANDCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "andcc");
		  strcat(dis_info, bl2);
		  regres(insn, HEX);
		  return dis_info;
      case ORCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "orcc");
		  strcat(dis_info, bl2);
		  regres(insn, HEX);
		  return dis_info;
      case XORCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "xorcc");
		  strcat(dis_info, bl2);
		  regres(insn, HEX);
		  return dis_info;
      case SUBCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  if (((insn.op >> 28) & 0x0f) == 0xa)
			  strcat(dis_info, "subcc");
		  else
			  strcat(dis_info, "cmp");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case ANDNCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "andncc");
		  strcat(dis_info, bl2);
		  regres(insn, HEX);
		  return dis_info;
      case ORNCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "orncc");
		  strcat(dis_info, bl2);
		  regres(insn, HEX);
		  return dis_info;
      case XNORCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "xnorcc");
		  strcat(dis_info, bl2);
		  regres(insn, HEX);
		  return dis_info;
      case ADDXCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "addxcc");
		  strcat(dis_info, bl2);
		  regres(insn, HEX);
		  return dis_info;
      case UMAC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "umac");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case SMAC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "smac");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case UMUL:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "umul");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case SMUL:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "smul");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case UMULCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "umulcc");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case SMULCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "smulcc");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case SUBXCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "subxcc");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case UDIV:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "udiv");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case SDIV:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "sdiv");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case UDIVCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "udivcc");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case SDIVCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "sdivcc");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case TADDCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "taddcc");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case TSUBCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "tsubcc");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case TADDCCTV:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "taddcctv");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case TSUBCCTV:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "tsubcctv");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case MULSCC:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "mulscc");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case ISLL:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "sll");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case ISRL:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "srl");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case ISRA:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "sra");
		  strcat(dis_info, bl2);
		  regres(insn, DEC);
		  return dis_info;
      case RDY: 
		  if (rs1 != 0)
		  {
			  tostf(pc);
			  strcat(dis_info, bb);
			  strcat(dis_info, "rd");
			  strcat(dis_info, bl2);
			  strcat(dis_info, "%asr");
			  tostd(rs1);
			  strcat(dis_info, ", ");
			  ireg2st(rd);
		  }
		  else
		  {
			  tostf(pc);
			  strcat(dis_info, bb);
			  strcat(dis_info, "rd");
			  strcat(dis_info, bl2);
			  strcat(dis_info, "%tbr, ");
			  ireg2st(rd);
		  }
          return dis_info;
      case RDPSR:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "rd");
		  strcat(dis_info, bl2);
		  strcat(dis_info, "%psr, ");
		  ireg2st(rd);
		  return dis_info;
      case RDWIM:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "rd");
		  strcat(dis_info, bl2);
		  strcat(dis_info, "%win, ");
		  ireg2st(rd);
		  return dis_info;
      case RDTBR:
		  tostf(pc);
		  strcat(dis_info, bb);
		  strcat(dis_info, "rd");
		  strcat(dis_info, bl2);
		  strcat(dis_info, "%tbr, ");
		  ireg2st(rd);
		  return dis_info;
      case WRY:
		  if ((rs1 == 0) || (rs2 == 0))
		  {
			  if (rd != 0)
			  {
				  tostf(pc);
				  strcat(dis_info, bb);
				  strcat(dis_info, "mov");
				  strcat(dis_info, bl2);
				  regimm(insn, HEX, false);
				  strcat(dis_info, ", %asr");
				  tostd(rd);
			  }
			  else
			  {
				  tostf(pc);
				  strcat(dis_info, bb);
				  strcat(dis_info, "mov");
				  strcat(dis_info, bl2);
				  regimm(insn, HEX, false);
				  strcat(dis_info, ", %y");
			  }
		  }
		  else
		  {
			  if (rd != 0)
			  {
				  tostf(pc);
				  strcat(dis_info, bb);
				  strcat(dis_info, "wr ");
				  strcat(dis_info, bl2);
				  strcat(dis_info, "%asr");
				  regimm(insn, HEX, false);
				  strcat(dis_info, ", %asr");
				  tostd(rd);
			  }
			  else
			  {
				  tostf(pc);
				  strcat(dis_info, bb);
				  strcat(dis_info, "wr ");
				  strcat(dis_info, bl2);
				  regimm(insn, HEX, false);
				  strcat(dis_info, ", %y");
			  }
		  }
		  return dis_info;
      case WRPSR:
		  if ((rs1 == 0) || (rs2 == 0))
		  {
			  tostf(pc);
			  strcat(dis_info, bb);
			  strcat(dis_info, "mov");
			  strcat(dis_info, bl2);
			  regimm(insn, HEX, false);
			  strcat(dis_info, ", %psr");
		  }
		  else
		  {
			  tostf(pc);
			  strcat(dis_info, bb);
			  strcat(dis_info, "wr ");
			  strcat(dis_info, bl2);
			  regimm(insn, HEX, false);
			  strcat(dis_info, ", %psr");
		  }
		  return dis_info;
      case WRWIM:
		  if ((rs1 == 0) || (rs2 == 0))
		  {
			  tostf(pc);
			  strcat(dis_info, bb);
			  strcat(dis_info, "mov");
			  strcat(dis_info, bl2);
			  regimm(insn, HEX, false);
			  strcat(dis_info, ", %wim");
		  }
		  else
		  {
			  tostf(pc);
			  strcat(dis_info, bb);
			  strcat(dis_info, "wr ");
			  strcat(dis_info, bl2);
			  regimm(insn, HEX, false);
			  strcat(dis_info, ", %wim");
		  }
		  return dis_info;
      case WRTBR:
		  if ((rs1 == 0) || (rs2 == 0))
		  {
			  tostf(pc);
			  strcat(dis_info, bb);
			  strcat(dis_info, "mov");
			  strcat(dis_info, bl2);
			  regimm(insn, HEX, false);
			  strcat(dis_info, ", %tbr");
		  }
		  else
		  {
			  tostf(pc);
			  strcat(dis_info, bb);
			  strcat(dis_info, "mr ");
			  strcat(dis_info, bl2);
			  regimm(insn, HEX, false);
			  strcat(dis_info, ", %tbr");
		  }
		  
	      return dis_info;
      case JMPL:
		  if (rd == 0)
		  {
			  if ((i==1)&&(simm == 0x8))
			  {
				  if (rs1 == 0x1f)
				  {
					  tostf(pc);
					  strcat(dis_info, bb);
					  strcat(dis_info, "ret");
				  }
				  else if (rs1 == 0x0f)
						{	
							tostf(pc);
							strcat(dis_info, bb);
							strcat(dis_info, "retl");
						}
						else
						{
							tostf(pc);
							strcat(dis_info, bb);
							strcat(dis_info, "jmp");
							strcat(dis_info, bl2);
							regimm(insn, DEC, true);
						}
			  }

⌨️ 快捷键说明

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