Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Со сдвигом можно зациклить :idea:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

А накладные расходы на цикл? кажется мне, цикл здесь выиграет(выиграет ли?) пару тактов и проиграет в наглядности.
Контактная информация:
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

BOB51 писал(а):в произвольном порядке через флаг Т
через CY проще
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Цикл тут выиграет только по размеру кода, а по производительности проиграет. По размеру ROR/ROL 8 раз или BST/BLD одинаково, но ROR/ROL проще 8 раз скопипастить, а в BST/BLD нужно каждую строчку редактировать. В любом случае написать кусок кода быстрее чем этот пост :))
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Кстати, обратный порядок бит не имеет никакой математической зависимости от прямого? Я не слышал (да и не соображу сейчас), а то может какие более извращённые варианты есть :)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Для двух бит получается что-то вроде: (X1 XOR X2) AND (0b00 - (X1:X2)) OR (X1 = X2) AND (X1:X2), это даже сходу в код не переведешь...
А для 8 думаю вообще будет :facepalm:
А чисто математически что-то вообще не видно закономерности, кроме табличной...
О! Кстати, если не жалко 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...
7 тактов вместо 16 :))
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

А для 8 думаю вообще будет :facepalm:
Вот и я о том. Но что-то мне подсказывает, что должна быть какая-нибудь трёхэтажная формула :)
Gudd-Head у нас в этом деле самый головастый, ща что-нибудь выдаст :)))
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Ага, 3х этажная, логически-алгебраическая хреновина. Она точно есть, но вот искать ее думаю практического смысла нет :dont_know:
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Эээ, чо сразу я?
Дальше ROR/ROL моя голова думать отказывается. Ну, если только как-то SWAP приплести для спортивного интереса :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

практического смысла нет
Не, мне не смысл нужен, просто интересно...

На практике мне ни разу не приходилось вертеть таким образом. Если надо выдать последовательный код, то просто выдаём его либо головой вперёд, либо ногами, в зависимости от ситуации. А внутри программы... для чего? :dont_know:
Ну, если только как-то SWAP приплести для спортивного интереса
Ага, я мусолил уже его мысленно... толку нет.
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Остается только горевать по поводу отсутствия побитового SWAP.
PS. Табличное программирование форэва!
Docendo discimus
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

ИМХО все не "смертельно"....
Engineer_Keen писал(а):А для 8 думаю вообще будет :facepalm:
А чисто математически что-то вообще не видно закономерности, кроме табличной...
О! Кстати, если не жалко 256 байт флеша....
если сделать таблицу для одной тетрады, то не пострадает ни размер (всего 16 байт), ни быстродействие ...
PS. и swap на разок пригодится :)
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Быстродействие пострадает, даже по сравнению с обычным циклом, т.к. придётся городить огород со swap'ами. Не говоря о размере.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

ploop писал(а):Быстродействие пострадает, даже по сравнению с обычным циклом....
... не совсем понял что значит обычным циклом и swap в "отзеркаливании" применяется только 1 раз...
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Байты к сожалению не всегда зеркальны по тетрадам. Даже далеко не всегда. Посему придется два раза использовать таблицу.
Docendo discimus
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

К таблице придется обращаться 2 раза, а это уже 14 тактов (по два раза 2xLDI Z, 2xZ+адрес+LPM) + выделение младшего полубайта адреса (2 раза) + склейка результатов 2х операций с таблицами. Больше 20 тактов и почти столько же флеша + 16 байт таблица... Неее, так не пойдет.
В общем варианта 3, все остальное ИМХО их комбинации.
1)

Код: Выделить всё

LDI ZH,High(START*2)
MOV ZL,R16
LPM R16,Z
+минимум тактов (5),
- максимум флеша (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 раз.
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Классику надо знать!!! :))
http://www.hackersdelight.org/HDcode/reverse.c.txt
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Да, на Си хорошо получается, даже в одну строчку :))
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Вы, господин хороший, название ветки прочитали? То-то же.
Docendo discimus
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Классика - это книжка "Hacker's Delight" (Алгоритмические трюки для программистов).
А на каком языке реализовывать алгоритмы - ваше дело.
Не нравиться на Си - перепишите на ассемблере. :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Ответить

Вернуться в «AVR»