
- •ИЗучение системы программирования микроконтроллеров dsPic33f с помощью языка программирования ассемблер
- •1 Цель работы
- •2 Подготовка к выполнению работы
- •3 Вопросы для самоконтроля
- •4 Приборы, оборудование и документация
- •5 Порядок выполнения работы
- •8. 1. 2 Общий формат инструкций и директив
- •8. 1. 3 Директивы Ассемблера
- •8.1.4 Числовые константы и системы счисления
- •8.1.5 Текстовые строки
- •8.2 Тренировочный пример выполнения работы
8. 1. 2 Общий формат инструкций и директив
Общий формат инструкций и директив Ассемблера следующий:
[метка:] инструкция [операнды] [;комментарии]
[метка:] директива [аргументы] [;комментарии]
Таким образом, каждая строка исходного файла может содержать до четырёх информационных полей:
- метка;
- мнемоника команды;
- операнды команды;
- комментарии.
Метки используются для отметки позиции в коде. Во время компоновки, метки определяют адреса в памяти. Метки должны начинаться с первой колонки. За меткой должно следовать двоеточие «:». Метка должна начинаться с символа латинского алфавита или двойного символа подчеркивания «__» и может состоять из цифр и букв латинского алфавита и символа подчеркивания «__».
Мнемоники инструкций микроконтроллера, директивы Ассемблера и макрокоманды должны начинаться со второй (и далее) колонки.
Операнды и аргументы следуют за мнемоникой команды. Операнды должны быть отделены от мнемоники не менее чем одним символом пробела либо табуляции. Список операндов разделяется запятыми. Операнды используются в инструкциях для обеспечения информации об источнике и приемнике. Аргументы подобны операндам и используются как источник и приемник информации директив.
Любой текст до конца строки после символа «;» трактуется как комментарий. Комментарии могут следовать за операндами, мнемониками и метками и могут начинаться в любой колонке. Строковые константы, содержащие символ «;», как комментарий не воспринимается. Так же комментарии могут быть многострочными. В этом случае начало комментариев обозначается сочетанием символов «/*», а конец – сочетанием «*/».
8. 1. 3 Директивы Ассемблера
Существует пять основных типов директив:
- директивы контроля – управляют созданием разделов условно компилированного кода;
- директивы данных – управляют разделением памяти и назначением символических имен переменным и константам;
- директивы листинга – определяют формат и состав файла листинга. Эти директивы позволяют указывать заголовки, нумеровать страницы и настраивать другие параметры;
- макро директивы – управляют работой макросов и распределением данных в теле макроса;
- директивы объектного файла – используются только при создании объектного файла.
Основные директивы Ассемблера перечислены ниже.
.list
Директива .list используется для управления процессом сборки программы. В частности, с помощью данной директивы можно указать используемый микроконтроллер, систему счисления по умолчанию, параметры работы со строками и т.д. Пример использования директивы:
.list p=p33fj32mc204
.include
Директива .include добавляет содержимое указанного файла в исходный файл. Эффект аналогичен копированию полного текста включаемого файла в место расположения директивы. Параметр директивы – подключаемый файл – может указываться как с полным путем, так и без. Во втором случае поиск файла будет осуществляться в текущей рабочей директории, директории исходного файла и служебных директориях. Пример использования директивы:
.include “p33fj32mc204.inc”
.global
Директива .global используется для того, чтобы позволить меткам, определённым внутри файла, использоваться в другом файле. Пример использования директивы:
.global __reset
.global __OscillatorFail
.global __AddressError
В данном примере метки сделаны глобальными, чтобы компоновщик мог использовать их как адрес для перехода программы в указанные точки при наступлении соответствующих событий. Метка __reset используется для обозначения начала кода и используется как адрес для перехода из вектора сброса.
.section
Директива .section декларирует секцию памяти. Атрибутами, следующими за директивой, задается расположение секции – например, в памяти RAM либо в программной памяти. Пример использования директивы:
.section .data
.data
Директива используется для информирования Ассемблера, что последующие данные будут помещены в секцию инициализированных данных. Если адрес секции не определен, то он будет назначен автоматически при связи объектных файлов.
.text
Директива .text используется для информирования Ассемблера, что следующий код будет помещён в секцию программной памяти.
.equ
Директива .equ используется для определения символа и присвоения ему значения. Пример использования директивы:
.equ FCY, #7370000
В данном примере символу FCY присваивается литеральное значение 7370000. В таком контексте FCY является константой, которая может использоваться в коде.
.hword
Директива .hword используется для объявления инициализированных данных в пределах секции. Данные могут быть в виде констант, внутренних и внешних меток или их выражений. Пример использования директивы:
MinX: .hword 0x7FFF
.extern
Директива .extern используется для объявления переменной либо метки, которая может использоваться в данном файле кода, однако определена как глобальная в другом файле. Пример использования директивы:
.extern label
.end
Директива .end используется для обозначения окончания ассемблерного исходного файла. Пример использования директивы:
.list p=p33fj32mc204
; текст программы
.end