unsigned char buf[] = {1,2,3,4};
int res;
//方式1
__asm
{
movzx eax,byte ptr [buf]
movzx ebx,byte ptr [buf+1]
movzx ecx,byte ptr [buf+2]
movzx edx,byte ptr [buf+3]
shl eax,18h
shl ebx,10h
shl ecx,8
or eax,ebx
or eax,ecx
or eax,edx
mov dword ptr [res],eax
}
//res得到0x01020304
//方式2
__asm
{
mov eax, DWORD PTR [buf]
rol ax, 8
rol eax, 16
rol ax, 8
mov res, eax
}
//res得到0x01020304
//方式3
__asm
{
mov eax, DWORD PTR [buf]
xchg al, ah
rol eax, 16
xchg al, ah
mov res, eax
}
//res得到0x01020304
方式1、方式2效率基本相当,方式3最慢,大概慢25%。
问题:何以导致第三那种方式最慢?最好的办法是哪种?有没有其他更好的办法?
------解决方案--------------------------------------------------------
以前看的P5优化的书上说寄存器最好交错使用
------解决方案--------------------------------------------------------
mov eax, dword ptr[buf]
bswap eax
mov res, eax