该死的汇编代码!
0赞
// 计算查找表,加速,包含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,真TMD是我的偶像。
