コード例 #1
0
ファイル: ppc_disasm.c プロジェクト: 111X/radare
static char *vd_va_vb(char *s,ppc_word in,int mask)
{
  static const char *fmt = "v%d,";

  if (mask) {
    if (mask & 4)
      s += sprintf(s,fmt,(int)PPCGETD(in));

    if (mask & 2) {
      if (mask & 16) {  /* A = SIMM */
        int a = PPCGETA(in);
        s += sprintf(s,fmt+1,(a>15)?(a-32):a);
      }
      else if (mask & 8)  /* A = UIMM */
        s += sprintf(s,fmt+1,(int)PPCGETA(in));
      else
        s += sprintf(s,fmt,(int)PPCGETA(in));
    }

    if (mask & 1)
      s += sprintf(s,fmt,(int)PPCGETB(in));
    *--s = '\0';
  }
  else
    *s = '\0';
  return (s);
}
コード例 #2
0
	static int branch(struct DisasmPara_PPC *dp,ppc_word in, const char *bname,int aform,int bdisp)
		/* build a branch instr. and return number of chars written to operand */
	{
		int bo = (int)PPCGETD(in);
		int bi = (int)PPCGETA(in);
		char y = (char)(bo & 1);
		int opercnt = 0;
		const 	char *ext = b_ext[aform*2+(int)(in&1)];

		if (bdisp < 0)
			y ^= 1;
		y = y ? '+':'-';

		if (bo & 4) {
			/* standard case - no decrement */
			if (bo & 16) {
				/* branch always */
				if (PPCGETIDX(in) != 16) {
					sprintf(dp->opcode,"b%s%s",bname,ext);
				}
				else {
					sprintf(dp->opcode,"bc%s",ext);
					opercnt = sprintf(dp->operands,"%d, %d",bo,bi);
				}
			}
			else {
				/* branch conditional */
				sprintf(dp->opcode,"b%s%s%s%c",b_condition[((bo&8)>>1)+(bi&3)],
					bname,ext,y);
				if (bi >= 4)
					opercnt = sprintf(dp->operands,"cr%d",bi>>2);
			}
		}

		else {
コード例 #3
0
	static void imm(struct DisasmPara_PPC *dp,ppc_word in,int uimm,int type,int hex)
		/* Generate immediate instruction operand. */
		/* type 0: D-mode, D,A,imm */
		/* type 1: S-mode, A,S,imm */
		/* type 2: S/D register is ignored (trap,cmpi) */
		/* type 3: A register is ignored (li) */
	{
		int i = (int)(in & 0xffff);

		dp->type = PPCINSTR_IMM;
		if (!uimm) {
			if (i > 0x7fff)
				i -= 0x10000;
		}
		else
			dp->flags |= PPCF_UNSIGNED;
		dp->displacement = i;

		switch (type) {
	case 0:
		sprintf(dp->operands,"%s, %s, %d",regnames[(int)PPCGETD(in)],regnames[(int)PPCGETA(in)],i);
		break;
	case 1:
		if (hex)
			sprintf(dp->operands,"%s, %s, 0x%.4X",regnames[(int)PPCGETA(in)],regnames[(int)PPCGETD(in)],i);
		else
			sprintf(dp->operands,"%s, %s, %d",regnames[(int)PPCGETA(in)],regnames[(int)PPCGETD(in)],i);
		break;
	case 2:
		sprintf(dp->operands,"%s, %d",regnames[(int)PPCGETA(in)],i);
		break;
	case 3:
		if (hex)
			sprintf(dp->operands,"%s, 0x%.4X",regnames[(int)PPCGETD(in)],i);
		else
			sprintf(dp->operands,"%s, %d",regnames[(int)PPCGETD(in)],i);
		break;
	default:
		ierror("imm(): Wrong type");
		break;
		}
	}
コード例 #4
0
ファイル: ppc_disasm.c プロジェクト: 111X/radare
static void addi(struct DisasmPara_PPC *dp,ppc_word in,char *ext)
{
  if ((in&0x08000000) && !PPCGETA(in)) {
    sprintf(dp->opcode,"l%s",ext);  /* li, lis */
    imm(dp,in,0,3);
  }
  else {
    sprintf(dp->opcode,"%s%s",(in&0x8000)?"sub":"add",ext);
    if (in & 0x8000)
      in = (in^0xffff) + 1;
    imm(dp,in,1,0);
  }
}
コード例 #5
0
ファイル: ppc_disasm.cpp プロジェクト: TechnoCrunch/ReGekko
static void addi(struct PPCDisasm *dp,ppc_word in,const char *ext)
{
  if ((in&0x08000000) && !PPCGETA(in)) {
    sprintf(dp->opcode,"l%s",ext);  /* li, lis */
    if(!strcmp(ext, "i"))
       imm(dp,in,0,3,1);
    else
       imm(dp,in,1,3,1);
  }
  else {
    sprintf(dp->opcode,"%s%s",(in&0x8000)?"sub":"add",ext);
    if (in & 0x8000)
      in = (in^0xffff) + 1;
    imm(dp,in,1,0,0);
  }
}
コード例 #6
0
ファイル: ppc_disasm.c プロジェクト: 111X/radare
static char *rd_ra_rb(char *s,ppc_word in,int mask)
{
  static const char *fmt = "r%d,";

  if (mask) {
    if (mask & 4)
      s += sprintf(s,fmt,(int)PPCGETD(in));
    if (mask & 2)
      s += sprintf(s,fmt,(int)PPCGETA(in));
    if (mask & 1)
      s += sprintf(s,fmt,(int)PPCGETB(in));
    *--s = '\0';
  }
  else
    *s = '\0';
  return (s);
}
コード例 #7
0
	static char *fd_ra_rb(char *s,ppc_word in,int mask)
	{
		static const char *ffmt = "f%d,";
		static const char *rfmt = "%s,";

		if (mask) {
			if (mask & 4)
				s += sprintf(s,ffmt,(int)PPCGETD(in));
			if (mask & 2)
				s += sprintf(s,rfmt,regnames[(int)PPCGETA(in)]);
			if (mask & 1)
				s += sprintf(s,rfmt,regnames[(int)PPCGETB(in)]);
			*--s = '\0';
		}
		else
			*s = '\0';
		return (s);
	}
コード例 #8
0
ファイル: ppc_disasm.c プロジェクト: 111X/radare
static void ra_rb(char *s,ppc_word in)
{
  sprintf(s,"r%d,r%d",(int)PPCGETA(in),(int)PPCGETB(in));
}
コード例 #9
0
	static void ra_rb(char *s,ppc_word in)
	{
		sprintf(s,"%s, %s",regnames[(int)PPCGETA(in)],regnames[(int)PPCGETB(in)]);
	}