Example #1
0
File: vm386.c Project: CRogers/obc
/* memory operand */
static void memory(int r, int b, int d) {
     /* Most of the time (with no indexing), we need a (mode, reg,
	r/m) triple, where mode determines the size of displacement (0
	= none, 1 = byte, 2 = word), and r/m is the base register.
	But there are special cases involving the registers ESP = 4
	and EBP = 5:

	mode = 0:
	    Indirect addressing [reg(r/m)].  For [EBP], use (1, r, EBP)
	    with d = byte(0).
	    
	mode = 1 or 2:
	    Based addressing [d+reg(r/m)]. For [d+ESP] use
	    (mode, r, 4) followed by SIB = (0, 4, ESP).

	mode = 0 and r/m = 5:
	    Absolute addressing [d].

	r/m = 4:
	    The triple is followed by another byte containing three
	    values (s, i, b) to encode the address [reg(b)+d+reg(i)*2^s].
	    But we must not have i = ESP, and there are further special 
	    cases:
	    
	mode = 0, r/m = 4, b = 5:
	    Baseless addressing [d+reg(i)*2^s]

	mode = 0, r/m = 4, i = 4, b != 5:
  	    Based addressing [d+reg(b)]. */

     if (b == NOREG)
	  // Absolute [d]
	  addr(0, r, 5), word(d);
     else if (b == ESP) {
	  // Special case to use ESP as base [ESP+d]
	  if (d == 0)
	       addr(0, r, 4), sib(0, 4, ESP);
	  else if (signed8(d))
	       addr(1, r, 4), sib(0, 4, ESP), byte(d);
	  else
	       addr(2, r, 4), sib(0, 4, ESP), word(d);
     } 
     else {
	  // Base + Displacement [b+d]
	  if (d == 0 && b != EBP)
	       addr(0, r, b);
	  else if (signed8(d))
	       addr(1, r, b), byte(d);
	  else
	       addr(2, r, b), word(d);
     }
}
Example #2
0
int modrm1()
{
int  r, b, x, y, y1, y2;

   b=PeekOneByte();
   switch(modTable[b])
   {
      case 1: r=op();    if(!r) return 0; x=result;
              i_mod=x;
              break;
      case 2: r=op();    if(!r) return 0; x=result;
              r=op();    if(!r) return 0; y=result;
              i_mod=x;   i_sib=y;
              if (sibTable[y]==1)
              {
                 r=dword(); if(!r) return 0; y1=result;
                 m_dword=y1;
              }
              break;
      case 3: r=op();    if(!r) return 0; x=result;
              r=dword(); if(!r) return 0; y=result;
              i_mod=x;      m_dword=y;
              break;
      case 4: r=op();    if(!r) return 0; x=result;
              r=byte();  if(!r) return 0; y=result;
              i_mod=x;     m_byte=y;
              break;
      case 5: r=op();    if(!r) return 0; x=result;
              r=sib();   if(!r) return 0; y1=result;
              r=byte();  if(!r) return 0; y2=result;
              i_mod=x;     i_sib=y1; m_byte=y2;
              break;
      case 6: r=op();    if(!r) return 0; x=result;
              r=dword(); if(!r) return 0; y=result;
              i_mod=x;     m_dword=y;
              break;
      case 7: r=op();    if(!r) return 0; x=result;
              r=sib();   if(!r) return 0; y1=result;
              r=dword(); if(!r) return 0; y2=result;
              i_mod=x;     i_sib=y1; m_dword=y2;
              break;
      case 8: r=op();    if(!r) return 0; x=result;
              i_mod=x;
              break;
      default: return 0;
   }
   return 1;
}
Example #3
0
void do_sib(int m)
{
  int s, i, b;
  s = ss(sib());
  i = indx(sib());
  b = base(sib());
  switch (b)
  {
    case 0: expand_out("%p:[EAX"); break;
    case 1: expand_out("%p:[ECX"); break;
    case 2: expand_out("%p:[EDX"); break;
    case 3: expand_out("%p:[EBX"); break;
    case 4: expand_out("%p:[ESP"); break;
    case 5:
      if (m == 0)
      {
        expand_out("%p:[");
        ohex('d', 4, 0, addrsize);
      }
      else
        expand_out("%p:[EBP");
      break;
    case 6: expand_out("%p:[ESI"); break;
    case 7: expand_out("%p:[EDI"); break;
  }
  switch (i)
  {
    case 0: fprintf(out_fh,"+EAX"); break;
    case 1: fprintf(out_fh,"+ECX"); break;
    case 2: fprintf(out_fh,"+EDX"); break;
    case 3: fprintf(out_fh,"+EBX"); break;
    case 4: break;
    case 5: fprintf(out_fh,"+EBP"); break;
    case 6: fprintf(out_fh,"+ESI"); break;
    case 7: fprintf(out_fh,"+EDI"); break;
  }
  if (i != 4)
    switch (s)
    {
      case 0: break;
      case 1: fprintf(out_fh,"*2"); break;
      case 2: fprintf(out_fh,"*4"); break;
      case 3: fprintf(out_fh,"*8"); break;

    }
}
Example #4
0
/*------------------------------------------------------------------------*/
static void  do_sib(int m)
{
  int s, i, b;

  s = SCALE(sib());
  i = INDEX(sib());
  b = BASE(sib());

  switch (b) {     /* pick base */
    case 0: ua_str("%p:[eax"); break;
    case 1: ua_str("%p:[ecx"); break;
    case 2: ua_str("%p:[edx"); break;
    case 3: ua_str("%p:[ebx"); break;
    case 4: ua_str("%p:[esp"); break;
    case 5: if (m == 0) {
              ua_str("%p:[");
              //Flags already set
              outhex('d', 4, 0, addrsize, 0);
            } else {
              ua_str("%p:[ebp");
            }
            break;
    case 6: ua_str("%p:[esi"); break;
    case 7: ua_str("%p:[edi"); break;
  }

  switch (i) {     /* and index */
    case 0: uprintf("+eax"); break;
    case 1: uprintf("+ecx"); break;
    case 2: uprintf("+edx"); break;
    case 3: uprintf("+ebx"); break;
    case 4: break;
    case 5: uprintf("+ebp"); break;
    case 6: uprintf("+esi"); break;
    case 7: uprintf("+edi"); break;
  }

  if (i != 4)
    switch (s) {    /* and scale */
      case 0: uprintf(""); break;
      case 1: uprintf("*2"); break;
      case 2: uprintf("*4"); break;
      case 3: uprintf("*8"); break;
    }
}
Example #5
0
void do_sib(int m)
{
	int s, i, b;
	s = ss(sib());
	i = indx(sib());
	b = base(sib());
	switch (b)
	{
	case 0: ua_str("%p:[eax"); break;
	case 1: ua_str("%p:[ecx"); break;
	case 2: ua_str("%p:[edx"); break;
	case 3: ua_str("%p:[ebx"); break;
	case 4: ua_str("%p:[esp"); break;
	case 5:
		if (m == 0)
		{
			ua_str("%p:[");
			ohex('d', 4, 0, addrsize);
		}
		else
			ua_str("%p:[ebp");
		break;
	case 6: ua_str("%p:[esi"); break;
	case 7: ua_str("%p:[edi"); break;
	}
	switch (i)
	{
	case 0: uprintf("+eax"); break;
	case 1: uprintf("+ecx"); break;
	case 2: uprintf("+edx"); break;
	case 3: uprintf("+ebx"); break;
	case 4: break;
	case 5: uprintf("+ebp"); break;
	case 6: uprintf("+esi"); break;
	case 7: uprintf("+edi"); break;
	}
	if (i != 4)
		switch (s)
	{
		case 0: uprintf(""); break;
		case 1: uprintf("*2"); break;
		case 2: uprintf("*4"); break;
		case 3: uprintf("*8"); break;
	}
}
Example #6
0
static void do_sib(int m)
{	int s, i, b;

	s = SCALE(sib());
	i = INDEX(sib());
	b = BASE(sib());

	switch(b) {			/* Pick base */
		case 0: ua_str("%p:[EAX"); break;
		case 1: ua_str("%p:[ECX"); break;
		case 2: ua_str("%p:[EDX"); break;
		case 3: ua_str("%p:[EBX"); break;
		case 4: ua_str("%p:[ESP"); break;
		case 5:
			if(m == 0) {
				ua_str("%p:[");
				outhex('d', 4, 0, addrsize, 0);
			} else {
				ua_str("%p:[EBP");
			}
			break;
		case 6: ua_str("%p:[ESI"); break;
		case 7: ua_str("%p:[EDI"); break;
	}

	switch(i) {			/* and index */
		case 0: uprintf("+EAX"); break;
		case 1: uprintf("+ECX"); break;
		case 2: uprintf("+EDX"); break;
		case 3: uprintf("+EBX"); break;
		case 4:                  break;
		case 5: uprintf("+EBP"); break;
		case 6: uprintf("+ESI"); break;
		case 7: uprintf("+EDI"); break;
	}
	if(i != 4) {
		switch(s) {		/* and scale */
			case 0: uprintf("");   break;
			case 1: uprintf("*2"); break;
			case 2: uprintf("*4"); break;
			case 3: uprintf("*8"); break;
		}
	}
}
Example #7
0
double HPMatcher::hpm(const vector<feat>& feat1,
						const vector<size_t>& lab1,
						const vector<feat>& feat2,      // features [x y scale rotation]
						const vector<size_t>& lab2,        // labels (visual words)
						const vector<vector<size_t> >& cor,  // tentative correspondences
						vector<double>& strengths,      // correspondence strengths
						vector<bool>& erased,           // erased correspondences
						vector<bool>& out_of_bounds)    // out of bound transformations
{
	// align features based on tentative correspondences
	vector<feat> af1, af2;
	corr::align(feat1, feat2, cor, af1, af2);

	// at least two correspondences needed to match the images
	if(!af1.size()) return 0.0;

	// align correspondence labels (visual words)
	vector<size_t> lab;
	corr::align(lab1, lab2, cor, lab, lab);

	// relative transformations
	vector<feat> tran = feat::rel_tran(af1, af2);

	// quantized transformations within bounds
	vector<size_t> kept;
	vector<unsigned int> qtran = feat::quant(tran, kept, rt, rs, rr, z);

	// number of correspondence transformations kept
	size_t C = qtran.size();

	vector<vector<size_t> > g(C);                  // group count of each correspondence at each level
	vector<float> s(C, 0.0);                  // correspondence strengths
	vector<bool> X(C, false);                 // erased correspondences
	vector<vector<vector<size_t> > > sib(L);  // sibling groups at each level

	// initialize groups
	for(size_t i=0; i<g.size(); i++) g[i].resize(L, 0);

	// recursive HPM call
	vector<size_t> rng;
	for(size_t i=0;i<C;i++)
		rng.push_back(i);
	if(C) hpm_rec(0, qtran, lab, rng, g, s, X, sib);

	// update group count of correspondences in same bin with erased ones
	// "undoing" contribution of correspondences that are eventually erased
	for(size_t l=0; l<L; l++)
		for(size_t i=0, x; x = 0, i<sib[l].size(); i++)
		{
			const vector<size_t>& si = sib[l][i];
			for(size_t j=0; j<si.size(); j++) if(X[si[j]]) x++;
			for(size_t j=0; j<si.size(); j++) if(!X[si[j]]) g[si[j]][l] -= x;
		}

	// correspondence strengths; erased ones have zero strength
	strengths.resize(af1.size(), 0.0);
	for(size_t i=0; i<C; i++) if(!X[i])
		for(size_t l=0; l<L && g[i][l] > 0; l++)
			strengths[kept[i]] += g[i][l] << (l ? (l-1) : 0);

	// weigh strengths by idf
	if(idf.size()) 
		for(size_t i=0;i<kept.size();i++)
			strengths[kept[i]] *= idf[lab[kept[i]]];

	// positions of erased correspondences
	erased.resize(tran.size(), false);

	for(size_t i=0;i<X.size();i++)
		if(X[i])
			erased[kept[i]] = true;
	
	// positions of correspondences out of bounds
	out_of_bounds.resize(tran.size(), true);
	for(size_t i=0;i<kept.size();i++)
		out_of_bounds[kept[i]] = false;
	
	double sm = 0.0;
	for(size_t i=0;i<strengths.size();i++)	sm+= strengths[i];
	// similarity score
	return sm;
}