| Этюды на ассемблере AVR |
|
|
| Автор ARV | |||||||
| 27.01.2008 г. | |||||||
|
Предлагаю несколько примеров, которые иначе, как этюды на ассемблере, не назовешь. Задачи простые, однако, я старался сделать их решения красивыми. Красивым я называю такой код, который либо реализует оригинальный алгоритм, либо имеет наименьший размер, либо обладает наибольшим быстродействием, либо обладает еще какими-то неординарными параметрами. Этюды имеют и вполне реальную ценность, т.к. посвящены довольно часто встречающимся в практике ситуациям.
В предложенных этюдах подразумеваются, что имеется следующий код-преамбула:
1. Умножение чисел на 1.25, 1.5, 1.75.Ассемблер микроконтроллеров реализует целочисленную арифметику, однако часто требуется увеличить или уменьшить в дробное число раз. Очень многие сразу бросаются писать программы на Си с использованием float-переменных, однако для некоторых частных случаев существуют довольно элегантные решения и на ассемблере.
Для двухбайтного числа VH:VL умножение на 1.25 осуществляется следующим кодом:
Аналогично решаются и другие задачи:
2. Циклические сдвиги.Ассемблер микроконтроллеров AVR не содержит команды, осуществляющей циклический сдвиг байта вправо и влево, а необходимость в этом возникает довольно часто. Вот как это можно реализовать:
Как видите, сдвиг влево можно осуществить двумя способами: без использования дополнительного регистра или с использованием. Первый вариант более медленный и более объемный, зато второму требуется свободный регистр. Циклические сдвиги бывает необходимо выполнять и над двухбайтными числами, и вот варианты реализации таких сдвигов:
И снова сдвиг влево реализован разными способами, а для сдвига вправо, надеюсь, вам будет интересно поломать голову и самим. 3. Обращение порядка битов.Иногда требуется получить «зеркальное» отражение битов в байте, т.е. когда нулевой бит обменивается местами с 7-ым, 1-й с 6-ым и т.д. Условно это можно обозначить так, заменив значения битов буквами: ABCDEFGH --> HGFEDCBA. Даже любители Си знают, что красиво решить эту задачу не так-то просто. И, не смотря на то, что при грамотной записи на языке Си многие компиляторы генерируют весьма компактный код, ассемблер все-же позволяет добиться еще лучших результатов. Решению этой задачи посвящалось много тем на различных форумах, однако я решил эту задачу самостоятельно, причем двумя способами, с которыми предлагаю познакомиться и вам.
Недавно я обнаружил, что найден еще один способ - пока что самый быстродействующий: всего 13 тактов! Но найти его предлагаю вам самостоятельно. Добавить в любимые (0) | Просмотров: 33827
Только зарегистрированные пользователи могут оставлять коментарии. |
|||||||
| « Пред. | След. » |
|---|
R785211844650
Z210696637574
E368177590409



Коментарии (3)