21,459
社区成员
发帖
与我相关
我的任务
分享
int __declspec(naked) _stdcall RGBATORGB(char *dest, char *src, unsigned int len)
{
_asm
{
push ebp
mov ebp,esp
mov edx,[ebp+8] ;//dest
mov eax,[ebp+12] ;//src
mov ecx,[ebp+16] ;//len
shr ecx,2
test ecx,ecx ;//长度为0,直接返回0
jz A01
;===================
A00:
push DWORD PTR [eax]
pop DWORD PTR [edx]
add eax,4
add edx,3
dec ecx
jnz A00
;===================
mov BYTE ptr [edx],0 ;//清理最后一个无用字节
A01:
mov eax,edx
sub eax,[ebp+8] ;//RGB有效字节数,作为返回值
leave
ret 12
}
}
#include <stdio.h>
int _stdcall RGBATORGB(char *dest, char *src, unsigned int len);
int main()
{
char *Src="abcdefghijklmnoabcdefghijklmnoabcdefghijklmnoabcdefghijklmno";
char Dst[64]={0};
unsigned int len,lenrgb;
len = strlen(Src);
lenrgb=RGBATORGB(Dst,Src,len);
printf("RGB_LEN =%d\nRGB_BYTE=%s\n",lenrgb,Dst);
return 0;
}
//==================================================================
int __declspec(naked) _stdcall RGBATORGB(char *dest, char *src, unsigned int len)
{
_asm
{
push ebp
mov ebp,esp
push esi
push edi
mov edi,[ebp+8] ;//dest
mov esi,[ebp+12] ;//src
mov ecx,[ebp+16] ;//len
;===================
shr ecx,2
cld
A00:
movsd
dec edi
loop A00
;===================
mov BYTE ptr [edi],0 ;//清理最后一个无用字节
mov eax,edi
sub eax,[ebp+8] ;//RGB有效字节数,作为返回值
pop edi
pop esi
leave
ret
}
}
#include <stdio.h>
void RGBAToRGB16(char *d,char *s)
{
//s=abcdefghijklmnop
//d=abcefgijdmnoplhd
//前12个为RGB有效字节,即abcefgijdmno
/* 128 bits mask struct */
//__declspec(align(16)) char \
//mask[16]={0,1,2,4,5,6,8,9,10,12,13,14,15,11,7,3};
__declspec(align(16)) unsigned int \
mask[4]={0x04020100,0x09080605,0x0e0d0c0a,0x03070b0f};
_asm
{
mov esi,s
mov edi,d
movaps xmm7, mask
movdqu xmm0,[esi] /* load src */
pshufb xmm0, xmm7 /* bytes swap */
movdqu [edi], xmm0 /* store dest */
emms
}
}
void RGBAToRGB(char *dest, char *src)
{
unsigned int i,j,len = strlen(src),lenrest=0;
char *s = src ;
char *d = dest;
len&=~3;//len为四字节的倍数
lenrest=len&0xf; //剩余0~15字节
len>>=4;
for(i=0;i<len;i++)
{
RGBAToRGB16(d,s);
d+=12;
s+=16;
}
d[0]=0;//注意扫尾最后的四个无用字节
//处理剩余的0~15字节
for(i=j=0;i<lenrest;i+=4,j+=3)
{
d[j]=s[i];
d[j+1]=s[i+1];
d[j+2]=s[i+2];
}
}
int main()
{
char *Src="abcdefghijklmnoabcdefghijklmnoabcdefghijklmnoabcdefghijklmno";
char Dst[64]={0};
RGBAToRGB(Dst,Src);
printf("%s\n",Dst);
return 0;
}