(MMX实验报告西交大Word格式.docx
- 文档编号:954803
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:10
- 大小:285.43KB
(MMX实验报告西交大Word格式.docx
《(MMX实验报告西交大Word格式.docx》由会员分享,可在线阅读,更多相关《(MMX实验报告西交大Word格式.docx(10页珍藏版)》请在冰点文库上搜索。
2.压缩字型:
4个字打包成一个64位长的数据;
3.压缩双字型:
2个32位的双字打包成一个64位长的数据。
一般的影视节目常有淡出、淡入效果。
即一屏图像逐渐溶解成另一屏图像。
两个图像以一种加权平均组合:
Result_pixel=A_pixel×
fade+B_pixel×
(1-fade)
等价的公式为
Result_pixel=(A_pixel-B_pixel)×
fade+B_pixel
其中fade为渐变因子,当fade从1到0逐渐改变时,就可产生渐变效果。
对A、B两图像的每个像素位置完成上述计算,当fade值由1逐渐变为0(可按相应的8位整数组分成255阶),则产生一系列的图像帧,即实现了由A图像淡化到B图像的效果。
三、实验过程
本实验中在visualstudio2010 平台上编写应用程序,通过比较采用C++内联汇编方式调用的MMX指令和调用API对图片像素逐个处理方法的处理效率,学习体会提高数据处理速度的方法。
主要代码如下:
(1)使用MMX技术的代码如下
intMmx(LPBYTEPicture1,LPBYTEPicture2,LPBYTEPicture,intintWidth,intintHeight,intRGB_Bit,inti)
{
intx,y;
LPDWORDtemp1,temp2,temp;
intfade_Rate=i*128;
//将
fade值扩展为16位,以适应MMX的16位运算WORDfade1[4],fade2[4];
fade1[0]=fade1[1]=fade1[2]=fade1[3]=32767-fade_Rate;
//16
位带符号数最大为32767
fade2[0]=fade2[1]=fade2[2]=fade2[3]=fade_Rate;
for(y=0;
y<
intHeight;
y++)
temp1=(LPDWORD)(Picture1+intWidth*RGB_Bit/8*y);
temp2=(LPDWORD)(Picture2+intWidth*RGB_Bit/8*y);
temp=(LPDWORD)(Picture+intWidth*RGB_Bit/8*y);
for(x=0;
x<
intWidth;
x++)
_asm{
//
Result_pixel=A_pixel*fade+B_pixel*(1-fade)=(A-B)*fade+B
pxor mm7,mm7 //将mm7寄存器清除为0movq mm2,[fade1] //将阶值装入mm2寄存器movq mm3,[fade2]
mov esi,[temp1]
mov edx,[temp2]
mov edi,[temp]
movd mm0,[esi] //取图像1的像素分量装入mm0
寄存器
movd mm1,[edx]punpcklbwmm0,mm7
punpcklbwmm1,mm7 //将字节解紧缩到16位
pmulhw mm0,mm2 //乘以阶值 (a*fade)
pmulhw mm1,mm3 //(b*(1-fade))paddw mm0,mm1
packuswb mm0,mm7 //紧缩16位到字节movd [edi],mm0
}
temp1++;
temp2++;
temp++;
_asmEMMSreturn0;
(2)未使用MMX技术的代码如下
LPBYTEtemp1,temp2,temp;
BYTEfade_Rate=(BYTE)i;
//
将fade值扩展为16位,以适应MMX的16位运算
BYTEfade1,fade2;
fade1=255-fade_Rate;
//16位带符号数最大为32767fade2=fade_Rate;
for(y=0;
temp1=(LPBYTE)(Picture1+intWidth*RGB_Bit/8*y);
temp2=(LPBYTE)(Picture2+intWidth*RGB_Bit/8*y);
temp=(LPBYTE)(Picture+intWidth*RGB_Bit/8*y);
3*intWidth;
movdh,[fade1]movdl,[fade2]
movecx,[temp1]movbh,[ecx]movesi,[temp2]
movbl,[esi]moval,dhmulbh
movedi,[temp]mov[edi],ahmoval,dlmulbl
addah,[edi]mov[edi],ah
(3)主函数代码
voidTest_MMX(intintWidth,intintHeight,intRGB_Bit,intTime)
{ _try{
_asmEMMS
针类型
针
的句柄
}
_except(EXCEPTION_EXECUTE_HANDLER){
HDChDC;
LPBITMAPINFOlpInfo;
//指向图片对象的长指
intintSize,i;
LPBYTE lpBuf1,lpBuf2,lpBuf;
//指向字节(串)的指
HFILEPicture1,Picture2;
Picture1=_lopen("
test3.bmp"
OF_READ);
//返回打开文件
Picture2=_lopen("
test4.bmp"
intSize=GetFileSize((HANDLE)Picture1,NULL);
//返回文件长度
lpBuf1=(LPBYTE)LocalAlloc(LPTR,intSize);
//返回新分配的内存地址,,
从堆中分配指定大小的字节数
lpBuf2=(LPBYTE)LocalAlloc(LPTR,intSize);
lpBuf=(LPBYTE)LocalAlloc(LPTR,intSize);
_lread(Picture1,lpBuf1,intSize);
//指定一个内存块的指针,数据将读入这个内存块
_lread(Picture2,lpBuf2,intSize);
_lclose(Picture1);
_lclose(Picture2);
memcpy(lpBuf,lpBuf1,intSize);
lpInfo=(LPBITMAPINFO)(lpBuf+0x0e);
hDC=GetDC(NULL);
for(i=0;
i<
255;
i++) //默认是图像按255阶渐变,即让fade的值
变化255次
Mmx(lpBuf1+0x60,lpBuf2+0x60,lpBuf+0x60,intWidth,intHeight,RGB_Bit,i);
Sleep(Time);
//指定从lpBuf+0x60这一行开
始扫描
SetDIBitsToDevice(hDC,300,150,intWidth,intHeight,0,0,0,480,lpBuf+0x60,lpInf
o,DIB_RGB_COLORS);
//该函数使用DIB位图和颜色数据对与目标设备环境相关的设备上的指定矩形中的像素进行设置。
LocalFree(lpBuf1);
LocalFree(lpBuf2);
ReleaseDC(NULL,hDC);
usingnamespacestd;
int_tmain(intargc,_TCHAR*argv[])
DWORDstart_time=GetTickCount();
Test_MMX(640,480,24,8);
DWORDend_time=GetTickCount();
cout<
<
"
使用MMX用时:
(end_time-start_time)<
ms!
endl;
//输出运行时间
system("
pause"
);
return0;
(4)说明
从上面的代码可以看出,两者的主要区别在于函数intMmx的不同,前者使用了MMX技术,后者使用普通的汇编指令。
四、实验结果
第一帧图像:
第二帧图像:
渐变过程:
使用MMX花费时间:
未使用MMX花费时间:
两种方法的效率比较:
MMX耗时5241毫秒普通耗时7909毫秒
五、实验总结
通过本次的实验,加深了对MMX指令的了解,通过MMX方法与普通方法实现的淡入淡出的比较,发现在高速处理多媒体数据方面
MMX的优势,运用MMX利于处理效率的大大提高。
同时也对于在
C++中嵌入汇编语言有了很大的了解,学习了新的数据类型。
感谢老师的耐心指导!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MMX 实验 报告 交大