Подробности

Обратите внимание на синтаксис команд — сначала пишется, куда писать, а потом, через запятую, откуда или что. Это справедливо для всех команд и для всех ассемблеров. Каждая команда пишется в отдельной строке. Весь текст после точки с запятой ассемблером игнорируется и представляет собой комментарии, которые нужно писать обязательно, иначе вы через пару месяцев и сами в своей программе не разберетесь. Если комментарий переходит на другую строку, то точку с запятой нужно ставить заново, в начале строки. В отличие от знака перевода строки, все пробелы и табуляции игнорируются (а там, где есть другой разделительный знак, в данном случае запятая, как видите, пробелов вообще может не быть), так что украшать текст отступами можно, а для удобства чтения и нужно. Строчные и прописные буквы не различаются: записи LDI, Ldi и ldi означают одно и то же — и это отличие AVR-ассемблера от программных сред, основанных на C/C++. Вопреки распространяемым в Интернете сведениям (заимствованным из [22]), это правило соблюдается и для обновленных версий компилятора Avrasm2.

* * *

Ну, а теперь все? Можно скопировать это в Блокнот, сохранить с расширением asm и компилировать в hex-файл? Ишь разбежались — нет, не все. Во-первых, никаких таких DDRD и PortD AVR-ассемблер не понимает. Если соответствия кодов команд и их мнемонических обозначений (ldi), а также обозначений рабочих регистров (r16) и их адресов зашиты в ассемблере, то адреса РВВ могут меняться от модели к модели, а их названия и вообще могут быть выбраны совершенно произвольным образом. Сам ассемблер понимает только конкретные числа, представляющие собой адреса этих регистров. Но писать программу без мнемонических обозначений было бы крайне неудобно, т. к. она оказалась бы совершенно нечитаемой (вторая команда, к примеру, тогда выглядела бы так: out $11, r16). Поэтому к нашей программе надо «пристегнуть» файл с мнемоническими обозначениями, который поставляется Atmel и в данном случае называется tn2313def.inc (при компиляции он должен находиться в одном каталоге с файлом программы). Это делается почти в точности, как в языке С, строкой:

.include "tn2313def.inc";точка впереди обязательна!

* * *

Замечание

Файлы макроопределений (с расширением inc), к сожалению, нельзя скачать с сайта Atmel в отдельности. Как и файл компилятора Avrasm2, эти файлы для каждого контроллера в отдельности проще всего добыть из пакета AVR Studio, где они находятся в папке avrassembler/include. Лучше, если это будет одна из последних версий AVR Studio, пятая или более поздняя, иначе при компилировании совместно с Avrasm2 возможны ошибки.

* * *

Если вы заглянете внутрь файла tn2313def.inc, то увидите, что он состоит из строк, начинающихся с директивы .equ. Мы могли бы не включать его в программу (хотя в память процессора он все равно не записывается, ибо не содержит команд, а только определения переменных), а лишь дописать к программе в начале текста строки:

.equ DDRD = $11

.equ PortD = $12

Мы часто будем применять директиву .equ, которая устанавливает соответствие между числами и их обозначениями, наряду с другой полезной директивой — .def.

Если провести аналогии с языком Turbo Pascal или Turbo С, то директива .equ (от англ. equal — равно) полностью аналогична определению констант, а директива .def (от англ. define — определить) аналогична определению переменных, с единственным отличием: тип переменной здесь не указывается, ибо он один-единственный — число размером один байт. А вот в директиве .equ может быть указано число любого размера, а также и отрицательное, но, естественно, только целое.

Неудобно каждый раз писать r16 и помнить, что это у нас рабочая переменная для всяких текущих надобностей, потому лучше дописать еще такую строку:

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату