您的位置:首页 > 编程语言 > C语言/C++

汇编alpha运算处理 16位/64位

2008-03-02 23:32 363 查看
自己看汇编资料用MMX指令写的alpha运算代码

还可以更优化

仅供参考(VC++下)

/////////////////////////////////////
//使用汇编完成@运算处理一次16位
/////////////////////////////////////
void DoAlpha(WORD *source,WORD *dest)
{
__asm
{
//对源图像的数据进行分离整理
mov edx,source;
mov ax,[edx];

and ax,0x001f;
push ax;

mov ax,[edx];
and ax,0x07E0;
shr ax,6;
push ax;

mov ax,[edx];
and ax,0xF800;
shr ax,11;
push ax;

mov edx,dest;//分离目标数据,并进行合成处理
mov ax,[edx];

and ax,0xF800;
shr ax,11;
pop bx;

add ax,bx;
shr ax,1;
shl ax,11;
mov cx,ax;//结果放置在cx中

mov ax,[edx];
and ax,0x07E0;
shr ax,6;
pop bx;
add ax,bx;
shr ax,1;
shl ax,6;
or cx,ax;

mov ax,[edx];
and ax,0x001f;
pop bx;
add ax,bx;
shr ax,1;
or cx,ax;
mov [edx],cx;
}
}

///////////////////////////////
//使用MMX指令完成的@运算一次处理64位
/////////////////////////////////
void DoAlphaMMX(WORD *SourLP,WORD *DestLP)
{
__int64 MASKRED, MASKGREEN, MASKBLUE;
MASKRED = 0xF800F800F800F800; // 三种颜色的掩码的64位扩展
MASKGREEN = 0x07E007E007E007E0;
MASKBLUE = 0x001F001F001F001F;
__asm
{
mov edx,SourLP;
mov ecx,DestLP;

movq mm0,[edx]; //把源内容放入mm0
movq mm1,mm0; //把源内容放入mm1
movq mm2,mm0; //把源内容放入mm2
movq mm3,mm0; //把源内容放入mm3

PAND mm1,MASKRED; //得出源红
PSRLW mm1,11;
PAND mm2,MASKGREEN; //得出源绿
PSRLW mm2,6;
PAND mm3,MASKBLUE; //得出源篮

movq mm0,[ecx]; //把目标内容放入mm0
movq mm4,mm0; //把目标内容放入mm1
movq mm5,mm0; //把目标内容放入mm2
movq mm6,mm0; //把目标内容放入mm3

PAND mm4,MASKRED; //得目标出红
PSRLW mm4,11; //移位
PAND mm5,MASKGREEN; //得目标出绿
PSRLW mm5,6; //移位
PAND mm6,MASKBLUE ; //得目标出篮

PADDSB mm1,mm4; //相加
PADDSB mm2,mm5;
PADDSB mm3,mm6;

PSRLW mm1,1; //除2
PSRLW mm2,1;
PSRLW mm3,1;

PSLLW mm1,11 //移回
PSLLW mm2,6

PADDSB mm1,mm2;//相加
PADDSB mm1,mm3;//相加
movq [ecx],mm1;//数值放回
emms;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  汇编 vc++ 优化 扩展