powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите с Ассемблером
17 сообщений из 17, страница 1 из 1
Помогите с Ассемблером
    #33312087
Андрей Сергеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такая проблема, считываю из бинарного файла 4 байтное число в переменную
p:integer;
требуется код ассемблера, переворачивающий БАЙТЫ в этом числе, то есть чтобы на выходе была переменная p1:integer в которой хранилась бы перевернутая информация.
Пишу на делфи, помогите пожалуйста сделать такую ассемблерную вставку.
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33312161
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, Андрей!
Ты пишешь:

Андрей

АС> Такая проблема, считываю из бинарного файла 4 байтное число в переменную
p::integer;
АС> требуется код ассемблера, переворачивающий БАЙТЫ в этом числе,
АС> то есть чтобы на выходе была переменная p1:integer в которой
АС> хранилась бы перевернутая информация.
АС> Пишу на делфи, помогитеЧто значит "перевёрнутая" ?
Да и нахрена тут ассемблер-то?

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33312377
SLab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
команда xchg ah,al обменяет местами значения регистров ah и al
или как вариант
xor ah,al
xor al,ah
xor ah,al
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33313252
Uncle_Joe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, ассемблер тут, действительно, может и не стоит городить...

Если правильно понял задачу, т.е, из числа $F1F2F3F4 получить число $F4F3F2F1, то можно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
function ReverseBytes (A: DWord): DWord;
begin
  Result :=
     ((A and $000000FF) shl  24 ) or
     ((A and $0000FF00) shl  8 ) or
     ((A and $00FF0000) shr  8 ) or
     ((A and $FF000000) shr  24 );
end;
или даже так :-)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
function ReverseBytes (A: DWord): DWord;
type
  TDword = record
    b1,b2,b3,b4: Byte;
  end;
begin
  TDword(Result).b1 := TDword(A).b4;
  TDword(Result).b2 := TDword(A).b3;
  TDword(Result).b3 := TDword(A).b2;
  TDword(Result).b4 := TDword(A).b1;
end;
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33313339
И волки целы, и пастух -- герой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 {. . . Тут обычный Дельфи-код}
  asm
    MOV EAX, p
    BSWAP EAX
    MOV p1, EAX
  end;
 {. . . И тут тоже. А между ними -- вставочка!}
То есть, и Дельфи, и немножко Ассемблера. BSWAP -- инструкция, переворачивающая байты , как и просили. Быстро и красиво. И по существу.
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33313342
Uncle_Joe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насчет "красиво" - да. "На ассемблере" - да. А вот насчет "быстро" - нет :)
Это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
function ReverseBytes (A: DWord): DWord;
begin
  Result :=
     ((A and $000000FF) shl  24 ) or
     ((A and $0000FF00) shl  8 ) or
     ((A and $00FF0000) shr  8 ) or
     ((A and $FF000000) shr  24 );
end;
немного быстрее ;-) А если его еще оптимизировать - вжжжик :)
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33313344
Uncle_Joe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уточню, что нужно предложенную мной функцию либо заинлайнить (если позволяет конкретная реализация языка), либо не использовать в качестве функции, а все манипуляции вставить непосредственно в код. Тогда она действительно будет быстрее медленной операции BSWAP.
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33313499
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Uncle_Joeнемного быстрее ;-) А если его еще оптимизировать - вжжжик :)жжошш
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33313828
Начнём с общечеловеческих ценностей, с самой простой из них, но не такой уж доступной: получить прямой ответ на поставленный вопрос. Я такой ответ дал, а Uncle_Joe? Ещё и сказки рассказывает про "медленную операцию BSWAP"! Да она быстрее PUSH или POP выполняется!

Теперь ближе к делу. Delphi транслирует чудо-код Uncle_Joe в следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
push    esi
. . .
mov     esi,eax
and     esi,0FFh
shl     esi,18h
mov     edx,eax
and     edx,0FF00h
shl     edx, 8 
or      esi,edx
mov     edx,eax
and     edx,0FF0000h
shr     edx, 8 
or      esi,edx
and     eax,0FF000000h
shr     eax,18h
or      esi,eax
mov     eax,esi
. . .
pop     esi

Вся эта орава (не в одном экземпляре, естественно!) выполяется за 17036 циклов процессора. Моего компьютера, в частности. А крошка BSWAP (в том же количестве штук, что и код-оппонент) -- всего за 3988. Так кто тут быстрее? Даже если использовать ECX, который сохранять не требуется, вместо ESI, то всё равно время составляет 15000 циклов. И это -- без оформления в виде процедуры, что ещё больше увеличит время выполнения. Вот так-то...
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33314684
mazay24
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за помощь, на практике не заметил существенных отличий в скорости этих двух предложенных вариантов. Выбрал ассемблер, все работает щас отлично )
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33315898
Тупой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напостили пипец :) А парень всего-то хотел Intel"oвскую записть представить слева на право Ну я ли тупой после этого
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33315959
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, Тупой!
Ты пишешь:

Тупой Т> Напостили пипец :)
Т> А парень всего-то хотел Intel"oвскую записть представить слева на право
А куй его знает, чего именно он хотел.
Он так и не признался...

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33316243
mazay24
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотел в big endian перевести я
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33317140
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дядя Серёжа........... выполяется за 17036 циклов процессора. Моего компьютера, в частности. А крошка BSWAP (в том же количестве штук, что и код-оппонент) -- всего за 3988. .........

Простите...А "циклы процессора" Вы енто хде узрели ? Предлагаю слать прямиком в интел... А то они один да один такт (x486)...А Вы им сразу 3988 и точка :)

По скорости - тут и разговаривать глупо. Данная команда (BSWAP) быстрее чем всё то, что написано как альтернатива...см. доку по командам на Ваш проц...


с уважением
(круглый)
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33317751
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0 Дядя Серёжа........... выполяется за 17036 циклов процессора. Моего компьютера, в частности. А крошка BSWAP (в том же количестве штук, что и код-оппонент) -- всего за 3988. .........

Простите...А "циклы процессора" Вы енто хде узрели ? Предлагаю слать прямиком в интел... А то они один да один такт (x486)...А Вы им сразу 3988 и точка :)

По скорости - тут и разговаривать глупо. Данная команда (BSWAP) быстрее чем всё то, что написано как альтернатива...см. доку по командам на Ваш проц...


с уважением
(круглый)

Ну вообще-то измерение истинной производительности куска кода делается на основании многократной прогонки. Оттуда и появилась такая цифра. Надо просто разделить на кол-во прогонок.
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33317827
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LelikkНу вообще-то измерение истинной производительности куска кода делается на основании многократной прогонки. Оттуда и появилась такая цифра. Надо просто разделить на кол-во прогонок.

Осталось выяснить маленьчкие весчи...
1) Ваша фамилия интел ? Вот они лохи утверждают что за один такт выполняеться данная команда :) .
2) В понятие "истинная производительность" Вы, как я пологаю включили время отсосанное ран-тайм драйверами и менагером задач ? Кхм, тогда причём тут "циклы процессора" ? Так и писали бы, непонятно замеренное время, между 1000 прогонами данного кода, предположили что все драйвера работали честно, без глюкаво и быстро...Либо (если Вы проверяете честность производителя камня): тестировали под досом в реал моде - убедились, что не врёт усякий интелл. Либо: написали своё ядро, перевели в протэкшен моде - результат превзошёл все ожидания, буржуи оказались правы ! ну и т.д..


ну прям как дети, ей богу...
с уважением
(круглый)
ЗЫ.................
...
Рейтинг: 0 / 0
Помогите с Ассемблером
    #33318661
kolobok0А "циклы процессора" Вы енто хде узрели ?
Хотя бы тут узрел:
Copyright © 1996, 2000 by Agner Fog
The Pentium family of processors have an internal 64 bit clock counter which can be read into EDX:EAX using the instruction RDTSC (read time stamp counter). This is very useful for testing exactly how many clock cycles a piece of code takes.

kolobok0Предлагаю слать прямиком в интел
Там уже в курсе, к примеру, даже о том, что для 486-го понятие "такта" было уместно, для машин P5 (Pentium Plain and Pentium MMX) -- так-сяк, а вот для P6 (от Pentium Pro до самого упора) -- уже никак! Там микрооперации, да и подсчёт не столь тривиален...
Особо точное значение в микрооперациях никому и не требовалось, а вполне достоверные и наглядные данные по методике measuring the number of clock cycles получены были. Меня они убедили.
Clock cycles -- может и не "циклы процессора", а "циклы [внутренних] часов". По сути, это были "у. е." для данного случая.
И 3988 циклов (или "циклов"?) я не "сразу", а с изрядного количества взял. О чём внятно упомянул. Ну, никак не заметить времени выполнения одной инструкции -- один "такт", по Колобку, не выходит.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите с Ассемблером
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]