汇编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++下)
/////////////////////////////////////
//使用汇编完成@运算处理一次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;
}
}
相关文章推荐
- 手把手教你在64位Win7下部署16位汇编学习环境
- 如何在64位系统中运行16位的汇编源程序
- 汇编语言中加减法运算的溢出处理
- 用ARM汇编实现64位数据的运算
- 16位图像Alpha混合的实现(用汇编写的,比MMX还要快)
- 用ARM汇编实现64位数据的运算
- 16位BIT模式下的ALPHA运算
- 【16位汇编】neg+sbb算术运算代替逻辑跳转
- win7 64位下的16位汇编环境
- 64位汇编
- .NET平台处理32位系统和64位系统的一点兼容性问题
- 卷积和积分运算 分类: 图像处理(转载) 2014-08-04 22:31 124人阅读 评论(0) 收藏
- 数学形态学图像处理——图像腐蚀,膨胀,开闭运算(《学习OpenCV》练习题第五章第四题)
- 一个关于文件中位运算的的处理函数。
- 计算机底层数据的处理方式(汇编后将所有数据都转化为补码二进制数据,所有类型信息都会消失)
- windows7 64位操作系统上使vs2010和vs2013能够并存的处理方法
- Win8Metro(C#)数字图像处理--2.24二值图像闭运算
- 处理大数据运算的利器 — 位图原理以及设计
- 图像处理:基础(模板、卷积运算)
- 图像处理之基础---二维卷积运算原理剖析