Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инверсия порядка битов 
:(
    Опции темы
Kallikanzarid
Дата 12.11.2008, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: нет
Всего: 3



Есть ли инструкция для инверсии порядка битов в целочисленном регистре
То есть чтобы, например, 00011001 стал 10011000.
Если нет, есть ли O(1) алгоритм, который бы это делал?

ЗЫ: про предварительно обсчитанный массив знаю, но это, ИМХО, крайняя мера.
PM MAIL   Вверх
airyashov
Дата 12.11.2008, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 2
Всего: 6



цикл с командами и промежуточным регистром
RCL
RCR


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
Mikl_
Дата 12.11.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



Цитата(Kallikanzarid)
Есть ли инструкция для инверсии порядка битов в целочисленном регистре?

Такой инструкции нет, но есть команда BSWAP, которая изменяет порядок следования байтов в 32-разрядных регистрах, конвертируя значения из вида машинного представления (младшая часть, старшая часть) в обычное представление (старшая часть, младшая часть) и наоборот 
Код
          MOV EAX,12345678h
          BSWAP EAX    ;EAX=78563412h
В вашем случае можно использовать инструкции BSF(Побитное сканирование вперед) и BTS или инструкции сдвига и логического ИЛИ
Код
         mov al,00011001b
         mov bl,128
         mov cx,8
         mov ah,0
a1:      shr al,1
          jnc a2
          or ah,bl
a2:      shr bl,1
          loop a1
; в конце цикла в AH число 100110000b


Это сообщение отредактировал(а) Mikl_ - 12.11.2008, 10:58
PM MAIL   Вверх
Kallikanzarid
Дата 12.11.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: нет
Всего: 3



Всем спасибо. Видимо, лучше всего таблицей :(
PM MAIL   Вверх
airyashov
Дата 12.11.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 2
Всего: 6



Код

mov ax,00011001b
xor bx,bx
mov cx,8
a1:
RCL al,1
RCR bl,1
loop a1
mov al,bl
     


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
Mikl_
Дата 12.11.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



Kallikanzarid, если тебе так ненавистен цикл -- не обязательно переворачивать все 32 разряда. Достаточно выявить те байты, которые содержат ненулевые значения -- пример зеркалирования одного байта
Код
mov al,00011001b
SHL al,1
RCR bl,1; очищать BL не стоит -- за 8 сдвигов его содержимое целиком заменит зеркальное содержимое AL
SHL al,1
RCR bl,1
SHL al,1
RCR bl,1
SHL al,1
RCR bl,1
SHL al,1
RCR bl,1
SHL al,1
RCR bl,1
SHL al,1
RCR bl,1
SHL al,1
RCR bl,1
mov al,bl
А вообще по бинарным операциям рекомендую, Генри Уорен "Алгоритмические трюки для программистов" (Henry Warren "Hacker's Delight")

Это сообщение отредактировал(а) Mikl_ - 12.11.2008, 11:59
PM MAIL   Вверх
Kallikanzarid
Дата 12.11.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: нет
Всего: 3



Mikl_, дело не в ненависти к циклу. Просто я сейчас проектирую систему, в которой, может быть, инверсия порядка битов станет узким местом. Поэтому мне полезно заранее узнать, будет ли эта операция быстрой. Таблицу, как оказалось, использовать невозможно (она бы занимала 17 гигов  smile ), поэтому буду использовать твой метод, с поправкой на 32-разрядные регистры.  smile 

Это сообщение отредактировал(а) Kallikanzarid - 12.11.2008, 12:02
PM MAIL   Вверх
Mikl_
Дата 12.11.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



Kallikanzarid, вот поправка на 32-разрядные регистры (а можно и 64-х и 128 разрядные)
Код
test eax,eax
     jz quit; единичных бит нет -- "облом"
     test ax,ax; проверяем 1 и 2 байт
     jz a3
     test al,al
     jz a1; проверили сразу 8 бит - ничего нет - идем далее
a2: mov ch,al
     mov cl,al
     neg cl
     and al,cl; выделили крайний справа единичный бит
  --- табличное преобразование номера бита
  --- тут делаешь свои темные делишки ---
     mov al,ch
     not cl; cl=al-1
     and al,cl; обнулили крайний справа единичный бит
     jnz a2
a1: test ah,ah
     jz a3; проверили сразу 8 бит - ничего нет - идем далее
a4: mov ch,ah
     mov cl,ah
     neg cl
     and ah,cl; выделили крайний справа единичный бит
  --- табличное преобразование номера бита
  --- добавляем к номеру бита 8
  --- тут делаешь свои темные делишки ---
     mov ah,ch
     not cl; cl=ah-1
     and ah,cl; обнулили крайний справа единичный бит
     jnz a4
a3: bswap eax; проверяем 3-ий и 4-ый байты
     test ax,ax
     jz quit
     test ah,ah; проверяем 3-ий байт
     jz a5; проверили сразу 8 бит - ничего нет - идем далее
a6: mov ch,ah
     mov cl,ah
     neg cl
     and ah,cl; выделили крайний справа единичный бит
  --- табличное преобразование номера бита
  --- добавляем к номеру бита 16
  --- тут делаешь свои темные делишки ---
     mov ah,ch
     not cl; cl=ah-1
     and ah,cl; обнулили крайний справа единичный бит
     jnz a6
     test al,al
     jz quit
a5: mov ch,al
     mov cl,al
     neg cl
     and al,cl; выделили крайний справа единичный бит
  --- табличное преобразование номера бита
  --- добавляем к номеру бита 24
  --- тут делаешь свои темные делишки ---
     mov al,ch
     not cl; cl=al-1
     and al,cl; обнулили крайний справа единичный бит
     jnz a5 
quit:
 Можно проверять также на "зеркальные" байты -- их тоже не нужно переворачивать 0000.0000 1000.0001 1100.0011 1110.0111 1111.1111 0100.0010 0110.0110 и т.д.

Это сообщение отредактировал(а) Mikl_ - 12.11.2008, 12:24
PM MAIL   Вверх
Kallikanzarid
Дата 12.11.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: нет
Всего: 3



За книгу спасибо, обязательно почитаю.

Добавлено через 3 минуты и 31 секунду
Кстати, только что пришло в голову таблично преобразовывать каждый байт по отдельности (таблица всего 255 байт), а затем инвертировать уже порядок байт с помощью BSWAP. Вижу, ты тоже что-то такое придумал. 8)

Добавлено через 10 минут и 43 секунды
Что еще лучше, такой алгоритмический подход дает возможность писать код на С++, что менее головоломно.
А вот проверять зеркальные байты - ИМХО, не лучшая идея, так как это сделать не так то просто - уж точно дольше, чем тупо извлечь из таблицы.
PM MAIL   Вверх
Mikl_
Дата 12.11.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



Kallikanzarid, для табличного преобразования содержимого регистра AL в ассемблере есть специальная инструкция XLAT 
PM MAIL   Вверх
Kallikanzarid
Дата 12.11.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: нет
Всего: 3



Буду иметь это ввиду, посмотрим, что скажет профилировщик.
PM MAIL   Вверх
DRUID3
  Дата 13.11.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 20.6.2005
Где: Kyyiv

Репутация: нет
Всего: 9



Прошу прощения что вмешиваюсь - Kallikanzarid а у вас это задача для FFT? Если да, и битреверс встал как "узкое место"(!?) то есть алгоритмы FFT не требующие битреверсной перестановки (но при этом нужен дополнительный массив по размерам равный входному)... Ну а для быстрой свертки через FFT вообще битреверсная перестановка не нужна впринципе... Или я ошибаюсь относительно ваших целей?


--------------------
Every time if you use Linux, you are joined to the communism...
практика - критерий истины ... отделенной от нас пропастью субъективного восприятия...
PM MAIL WWW Skype   Вверх
Kallikanzarid
Дата 15.11.2008, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: нет
Всего: 3



Я делаю контрол, строящий график непрерывной функции одного аргумента. Поскольку я использую его для демонстрации алгоритмов интерполяции, было бы хорошо сделать кэш. Я решил использовать бинарное дерево на массиве, в котором реверз индекса элемента соответствует положению точки на отрезке [1, ~0], а его легко отобразить на требуемый мне. То есть, обходя дерево до определенной, тривиально вычисляемой глубины, и применяя реверз, я получаю набор точек, расположенных достаточно близко, чтобы ломаная по ним хорошо приближала кривую при данном масштабе.

Я еще не проверял алгоритм на деле, так что я вполне могу ошибаться. Так, может оказаться, что я вообще не прав и все это никогда не будет работать, или что преобразование индекса в абсциссу сложнее, чем я думал, но все еще практично. Поживем - увидим.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0816 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.