(MMX实验报告西交大.docx
《(MMX实验报告西交大.docx》由会员分享,可在线阅读,更多相关《(MMX实验报告西交大.docx(10页珍藏版)》请在冰点文库上搜索。
计算机组成原理实验报告
MMX实现图片的淡出淡入
学号:
姓名:
班级:
软件班
实验日期:
2013年12月19日
一、实验目的
利用MMX作为核心技术来实现图像的淡入淡出,并与不使用
MMX的普通淡入淡出进行比较,以此锻炼用混合语言编程的能力。
二、实验分析
MMX是MultiMediasXtensions(多媒体扩展)的缩写,是第六代CPU芯片的重要特点。
MMX技术是以一种SIMD(单指令多数据)样式来处理数据,可以一次在多个数据元素上同时完成加、乘等的运算。
MMX主要是为多媒体程序设计而设置的,由于视频和音频数据一般是由8位或16位这样小的数据类型构成的大的阵列(例如在图形或图像中,每一屏都是由像素点所组成,每个像素或是每个像素的每个颜色分量—红、绿、蓝—都由8位数据表示),为对这些长度的数据提供并行操作的方便,MMX中定义了3种新的数据类型,每种数据类型都是64位长,由多个小的整数字段所组成:
1.压缩字节型:
8个字节打包成一个74位长的数据;
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{
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{
_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技术的代码如下
intMmx(LPBYTEPicture1,LPBYTEPicture2,LPBYTEPicture,intintWidth,intintHeight,intRGB_Bit,inti)
{
intx,y;
LPBYTEtemp1,temp2,temp;
BYTEfade_Rate=(BYTE)i; //
将fade值扩展为16位,以适应MMX的16位运算
BYTEfade1,fade2;
fade1=255-fade_Rate; //16位带符号数最大为32767fade2=fade_Rate;
for(y=0;y{
temp1=(LPBYTE)(Picture1+intWidth*RGB_Bit/8*y);temp2=(LPBYTE)(Picture2+intWidth*RGB_Bit/8*y);temp=(LPBYTE)(Picture+intWidth*RGB_Bit/8*y);for(x=0;x<3*intWidth;x++)
{
_asm{
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
}
temp1++;temp2++;temp++;
}
}
_asmEMMSreturn0;
}
(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",OF_READ);
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!
"<system("pause");return0;
}
(4)说明
从上面的代码可以看出,两者的主要区别在于函数intMmx的不同,前者使用了MMX技术,后者使用普通的汇编指令。
四、实验结果
第一帧图像:
第二帧图像:
渐变过程:
使用MMX花费时间:
未使用MMX花费时间:
两种方法的效率比较:
MMX耗时5241毫秒普通耗时7909毫秒
五、实验总结
通过本次的实验,加深了对MMX指令的了解,通过MMX方法与普通方法实现的淡入淡出的比较,发现在高速处理多媒体数据方面
MMX的优势,运用MMX利于处理效率的大大提高。
同时也对于在
C++中嵌入汇编语言有了很大的了解,学习了新的数据类型。
感谢老师的耐心指导!