Вот это код переписанный руками:
ssize_t xor_read (int f, void* p, size_t l)
{
int rb = read(f, p, l);
uchar* q=(uchar*)p;
int c = rb;
while( 0 <= --c ) {
_asm push eax
_asm push ebx
_asm push edx
_asm xor edx, edx
_asm mov eax, dword ptr [q]
_asm mov dl, byte ptr [eax]
_asm mov eax, edx
_asm mov ebx, eax
_asm shl eax, 4
_asm shr ebx, 4
_asm or eax, ebx
_asm xor eax, 12
_asm mov ebx, dword ptr [q]
_asm mov byte ptr [ebx], al
_asm pop edx
_asm pop ebx
_asm pop eax
++q;
}
return rb;
}
Если верить профайлеру VTune работает быстрее чем вот этот:
#define process( ch ) (uchar)(((ch<<4)|(ch>>4))^12)
ssize_t xor_read (int f, void* p, size_t l)
{
int rb = read(f, p, l);
uchar* q=(uchar*)p;
int c = rb;
while( 0 <= --c ) {
*q = process( *q );
/*
0069F126 mov eax,dword ptr [q]
0069F129 movzx ecx,byte ptr [eax]
0069F12C shl ecx,4
0069F12F mov edx,dword ptr [q]
0069F132 movzx eax,byte ptr [edx]
0069F135 sar eax,4
0069F138 or ecx,eax
0069F13A xor ecx,0ch
0069F13D mov edx,dword ptr [q]
0069F140 mov byte ptr [edx],cl
*/
++q;
};
return rb;
}
Что не так? (msvc 2008)