Консультация № 182356
02.03.2011, 03:24
55.15 руб.
0 13 4
Здравствуйте! Прошу помощи в следующем вопросе:
Существует массив данных, например buffer db 100 dup (?). Какой лучше всего оптимальный цикл использовать с целью перестановки местами двух соседних байтов после его заполнения?. например "абвг" после обработки имело значение "багв" ?

Обсуждение

Неизвестный
02.03.2011, 07:20
общий
02.03.2011, 13:27
это ответ
Здравствуйте, ANATOLY FIRST!

Можно вот так:
Код:
         mov ecx,50 /* Количество пар */
mov eax,0
next: rol word ptr [buffer+eax*2],8
inc eax
dec ecx
jnz next
1
Использовал такой же алгоритм, но он не работает.
Неизвестный
02.03.2011, 08:29
общий
02.03.2011, 14:05
это ответ
Здравствуйте, ANATOLY FIRST!
Чтобы минимизировать количество итераций можно обрабатывать сразу несколько пар байт. По две пары на 32-битных машинах, и по четыре на 64-битных.
Код:

mov ecx, 0
next: mov eax, dword ptr [buffer + ecx*4]
mov edx, eax
shl eax, 8
and eax, 0ff00ff00h
and edx, 0ff00ff00h
shr edx, 8
or eax, edx
mov dword ptr [buffer + ecx*4], eax
inc ecx
cmp ecx, 25
jb next
Неизвестный
02.03.2011, 12:45
общий
Благодарю за ответ но предложенный алгоритм вместо БАГВ (С1 С0 С3 С2) выдает ВБ (00 С2 С1 00 ).
Неизвестный
02.03.2011, 12:46
общий
это ответ
Здравствуйте, ANATOLY FIRST!

mov ecx,[sizebufer] ;размер буфера
shr ecx,1
lea esi,[bufer]
mov edi,esi

_cikl:
lodsw
xchg al,ah
stosw
loop _cikl
5
Спасибо. Все работает.<br>
Неизвестный
02.03.2011, 12:52
общий
Использовал такой же алгоритм, но он не работает.

Что значит не работает? Что конкретно не работает?
давно
Посетитель
7438
7205
02.03.2011, 12:56
общий
это ответ
Здравствуйте, ANATOLY FIRST!
Хочу предложить вариант с MMX.
При этом, наши данные должны быть выровнены на границе 8 байт и их число должно быть кратно 8
Например, для 13*8=104 байт:
Код:

xor edi,edi
next:
movq mm0, qword ptr buffer[edi*8]
movq mm1,mm0
psllw mm0,8
psrlw mm1,8
por mm0,mm1
movq qword ptr buffer[edi*8],mm0
inc edi
cmp edi, 13
jb next
emms
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
02.03.2011, 13:00
общий
ANATOLY FIRST, ответ Павла Юрьевича таки лучше моего, он использует меньше регистров да и код меньше и по таймингам и по байтам. Вы написали что у вас он не работает! Уточните пожалуйста в каком формате у вас записаны "абвг", если юникод, тогда:
mov ecx,50 /* Количество пар юникода */
mov eax,0
next: rol [buffer+eax*4],16
add eax,2
sub ecx,2
jnz next
давно
Посетитель
7438
7205
02.03.2011, 13:04
общий
Вы забыли уточнить:
Код:
rol word ptr[buffer+eax*2],8

Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
02.03.2011, 13:07
общий
Не стоит сразу рубить с плеча, ставить единицы...
Есть же мини-форум... Все непонятки сначала надо выяснить, а потом уже оценивать...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
02.03.2011, 13:10
общий
ТОЧНО!
rol word ptr[buffer+eax*2],8

ANATOLY FIRST вы не уточнили на каком ASMе вы пишете. Я на FASM: rol word[buffer+eax*2],8
давно
Старший Модератор
31795
6196
02.03.2011, 13:21
общий
Цитата: 363839
вы не уточнили на каком ASMе вы пишете

Цитата: №182290
Формат tasm
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
02.03.2011, 13:21
общий
Адресаты:
Да, действительно, перекомпилировал с rol word ptr[buffer+eax*2],8 и все ок.
Пишу в TASM.
Касательно оценок новичек на форуме, никого не хотел обидеть, но если предложенный вариант кривой, то зачем ставить "отлично" ?
давно
Посетитель
7438
7205
02.03.2011, 14:07
общий
Я исправил Вашу программу.
Слегка ошиблись с маской...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа