Ассемблер (ASM) для AVR в вопросах и ответах
Со сдвигом можно зациклить 
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
А накладные расходы на цикл? кажется мне, цикл здесь выиграет(выиграет ли?) пару тактов и проиграет в наглядности.
через CY прощеBOB51 писал(а):в произвольном порядке через флаг Т
Цикл тут выиграет только по размеру кода, а по производительности проиграет. По размеру ROR/ROL 8 раз или BST/BLD одинаково, но ROR/ROL проще 8 раз скопипастить, а в BST/BLD нужно каждую строчку редактировать. В любом случае написать кусок кода быстрее чем этот пост 
Кстати, обратный порядок бит не имеет никакой математической зависимости от прямого? Я не слышал (да и не соображу сейчас), а то может какие более извращённые варианты есть 
- Реклама
Для двух бит получается что-то вроде: (X1 XOR X2) AND (0b00 - (X1:X2)) OR (X1 = X2) AND (X1:X2), это даже сходу в код не переведешь...
А для 8 думаю вообще будет
А чисто математически что-то вообще не видно закономерности, кроме табличной...
О! Кстати, если не жалко 256 байт флеша, то вместо 16 ROR/ROL или BST/BLD сделать:
7 тактов вместо 16 
А для 8 думаю вообще будет
А чисто математически что-то вообще не видно закономерности, кроме табличной...
О! Кстати, если не жалко 256 байт флеша, то вместо 16 ROR/ROL или BST/BLD сделать:
Код: Выделить всё
LDI ZL,Low(Table*2)
LDI ZH,High(Table*2)
ADD ZL,R16
ADC ZH,ZERO
LPM R16,Z
...
Table: .db 0,0x80,0x40...
Вот и я о том. Но что-то мне подсказывает, что должна быть какая-нибудь трёхэтажная формулаА для 8 думаю вообще будет![]()
Gudd-Head у нас в этом деле самый головастый, ща что-нибудь выдаст
Ага, 3х этажная, логически-алгебраическая хреновина. Она точно есть, но вот искать ее думаю практического смысла нет 
Эээ, чо сразу я?
Дальше ROR/ROL моя голова думать отказывается. Ну, если только как-то SWAP приплести для спортивного интереса
Дальше ROR/ROL моя голова думать отказывается. Ну, если только как-то SWAP приплести для спортивного интереса
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Не, мне не смысл нужен, просто интересно...практического смысла нет
На практике мне ни разу не приходилось вертеть таким образом. Если надо выдать последовательный код, то просто выдаём его либо головой вперёд, либо ногами, в зависимости от ситуации. А внутри программы... для чего?
Ага, я мусолил уже его мысленно... толку нет.Ну, если только как-то SWAP приплести для спортивного интереса
Остается только горевать по поводу отсутствия побитового SWAP.
PS. Табличное программирование форэва!
PS. Табличное программирование форэва!
Docendo discimus
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
ИМХО все не "смертельно"....
PS. и swap на разок пригодится
если сделать таблицу для одной тетрады, то не пострадает ни размер (всего 16 байт), ни быстродействие ...Engineer_Keen писал(а):А для 8 думаю вообще будет
А чисто математически что-то вообще не видно закономерности, кроме табличной...
О! Кстати, если не жалко 256 байт флеша....
PS. и swap на разок пригодится
Быстродействие пострадает, даже по сравнению с обычным циклом, т.к. придётся городить огород со swap'ами. Не говоря о размере.
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
... не совсем понял что значит обычным циклом и swap в "отзеркаливании" применяется только 1 раз...ploop писал(а):Быстродействие пострадает, даже по сравнению с обычным циклом....
Байты к сожалению не всегда зеркальны по тетрадам. Даже далеко не всегда. Посему придется два раза использовать таблицу.
Docendo discimus
К таблице придется обращаться 2 раза, а это уже 14 тактов (по два раза 2xLDI Z, 2xZ+адрес+LPM) + выделение младшего полубайта адреса (2 раза) + склейка результатов 2х операций с таблицами. Больше 20 тактов и почти столько же флеша + 16 байт таблица... Неее, так не пойдет.
В общем варианта 3, все остальное ИМХО их комбинации.
1)
+минимум тактов (5),
- максимум флеша (256+6)
- ограничение на кратность начального адреса таблицы в 256 (без ограничения - 7 тактов и нужен регистр с нулем)
регистров 3 или 4
2) ROR/ROL или BST/BLD линейно
средняя скорость выполнения (16 тактов), средний размер кода, 2 регистра
3) ROR/ROL в цикле
+ минимум флеша
- самый медленный алгоритм (42 такт)
3 регистра.
В общем варианта 3, все остальное ИМХО их комбинации.
1)
Код: Выделить всё
LDI ZH,High(START*2)
MOV ZL,R16
LPM R16,Z
- максимум флеша (256+6)
- ограничение на кратность начального адреса таблицы в 256 (без ограничения - 7 тактов и нужен регистр с нулем)
регистров 3 или 4
2) ROR/ROL или BST/BLD линейно
средняя скорость выполнения (16 тактов), средний размер кода, 2 регистра
3) ROR/ROL в цикле
+ минимум флеша
- самый медленный алгоритм (42 такт)
3 регистра.
Последний раз редактировалось Engineer_Keen Вт окт 16, 2012 11:27:34, всего редактировалось 1 раз.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Вы, господин хороший, название ветки прочитали? То-то же.
Docendo discimus
Классика - это книжка "Hacker's Delight" (Алгоритмические трюки для программистов).
А на каком языке реализовывать алгоритмы - ваше дело.
Не нравиться на Си - перепишите на ассемблере.
А на каком языке реализовывать алгоритмы - ваше дело.
Не нравиться на Си - перепишите на ассемблере.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)



