Информация об изменениях

Сообщение Re: SWAP32 от 01.09.2015 11:08

Изменено 01.09.2015 11:30 Aniskin

Здравствуйте, Серж, Вы писали:

С>Есть необходимость в 32-bits слове сделать перестановку байт.


{$IFDEF CPU386}
function Swap16(AValue: Word): Word;
asm
  xchg al, ah;
end;
{$ELSE}
function Swap16(AValue: Word): Word; inline;
begin
  Result := ((AValue shr 8) and $FF) or ((AValue shl 8) and $FF00);
end;
{$ENDIF}

{$IFDEF CPU386}
function Swap32(AValue: DWORD): DWORD;
asm
  bswap eax;
end;
{$ELSE}
function Swap32(AValue: DWORD): DWORD; inline;
begin
  Result := (Swap16(AValue shr 16) and $FFFF) or ((Swap16(AValue) shl 16) and $FFFF0000);
end;
{$ENDIF}

type
  Int64Rec = packed record
    Lo, Hi: LongWord;
  end;

{$IFDEF CPU386}
function Swap64(const AValue: int64): Int64;
asm
  mov edx,dword ptr [AValue];
  mov eax,dword ptr [AValue+4];
  bswap edx;
  bswap eax;
end;
{$ELSE}
function Swap64(const AValue: int64): Int64; inline;
begin
  Int64Rec(Result).Lo := Swap32(Int64Rec(AValue).Hi);
  Int64Rec(Result).Hi := Swap32(Int64Rec(AValue).Lo);
end;
{$ENDIF}
Re: SWAP32
Здравствуйте, Серж, Вы писали:

С>Есть необходимость в 32-bits слове сделать перестановку байт.


  код
{$IFDEF CPU386}
function Swap16(AValue: Word): Word;
asm
  xchg al, ah;
end;
{$ELSE}
function Swap16(AValue: Word): Word; inline;
begin
  Result := ((AValue shr 8) and $FF) or ((AValue shl 8) and $FF00);
end;
{$ENDIF}

{$IFDEF CPU386}
function Swap32(AValue: DWORD): DWORD;
asm
  bswap eax;
end;
{$ELSE}
function Swap32(AValue: DWORD): DWORD; inline;
begin
  Result := (Swap16(AValue shr 16) and $FFFF) or ((Swap16(AValue) shl 16) and $FFFF0000);
end;
{$ENDIF}

type
  Int64Rec = packed record
    Lo, Hi: LongWord;
  end;

{$IFDEF CPU386}
function Swap64(const AValue: int64): Int64;
asm
  mov edx,dword ptr [AValue];
  mov eax,dword ptr [AValue+4];
  bswap edx;
  bswap eax;
end;
{$ELSE}
function Swap64(const AValue: int64): Int64; inline;
begin
  Int64Rec(Result).Lo := Swap32(Int64Rec(AValue).Hi);
  Int64Rec(Result).Hi := Swap32(Int64Rec(AValue).Lo);
end;
{$ENDIF}


Update: чет я затупил, прочел техзадание через строку.