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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Перестановка бит в байте, получить зеркальное отображение
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
=GM=
сообщение Nov 6 2008, 11:33
Сообщение #2


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



1) Если есть два свободных порта, переставить провода, как надо: выдал байт, считал перекодированный байт.

2) Если есть свободная память: перекодировочная таблица на 256 байт.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Nov 6 2008, 11:39
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(bbill @ Nov 6 2008, 14:28) *
Появилась необходимость (из-за разводки) перевернуть байт:
было 0b76543210
стало 0b01234567

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

P.S. В поиске нашел только обсуждение о перестановке двух бит.

Код
; 13 words / 13 cycles
; tmp= abcdefgh
    mov     tmp2,tmp; tmp2= abcdefgh
    andi     tmp2,0b01010101; tmp2= 0b0d0f0h
    andi     tmp, 0b10101010; tmp=  a0c0e0g0
    bst     tmp2,0; T=h
    lsr     tmp2 ; tmp2= 00b0d0f0
    bld     tmp2,7; tmp2= h0b0d0f0
    lsl     tmp ; tmp=  0c0e0g00 C=a
    adc     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


так длинно? тогда в сад в порт

Сообщение отредактировал Maik-vs - Nov 6 2008, 11:42
Go to the top of the page
 
+Quote Post
Сергей С.
сообщение Nov 6 2008, 11:50
Сообщение #4





Группа: Новичок
Сообщений: 9
Регистрация: 15-02-08
Пользователь №: 35 076



Цитата(bbill @ Nov 6 2008, 16:28) *
Появилась необходимость (из-за разводки) перевернуть байт:
было 0b76543210
стало 0b01234567

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

P.S. В поиске нашел только обсуждение о перестановке двух бит.


Я когда такое делал, особо не задумывался, про bld/bst не знал, да и задачи экономии ресурсов не стояло. Поэтому получилась такая программа на C. (листинг после компиляции в WinAVR)

Код
static const uint8_t REVERT_NIBBLE[] =
{
    0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
    0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf
};

uint8_t
Revert_Byte(uint8_t Data)
{
4ea:    98 2f           mov    r25, r24
4ec:    92 95           swap    r25
4ee:    9f 70           andi    r25, 0x0F; 15
4f0:    ed e4           ldi    r30, 0x4D; 77
4f2:    f1 e0           ldi    r31, 0x01; 1
4f4:    df 01           movw    r26, r30
4f6:    a9 0f           add    r26, r25
4f8:    b1 1d           adc    r27, r1
4fa:    8f 70           andi    r24, 0x0F; 15
4fc:    e8 0f           add    r30, r24
4fe:    f1 1d           adc    r31, r1
500:    80 81           ld    r24, Z
502:    82 95           swap    r24
504:    80 7f           andi    r24, 0xF0; 240
506:    9c 91           ld    r25, X
508:    89 2b           or    r24, r25
    return((REVERT_NIBBLE[Data >> 4]) | ((REVERT_NIBBLE[Data & 0x0F] << 4)));
}
50a:    99 27           eor    r25, r25
50c:    08 95           ret


IMHO на асме с bld/bst будет и короче и быстрее smile.gif
Go to the top of the page
 
+Quote Post
Vlad219i
сообщение Nov 6 2008, 12:45
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 13-03-06
Из: Москва
Пользователь №: 15 204



Цитата(bbill @ Nov 6 2008, 15:28) *
Можно тупо bld/bst, но хотелось бы покороче. Кто сталкивался с подобной задачей.


Код
            ldi    cntreg,8
l1:        rol    tmp
            ror    tmp2
            dec    cntreg
            brne    l1


Покороче, но оч медленно. На выходе в tmp2 имеем перевертыш. Ну и регистры почем зря используем. :-)
Go to the top of the page
 
+Quote Post
МП41
сообщение Nov 6 2008, 13:08
Сообщение #6


4 синих кубика
****

Группа: Участник
Сообщений: 526
Регистрация: 19-09-08
Из: полупроводника, металла и стекла
Пользователь №: 40 326



Эх, не хватает однако подобной аппаратной команды. Можно сделать, чтобы побыстрее работало, но больше кода займёт.
Восемь раз вподряд фрагмент:
rol reg1
ror reg2


--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
Go to the top of the page
 
+Quote Post
CDT
сообщение Nov 6 2008, 14:32
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 303
Регистрация: 3-03-05
Пользователь №: 3 044



Цитата(bbill @ Nov 6 2008, 14:28) *
Появилась необходимость (из-за разводки) перевернуть байт:
было 0b76543210
стало 0b01234567

А если подумать и посчитать?
Код
;==============================================
;РАЗВОРОТ БАЙТА  7-0 в 0-7
;stable - время выполнения не зависит от данных

;---------------------------------------------------------------
; 16 words 18 clk stable (минус rjmp или ret)

M31:    bst    rTmp,0
    bld    rTmpH,7

    bst    rTmp,1
    bld    rTmpH,6

    bst    rTmp,2
    bld    rTmpH,5

    bst    rTmp,3
    bld    rTmpH,4

    bst    rTmp,4
    bld    rTmpH,3

    bst    rTmp,5
    bld    rTmpH,2

    bst    rTmp,6
    bld    rTmpH,1

    bst    rTmp,7
    bld    rTmpH,0
        rjmp M31


;-------------------------------------------------------------
; 5 words 42 clk stable (минус rjmp или ret)
M21:       ldi    rCnt,8
l1:        rol    rTmp
            ror    rTmpH
            dec    rCnt
            brne    l1
      rjmp    M21


;--------------------------------------------------------------
; 4 word's 32 clk stable
    ldi    rTmpH,1
M1:    lsr    rTmp
    rol    rTmpH
    brcc    M1


Выбирайте, что дороже: код, время и стабильность времени выполнения или время копирования одинаковых строк кода в редакторе.
AVR Studio легко позволяет почти все проверить и измерить, если не лениться.smile.gif


--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 6 2008, 14:42
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Код
rol tmp1
ror tmp2
;........rept 8 раз

А в чем проблема-то? Самый оптимальный вариант ведь...
А для чего это все? Константами низзя обойтись ?
Go to the top of the page
 
+Quote Post
bbill
сообщение Nov 6 2008, 14:46
Сообщение #9


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

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



Спасибо Maik-vs. И короче, и главное быстрее. А еще короче можешь biggrin.gif

Всем остальным спасибо за участие.

P.S. Что bld/bst, что ror/rol, та же пара регистров и те же 16 тактов. Циклы не считаем.
Мне в данном случае важнее скорость.
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Nov 6 2008, 16:03
Сообщение #10


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

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Bit Order


--------------------
ASB
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Nov 7 2008, 12:42
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(bbill @ Nov 6 2008, 17:46) *
Спасибо Maik-vs. И короче, и главное быстрее. А еще короче можешь biggrin.gif


Да не за что, это даже не моё. Где-то пробегало в конфе, дай, думаю, положу в заначку - пригодится. Вот, пригодилось smile.gif
Go to the top of the page
 
+Quote Post
zombi
сообщение Nov 7 2008, 14:22
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



И всетаки мне кажется если скорость важнее то лучший вариант это таблица заранее перевернутых байтов и LPM
Go to the top of the page
 
+Quote Post
ARV
сообщение Nov 7 2008, 15:45
Сообщение #13


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

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



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


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


дятел
*****

Группа: Свой
Сообщений: 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
ARV
сообщение Nov 7 2008, 21:45
Сообщение #15


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

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



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

на PIC можно за 12
да я не утверждаю - это скорее эмоции от впечатления - были какие-то просто поразившие меня виртуозности! поиском можно найти в архиве телесистем - за последние месяца 4 не один раз всплывали темы...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 15:49
Рейтинг@Mail.ru


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