博客首页 | 排行榜 |

complex的博客

个人档案
博文分类
该死的汇编代码!  2009-09-20 14:20

// 计算查找表,加速,包含0弧度
void CAreaIndex::Calculate4SpeedEx(SHSVRGB::INCISECOLOR ic)
{
 unsigned char cMaxV= ic.top.V * 255;
 unsigned char cMinV= ic.low.V * 255;

 SHSVRGB::HSV hsv;
  
 // 危险的汇编加速--在循环外部进行寄存器迭代
 unsigned char *pc= this->m_Index;
 __asm
 {
  mov edi, pc;
  add edi, MAX_COLOR;
  inc edi;
 }

 __asm
 {
loop_begin:
  mov esi, MAX_COLOR;
  inc esi;
 }
 __asm
 {
loop_again:
  dec esi;
  jz loop_end;
 }
 {
  // 迭代指针
  __asm
  {
   dec edi;
  }
  // RGB2SHSVRGB::HSV
   // 分解颜色
  unsigned char r, g, b;
  __asm
  {
   mov eax, esi;
   mov b, al;
   shr eax, 8;
   mov g, al;
   shr eax, 8;
   mov r, al;
  }
 
   // 找出最大最小值
  unsigned char cmax, cmin;
  __asm
  { // al ah bl = r g b
   //mov al, r;
   mov ah, g;
   mov bl, b;
  }
  __asm
  {
   // cl ch = cmin cmax
   mov ch, al;
max_cmp_g:
   cmp ch, ah;
   ja max_cmp_b;
   mov ch, ah;  // (r <= g)
max_cmp_b:
   cmp ch, bl;
   ja max_cmp_end;
   mov ch, bl;  // (r <= b)
max_cmp_end:
   mov cmax, ch;
  }
  __asm
  {
   mov cl, al;
min_cmp_g:
   cmp cl, ah;
   jb min_cmp_b;
   mov cl, ah;  // (r >= g)
min_cmp_b:
   cmp cl, bl;
   jb min_cmp_end;
   mov cl, bl;  // (r >= b)
min_cmp_end:
   mov cmin, cl;
  }

  unsigned char submaxmin;
  __asm
  {
   sub ch, cl;
   mov submaxmin, ch;
  }

  if ((cmax < cMinV) || (cmax > cMaxV))
  {
   //m_Index[i]= 0;
   __asm
   {
    mov [edi], 0;
    jmp loop_again;
   }
   //continue;
  }

  hsv.S= (float) submaxmin / cmax;
  if ((hsv.S < ic.low.S) || (hsv.S > ic.top.S))
  {
   //m_Index[i]= 0;
   __asm
   {
    mov [edi], 0;
    jmp loop_again;
   }
   //continue;
  }

  if (r == cmax)
   hsv.H = (float)( g - b) / submaxmin;
  else if (g == cmax)
   hsv.H = 2 + (float)( b - r) / submaxmin;
  else if (b == cmax)
   hsv.H = 4 + (float)( r - g)/ submaxmin;

  hsv.H *= 60;
  if (hsv.H <= 0)
   hsv.H+= 360;

  if ((hsv.H < ic.low.H) && (hsv.H > ic.top.H))
  {
   //m_Index[i]= 0;
   __asm
   {
    mov [edi], 0;
    jmp loop_again;
   }
   //continue;
  }
   
  //m_Index[i]= 1;
  __asm
  {
   mov [edi], 1;
   jmp loop_again;
  }
 }
 __asm
 {
loop_end:
 }
 // 特殊点0x00000000计算
 hsv.H= 0;hsv.S= 0;hsv.V= 0;
 if (((hsv.H >= ic.low.H) || (hsv.H <= ic.top.H)) &&
  ((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
  ((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
 {
  m_Index[0]= 1;
 }
 else
 {
  m_Index[0]= 0;
 }
}

天杀的TuQ,给我看裸嵌入式汇编好头疼!不过真快。TuQ,真是我的偶像。

类别:技术人生 |
上一篇:去年比赛获奖后与老赵的合影 | 下一篇:语音信号处理中关于声音的一些基础知识
以下网友评论只代表其个人观点,不代表本网站的观点或立场