Краткие теоретические сведения. Обзор MPLAB ASM30 Ассемблера

Обзор MPLAB ASM30 Ассемблера

 

Язык Ассемблера – машинно-ориентированный язык низкого уровня с командами, соответствующими командам микроконтроллера.

Условно текст программы на Ассемблере можно разбить на два блока:

– блок определений;

– блок кода.

В блоке определений указывается модель используемого МК, подключаются заголовочные файлы, объявляются константы и переменные, содержатся иные директивы, определяющие параметры работы Ассемблера и варианты сборки программы. В блоке кода содержатся непосредственно исполняемые микроконтроллером инструкции, сгруппированные в подпрограммы и обработчики событий.

Основу языка Ассемблера составляют директивы и инструкции. Директивы Ассемблера интерпретируются во время выполнения работы Ассемблера и используются для определения секций памяти, инициализации констант, декларирования и определения символов и т.д. Инструкции являются командами микроконтроллера, непосредственно исполняются им во время работы.

Общий формат инструкций и директив

 

Общий формат инструкций и директив Ассемблера следующий:

 

[метка:] инструкция [операнды] [;комментарии]

[метка:] директива [аргументы] [;комментарии]

 

Таким образом, каждая строка исходного файла может содержать до четырёх информационных полей:

- метка;

- мнемоника команды;

- операнды команды;

- комментарии.

Метки используются для отметки позиции в коде. Во время компоновки, метки определяют адреса в памяти. Метки должны начинаться с первой колонки. За меткой должно следовать двоеточие «:». Метка должна начинаться с символа латинского алфавита или двойного символа подчеркивания «__» и может состоять из цифр и букв латинского алфавита и символа подчеркивания «__».

Мнемоники инструкций микроконтроллера, директивы Ассемблера и макрокоманды должны начинаться со второй (и далее) колонки.

Операнды и аргументы следуют за мнемоникой команды. Операнды должны быть отделены от мнемоники не менее чем одним символом пробела либо табуляции. Список операндов разделяется запятыми. Операнды используются в инструкциях для обеспечения информации об источнике и приемнике. Аргументы подобны операндам и используются как источник и приемник информации директив.

Любой текст до конца строки после символа «;» трактуется как комментарий. Комментарии могут следовать за операндами, мнемониками и метками и могут начинаться в любой колонке.

 

Директивы Ассемблера

Существует пять основных типов директив:

- директивы контроля – управляют созданием разделов условно компилированного кода;

- директивы данных – управляют разделением памяти и назначением символических имен переменным и константам;

- директивы листинга – определяют формат и состав файла листинга. Эти директивы позволяют указывать заголовки, нумеровать страницы и настраивать другие параметры;

- макро директивы – управляют работой макросов и распределением данных в теле макроса;

- директивы объектного файла – используются только при создании объектного файла.

Основные директивы Ассемблера перечислены ниже.

Директива .list используется для управления процессом сборки программы. В частности, с помощью данной директивы можно указать используемый микроконтроллер, систему счисления по умолчанию, параметры работы со строками и т.д. Пример использования директивы:

 

.list p=p33fj32mc204.

Директива .include добавляет содержимое указанного файла в исходный файл. Эффект аналогичен копированию полного текста включаемого файла в место расположения директивы. Параметр директивы – подключаемый файл – может указываться как с полным путем, так и без. Во втором случае поиск файла будет осуществляться в текущей рабочей директории, директории исходного файла и служебных директориях. Пример использования директивы:

.include “p33fj32mc204.inc”.

Директива .global используется для того, чтобы позволить меткам, определённым внутри файла, использоваться в другом файле. Пример использования директивы:

.global __reset.

В данном примере метки сделаны глобальными, чтобы компоновщик мог использовать их как адрес для перехода программы в указанные точки при наступлении соответствующих событий. Метка __reset используется для обозначения начала кода и используется как адрес для перехода из вектора сброса.

Директива .section декларирует секцию памяти. Атрибутами, следующими за директивой, задается расположение секции – например, в памяти RAM либо в программной памяти. Пример использования директивы:

.section .data.

Директива .data используется для информирования Ассемблера, что последующие данные будут помещены в секцию инициализированных данных. Если адрес секции не определен, то он будет назначен автоматически при связи объектных файлов.

Директива .text используется для информирования Ассемблера, что следующий код будет помещён в секцию программной памяти.

Директива .equ используется для определения символа и присвоения ему значения. Пример использования директивы:

.equ FCY, #7370000.

В данном примере символу FCY присваивается литеральное значение 7370000. В таком контексте FCY является константой, которая может использоваться в коде.

Директива .end используется для обозначения окончания ассемблерного исходного файла. Пример использования директивы:

.list p=p33fj32mc204.

; текст программы

.end