Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2645
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2333
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1351
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1423
Дата выхода:07.03.2011, 04:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:217 / 66
Вопросов / ответов:1 / 4

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



Вопрос № 182356:

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

Отправлен: 02.03.2011, 03:24
Вопрос задал: ANATOLY FIRST (4-й класс)
Всего ответов: 4
Страница вопроса »


Отвечает Павел Юрьевич (10-й класс) :
Здравствуйте, ANATOLY FIRST!

Можно вот так:
Код:
        mov ecx,50 /* Количество пар */
mov eax,0
next: rol word ptr [buffer+eax*2],8
inc eax
dec ecx
jnz next
Добавлено пропущенное word ptr
Будьте внимательны...
-----
∙ Отредактировал: Лысков Игорь Витальевич (Старший модератор)
∙ Дата редактирования: 02.03.2011, 13:27 (время московское)

Ответ отправил: Павел Юрьевич (10-й класс)
Ответ отправлен: 02.03.2011, 07:20
Номер ответа: 266058
Россия, Челябинск
ICQ # 197232777

Оценка ответа: 1
Комментарий к оценке:
Использовал такой же алгоритм, но он не работает.

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 266058 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Ответ поддержали (отметили как правильный): 1 чел.



    Отвечает coremaster1 (Профессионал) :
    Здравствуйте, 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, 14:05 (время московское)

    Ответ отправил: coremaster1 (Профессионал)
    Ответ отправлен: 02.03.2011, 08:29
    Номер ответа: 266060
    Россия, Москва

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 266060 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Отвечает Кривенко Евгений Владимирович (4-й класс) :
    Здравствуйте, ANATOLY FIRST!

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

    _cikl:
    lodsw
    xchg al,ah
    stosw
    loop _cikl
    -----
    COGITO ERGO SUM

    Ответ отправил: Кривенко Евгений Владимирович (4-й класс)
    Ответ отправлен: 02.03.2011, 12:46
    Номер ответа: 266062
    Украина, Евпатория
    Тел.: +380508277782
    Mail.ru-агент: eukr7@mail.ru
    Абонент Skype: EuKrEuA

    Оценка ответа: 5
    Комментарий к оценке:
    Спасибо. Все работает.

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 266062 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Ответ поддержали (отметили как правильный): 1 чел.



    Отвечает Лысков Игорь Витальевич (Старший модератор) :
    Здравствуйте, 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

    -----
    Люби своего ближнего, как самого себя

    Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
    Ответ отправлен: 02.03.2011, 12:56
    Номер ответа: 266064
    Украина, Кировоград
    Тел.: +380957525051
    ICQ # 234137952
    Mail.ru-агент: igorlyskov@mail.ru

    Оценка ответа: 5

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 266064 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Ответ поддержали (отметили как правильный): 2 чел.



    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное