Z.png.ffe955c7a9c8c0129329b785167d34a7.png' alt='Avr Studio Ассемблерная Вставка' title='Avr Studio Ассемблерная Вставка' />Ассемблерные вставки в AVR GCC AVR Сообщество Easy. Electronics. ru. Практически всегда, когда в проекте задействованы АЦП, встат необходимость провести математическую обработку того, что там нацифровалось. Если математика чуть сложнее, чем найти максимум за период, а измерения непрерывные, то частенько встат вопрос в скорости обработки. Собственно говоря, это вообще то отправная точка для выбора платформы, на которую будет опираться проект, тут надо здраво оценить потребности задачи и возможности различных платформ. Конечно, для ядрной числодробилки лучше взять какой нибудь DSP, а может даже и FPGA. А если наша числодробилка не особо ядрная, зато требуется минимизировать энергопотребление этой фигни, да и конечная стоимость должна быть не как у самолта А ещ есть такие факторы, как опыт разработчика, доступность комплектухи и т. Короче если мы решили, что мозгами в нашем проекте должна работать старая добрая AVR, но мозга у не не хватает, на то что бы осмыслить наш алгоритм, объясннный ей на языке C, придтся объяснять на Assemblerе. Оба метода не переносимы и требуют знания соглашений конкретного компилятора, которым предполагается собирать проект. Первый способ немножко более универсальный при портировании на другой компилятор нужно будет только поправить имена используемых регистров где аргументы, куда результат и что свободно для промежуточной работы. Но у нас то случай не общий, у нас компилятор gcc см. Ассемблерные вставки в GCC хоть и имеют свои недостатки о них ниже, зато позволяют почти полностью забыть о вопросах планирования регистров компилятор берт это на себя. Итак, что такое ассемблерная вставка Попрошу внимательно прочитать следующее предложение и осмыслить его это важно. Ассемблерная вставка это фрагмент текста, который парсер языка C на прямую передат компилятору языка Assembler, вместе с ассемблерным текстом, сгенерированным в результате трансляции сишного исходника. Ниже приведена диаграмма, упрощнно показывающая основные стадии сборки программы. Думаю, пояснений здесь не требуется нам сейчас не важно, что такое GENERIC, GIMPLE, RTL и прочие умные слова, важно только понимание на какой стадии что делается и о чм в это время знает компилятор впрочем, если надо расписать подробнее спрашивайте. Далее по тексту под термином компилятор я буду понимать вс, что происходит до ассемблирования. Для объявления ассемблерных вставок в языке C используется встроенная функция asm ещ встречаются вариации на тему. Простейшая ассемблерная вставка может выглядеть так. Вс вышесказанное было кросс компиляторным, но для того, что бы написать что то полезное этого явно не достаточно, так что поехали копать вглубь, в gcc специфичные аспекты. Во первых, между словом asm и списком аргументов может находиться ключевое слово volatile, а во вторых, в отличие от обычных функций, здесь аргументы разделяются не запятой, а двоеточием. AVR_kurs/Studio/AVRS6m.gif' alt='Avr Studio Ассемблерная Вставка' title='Avr Studio Ассемблерная Вставка' />Зачем оно здесь Казалось бы, из приведнного выше определения следует, что оптимизатор не может запустить свои шаловливые ручки в наш ассемблерный код. Это так, однако, при определнных условиях, он может решить, что наш код ничего полезного для программы не делает и удалить его целиком. Какие это условия Ну, в первую очередь, под угрозу попадают функции с возвращаемыми значениями, результаты выполнения которых далее в программе не используются. Так же могут быть убиты вставки вообще без входов и выходов например просто вызывающие nop, wdr, clisei, впрочем, здесь точно не уверен. В любом случае, volatile после слова asm лучше указывать всегда хуже не будет. Число их переменное и может быть от одного до четырх asm code output. Строка это, конечно, хорошо, но даже небольшой ассемблерный исходник, написанный в одну строку, является нечитабельной кашей. Спасает то, что в C есть, простите за тавтологию, многострочные строки строки, между которыми нет ни одного непробельного символа, склеиваются в одну. Это улучшает читабельность в исходном сишном файле, но в сгенернном асме по прежнему будет каша. Для окончательного искоренения каши перевод строки в явном виде пишут в тексте вставки. В итоге получается что то такое. Регистр r. 0 используется как временный регистр, куда можно положить что то на передержку на пару тактов, не задумываясь о том, что там было что то раньше и что мы может сломать что то в будущем. Регистр r. 1 предполагается всегда равным нулю, используется когда нужен 0 в инструкциях, которые не принимают константу. Лирическое отступление в AVR команды аппаратного умножения 881. Отсюда вывод не забывайте обнулять r. Дело в том, что если наша вставка будет инлайниться в бинарнике несколько раз, то получится, что программа содержит несколько одинаковых меток. Что бы избежать этого к имени метки добавляется спец. Собственно, самая важная и интересная тема как ассемблерная вставка общается с внешним миром. Списки операндов описывают, что нужно данному коду для работы. Синтаксис у входного и выходного списков одинаковый перечисление описаний операндов, разделнных запятой. Описание операнда в общем случае имеет следующий вид. Ограничитель описывается буквой и указывает компилятору каким условиям должен соответствовать данный операнд. Наиболее часто используемые ограничители приведены в таблице более подробный список см. Операнд без модификатора трактуется как read only, модификатор, делает операнд write only, а модификатор говорит, что операнд используется только как выход. Эта информация нужна в первую очередь оптимизатору что бы знать как что используется и где что можно выбросить. Это нужно, когда операнд является и входом и выходом. В зависимости от ограничителя это может быть регистр, в котором хранится переменная, указатель на переменную в памяти или константа. Huawei Заводская База Кодов Sim Pin Network Code. Если требуется передать в код многобайтную переменную, то е имя точно так же указывается в качестве value, а в коде используется расширенная адресация между знаком и именем операнда добавляется буква, обозначающая номер байта в переменной A младший байт, B второй байт и так далее, в зависимости от типа значения. Для указателей в инструкциях, работающих с адресными регистрами, между знаком и именем операнда необходимо писать букву a именно прописную, не заглавную. Обязательной частью имени операнда являются квадратные скобки. Имя можно не указывать вообще, тогда обращаться к операндам можно по номеру. Правила расширенной адресации остаются те же. Эти регистры, в случае необходимости, будут запиханы в стек перед входом во вставку и вынуты обратно после выхода. Avr Studio Ассемблерная Вставка' title='Avr Studio Ассемблерная Вставка' />Привет, Хабр Посоветуйте мне, пожалуйста, как получить читабельный ассемблерный код из программы написаной на СС. Попутно отметим, что можно использовать ассемблерные вставки с. COFF, который используется пакетом AVR Studio для отладки программы. Atmel Studio совершенно бесплатна и доступна на сайте Atmel. Avr Studio Ассемблерная Вставка' title='Avr Studio Ассемблерная Вставка' />Кроме того, может быть указано специальное слово memory, которое говорит, что код во вставке может модифицировать произвольную область памяти. В этом случае компилятор перед входом во вставку сохранит в память все переменные, которые в тот момент загружены в регистры, а по выходу вновь загрузит значения из памяти. Например временные переменные лучше объявлять вне ассемблерной вставки это позволит компилятору самому выбирать регистры для их хранения. С форматом команды asm разобрались, теперь пару слов об использовании. Основной недостаток ассемблерных вставок вытекает из определения, на которое я просил обратить внимание в начале в тексте вставки нельзя использовать макросы препроцессора, в том числе и имена портов, регистров, битов и так далее. Если попытаться передать значение PORTB напрямую во ставку компилятор ругнтся на ошибку в ограничителе. А, может, и не ругнтся зависит от того, какой контроллер мы используем. Нам же нужно передать во вставку значение изначального адреса. Если вставка используется более одного раза, то е можно оформить либо как функцию, либо как макрос. С функцией вс просто объявляем локальные переменные нужных типов и передам их в asm. С макросами по сложнее здесь тоже можно объявить локальные переменные, но только при условии, что используется не стандарт C ANSI, а что то посвежее. Кстати, я рекомендую выставлять стандарт GNU9.