реклама на сайте
подробности

 
 
> Перестановка бит в байте, получить зеркальное отображение
bbill
сообщение Nov 6 2008, 11:28
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 21-10-05
Пользователь №: 9 941



Появилась необходимость (из-за разводки) перевернуть байт:
было 0b76543210
стало 0b01234567

Можно тупо bld/bst, но хотелось бы покороче. Кто сталкивался с подобной задачей.

P.S. В поиске нашел только обсуждение о перестановке двух бит.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ARV
сообщение Nov 7 2008, 15:45
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



вот на телесистемах была пару раз ветка по этой теме (поиск рулит) - там просто перлы были! 11 тактов, кажется или даже меньше! у меня только 14...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Nov 7 2008, 21:39
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(ARV @ Nov 7 2008, 18:45) *
вот на телесистемах была пару раз ветка по этой теме (поиск рулит) - там просто перлы были! 11 тактов, кажется или даже меньше!

НЕ ВЕРЮ!
Покажите <13 на AVR...

на PIC можно за 12
Go to the top of the page
 
+Quote Post
ae_
сообщение Nov 8 2008, 10:43
Сообщение #4


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(singlskv @ Nov 8 2008, 06:39) *
НЕ ВЕРЮ!
Покажите <13 на AVR...

на PIC можно за 12

12 тактов
Код
Reverse_1:; реверс бит в байте (R4 - вход/выход)

; обмен средних бит в тетрадах
mov R17,R4
andi R17,0b10011001
sub R4,R17
swap R4
or R4,R17
; выделение четных/нечетных бит
mov R17,R4
andi R17,0b10101010
sub R4,R17
; обмен четных/нечетных бит
out SREG,R4
ror R4
lsl R17
adc R4,R17

Порядок преобразования:
a b c d e f g h C
a f g d e b c h 0
a - g - e - c - 0
- f - d - b - h 0
h - f - d - b - -
- g - e - c - - a
h g f e d c b a 0

Единственный тонкий момент: обнуление I (запрет прерываний)
С разбегу обойти его мне не удалось без добавления 13-го такта.

©argus98 - все права защищены :))
Go to the top of the page
 
+Quote Post
singlskv
сообщение Nov 8 2008, 20:22
Сообщение #5


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(ae_ @ Nov 8 2008, 13:43) *
12 тактов
Код
Reverse_1:; реверс бит в байте (R4 - вход/выход)

; обмен средних бит в тетрадах
mov R17,R4
andi R17,0b10011001
sub R4,R17
swap R4
or R4,R17
; выделение четных/нечетных бит
mov R17,R4
andi R17,0b10101010
sub R4,R17
; обмен четных/нечетных бит
out SREG,R4
ror R4
lsl R17
adc R4,R17

Порядок преобразования:
a b c d e f g h C
a f g d e b c h 0
a - g - e - c - 0
- f - d - b - h 0
h - f - d - b - -
- g - e - c - - a
h g f e d c b a 0

Единственный тонкий момент: обнуление I (запрет прерываний)
С разбегу обойти его мне не удалось без добавления 13-го такта.

Ну это не до конца честный вариант,
Код
out SREG,R4
ror R4

нужно менять на
Код
    bst     R4,0
    lsr      R4
    bld     R4,7
а это уже 13 тактов...



Кстати говоря, тк тема снова всплыла, есть небольшая модификация 13тактового алгоритма
которая позволяет отказаться от использования бита T в SREG:
Код
; 13 words / 13 cycles
;                            ;tmp=  abcdefgh
    mov     tmp2, tmp        ;tmp2= abcdefgh
    asr     tmp              ;tmp=  aabcdefg C=h
    ror     tmp2             ;tmp2= habcdefg C=h
    rol     tmp              ;tmp=  abcdefgh C=a
    rol     tmp              ;tmp=  bcdefgha
    andi    tmp2, 0b10101010 ;tmp2= h0b0d0f0
    andi    tmp,  0b01010101 ;tmp=  0c0e0g0a
    add     tmp,  tmp2       ;tmp=  hcbedgfa
    mov     tmp2, tmp        ;tmp2= hcbedgfa
    andi    tmp2, 0b01100110 ;tmp2= 0cb00gf0
    swap    tmp2             ;tmp2= 0gf00cb0
    andi    tmp,  0b10011001 ;tmp=  h00ed00a
    add     tmp,  tmp2       ;tmp=  hgfedcba

но увы все равно 13... sad.gif


Цитата(Qwertty @ Nov 8 2008, 08:27) *
Под "PIC" подразумевается 16-ая или 18-ая серии? Тогда интересно было бы взглянуть на реверс из трех инструкций...

Увы, для PIC сейчас найти не могу, а писать заново не буду, Пики я только "со словарем", потаму
как редко...
Насколько я помню, пойдет даже на 10/12 серии...,
экономия 1 такта там из-за аккамуляторной модели, типа можно сделать сдвиг и получить
в результате 2 числа одно сдвинутое а второе исходное... как то так...
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Nov 8 2008, 22:42
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(singlskv @ Nov 8 2008, 23:22) *
Увы, для PIC сейчас найти не могу, а писать заново не буду, Пики я только "со словарем", потаму
как редко...
Насколько я помню, пойдет даже на 10/12 серии...,
экономия 1 такта там из-за аккамуляторной модели, типа можно сделать сдвиг и получить
в результате 2 числа одно сдвинутое а второе исходное... как то так...

Идет даже на 10/12 серии!!! Напряжение нарастает smile.gif За 12 тактов 10/12/16/18 серии выполняют ТРИ коротких инструкции или 1,5 длинных. Как в это упаковать реверс 8 бит я не понимаю.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Nov 9 2008, 08:24
Сообщение #7


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Qwertty @ Nov 9 2008, 01:42) *
Идет даже на 10/12 серии!!! Напряжение нарастает smile.gif За 12 тактов 10/12/16/18 серии выполняют ТРИ коротких инструкции или 1,5 длинных. Как в это упаковать реверс 8 бит я не понимаю.
Конечно я имел в виду "МЦ"... smile.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- bbill   Перестановка бит в байте   Nov 6 2008, 11:28
- - =GM=   1) Если есть два свободных порта, переставить пров...   Nov 6 2008, 11:33
- - Maik-vs   Цитата(bbill @ Nov 6 2008, 14:28) Появила...   Nov 6 2008, 11:39
- - Сергей С.   Цитата(bbill @ Nov 6 2008, 16:28) Появила...   Nov 6 2008, 11:50
- - Vlad219i   Цитата(bbill @ Nov 6 2008, 15:28) Можно т...   Nov 6 2008, 12:45
- - МП41   Эх, не хватает однако подобной аппаратной команды....   Nov 6 2008, 13:08
- - CDT   Цитата(bbill @ Nov 6 2008, 14:28) Появила...   Nov 6 2008, 14:32
- - _Pasha   Кодrol tmp1 ror tmp2 ;........rept 8 раз А в чем п...   Nov 6 2008, 14:42
- - bbill   Спасибо Maik-vs. И короче, и главное быстрее. А ещ...   Nov 6 2008, 14:46
|- - Maik-vs   Цитата(bbill @ Nov 6 2008, 17:46) Спасибо...   Nov 7 2008, 12:42
- - Aleksandr Baranov   Bit Order   Nov 6 2008, 16:03
- - zombi   И всетаки мне кажется если скорость важнее то лучш...   Nov 7 2008, 14:22
- - ARV   Цитата(singlskv @ Nov 8 2008, 00:39) НЕ В...   Nov 7 2008, 21:45
- - Qwertty   Цитата(singlskv @ Nov 8 2008, 00:39) на P...   Nov 8 2008, 05:27
|- - _Pasha   Цитата(Qwertty @ Nov 8 2008, 08:27) А для...   Nov 8 2008, 07:10
- - ae_   Цитата(Qwertty @ Nov 9 2008, 07:42) Идет ...   Nov 9 2008, 00:47


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 04:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01467 секунд с 7
ELECTRONIX ©2004-2016