Цитата(zltigo @ Jan 1 2008, 20:53)

3. Для ARM достаточно приличный код получается:
Код
#define ntohl(x) htonl(x)
#pragma inline=forced
__arm ulong htonl( ulong n );
__arm ulong htonl( ulong n )
{
ulong tmp;
tmp = n ^ ( (n << 16) | (n >> 16) );
tmp &= ~0x00FF0000;
n = ( n << 24 )|( n >> 8 );
n ^= ( tmp >> 8 );
return( n );
}
Если смотреть с точки зрения меньших затрат на понятие кода

проще вот так
Код
UINT32 swap32(UINT32 n32)
{
UINT8 *dest = (UINT8 *)&n32;
UINT8 src[sizeof(UINT32)/sizeof(UINT8)];
src[0] = dest[3];
src[1] = dest[2];
src[2] = dest[1];
src[3] = dest[0];
return (*(UINT32 *)&src);
}
...но подставив ЭТО вместо SWAP32 имею ту же проблему....
в Ассемблерном виде выгдядит вот так:
Код
\ In segment CODE, align 4, keep-with-next
18 UINT32 swap32(UINT32 n32)
19 {
\ swap32:
\ 00000000 01B4 PUSH {R0}
\ 00000002 81B0 SUB SP,SP,#+4
20 UINT8 *dest = (UINT8 *)&n32;
\ 00000004 01A8 ADD R0,SP,#+4
\ 00000006 0100 MOVS R1,R0
21 UINT8 src[sizeof(UINT32)/sizeof(UINT8)];
22
23 src[0] = dest[3];
\ 00000008 6846 MOV R0,SP
\ 0000000A CA78 LDRB R2,[R1, #+3]
\ 0000000C 0270 STRB R2,[R0, #+0]
24 src[1] = dest[2];
\ 0000000E 6846 MOV R0,SP
\ 00000010 8A78 LDRB R2,[R1, #+2]
\ 00000012 4270 STRB R2,[R0, #+1]
25 src[2] = dest[1];
\ 00000014 6846 MOV R0,SP
\ 00000016 4A78 LDRB R2,[R1, #+1]
\ 00000018 8270 STRB R2,[R0, #+2]
26 src[3] = dest[0];
\ 0000001A 6846 MOV R0,SP
\ 0000001C 0A78 LDRB R2,[R1, #+0]
\ 0000001E C270 STRB R2,[R0, #+3]
27
28 return (*(UINT32 *)&src);
\ 00000020 6846 MOV R0,SP
\ 00000022 0068 LDR R0,[R0, #+0]
\ 00000024 02B0 ADD SP,SP,#+8
\ 00000026 7047 BX LR ;; return
Забыл добавить

Код пишется под ucOS-II. Самое интересное, что остальные задачи не зависают, только TCPIP, имеющая вышеприведенный код
Цитата(zltigo @ Jan 1 2008, 20:53)

2. Функции выполняющие вышеописанное "правильно" называются htonl() / ntohl() Network-TO-Host-Long /
Host-TO-Network-Long сответственно и встречаются в большинстве библиотек.
А что, мои функции выполняют ЭТО не правильно???