Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема NUXI (преобразование endian) [D6, WinXP]


Rocket ©   (2004-11-20 09:45:00) 

Сделал поиск по инету.
Ничего не нашёл лучше, чем.


   Function Reverse (N:LongInt) : LongInt ;
    Var B0, B1, B2, B3 : Byte ;
   Begin
       B0 := N Mod 256 ;
       N  := N Div 256 ;
       B1 := N Mod 256 ;
       N  := N Div 256 ;
       B2 := N Mod 256 ;
       N  := N Div 256 ;
       B3 := N Mod 256 ;
       Reverse := (((B0 * 256 + B1) * 256 + B2) * 256 + B3) ;
   End ;


или более эффективная версия:


   Function Reverse (N:LongInt) : LongInt ;
    Var B0, B1, B2, B3 : Byte ;
   Begin
       B0 := (N AND $000000FF) SHR  0 ;
       B1 := (N AND $0000FF00) SHR  8 ;
       B2 := (N AND $00FF0000) SHR 16 ;
       B3 := (N AND $FF000000) SHR 24 ;
       Reverse := (B0 SHL 24) OR (B1 SHL 16) OR (B2 SHL 8) OR (B3 SHL 0) ;
   End ;


Есть ещё эффективнее что-нибудь?


Rocket   (2004-11-20 11:23:00) [1]

OK!


MBo   (2004-11-20 11:19:00) [2]

>И можно полностью ф-цию, которая делает то, что записано в [7]?
Как уже сказали, ROR eax,16


Anatoly Podgoretsky   (2004-11-20 11:18:00) [3]

В [9] в один ход


Rocket   (2004-11-20 11:12:00) [4]


> Раз про АСМ, то тебе прямой путь на Интел за документацией

Да нет. Просто показалось, что с функцией на асм будет быстрее, хоть и в три хода.

И можно полностью ф-цию, которая делает то, что записано в [7]?

А то я что-то путаться начинаю уже :)


Anatoly Podgoretsky   (2004-11-20 11:06:00) [5]

Раз про АСМ, то тебе прямой путь на Интел за документацией, копия есть на моем сайте


Anatoly Podgoretsky   (2004-11-20 11:05:00) [6]

ROR/ROL r,n


Anatoly Podgoretsky   (2004-11-20 11:03:00) [7]

Rocket ©   (20.11.04 10:57) [7]
Нет, мат в три хода


Rocket   (2004-11-20 10:57:00) [8]

ОК. Спасибо ещё раз.

А вот допустим у меня записано так.

03 04 01 02

А должно быть

01 02 03 04

Мат одним ходом возможен? :)


MBo   (2004-11-20 10:53:00) [9]

>XCHG ah, al
Ууу, и правда ;)


Anatoly Podgoretsky   (2004-11-20 10:49:00) [10]

Rocket ©   (20.11.04 10:37) [3]
XCHG ah, al


MBo   (2004-11-20 10:47:00) [11]

>А чтоб в word'ах менять - так же?
есть функция Swap, или через сдвиги/or можно, или так:
mov ax, w (movzx eax,w)
bswap eax
shr eax,16


Rocket   (2004-11-20 10:37:00) [12]


> MBo ©   (20.11.04 10:28) [2]

Круто, Спасибо!
А чтоб в word'ах менять - так же?


MBo   (2004-11-20 10:28:00) [13]


function Reverse(N: Integer): Integer;
asm
 bswap eax
end;

procedure TForm1.Button1Click(Sender: TObject);
var n: Integer;
begin
 n := $01020304;
 n := Reverse(N);
 Caption := IntToHex(N, 8);
end;


Rocket   (2004-11-20 10:15:00) [14]

Может то же самое на asm? Сам перевести не смогу, нужна помощь.


Наверх

Титульная страница Поиск, карта сайта Написать письмо