Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МПС (Андрей).docx
Скачиваний:
121
Добавлен:
05.05.2021
Размер:
7.63 Mб
Скачать

9) Основы языка Assembler для микроконтроллеров семейства avr. Синтаксис, классификация команд.

Язык ассемблера – система обозначений, используемая для представления в удобно читаемой форме программ, записанных в машинном коде. Команде языка ассмеблер один к одному соответствуют командам процессора. Фактически они представляют собой более удобную для человека символьную форму записи (мнемокоды) команд и их аргументов.

Кроме того, язык ассемблера позволяет использовать символические метки вместо адресов ячекк памяти, которые при ассмеблировании заменяются на вычисляемые ассемблером асболютные и относительные адреса, а также так называемые директивы (команды ассемблера, не переводимые в машинные команды процессора, выполняемые самим ассемблером). Директивы ассемблера позволяют, в частности, включать блоки данных, задать ассемблирование фрагмента программы по условию, задать значения меток, использовать макрокоманды с параметрами.

Каждая модель (или семейство) процессоров имеет свой набор команд и соответствующий ему язык ассемблера, микроконтроллеры семействаAVR не являются исключением. Теперь рассмотрим подробнее синтаксис ассемблера AVRStudio 7.

Комментарии

Общее правило – чем подробнее описаны выполняемые команды, тем лучше. Обозначаются двумя способами - с помощью символа ; или //. Для объемных комментариев, занимающих несколько строчек, целесообразно использовать такую структуру: /* текст комментария */.

Операторы

  • Оператор .def позволяет присвоить любому регистру микроконтроллера некоторые осмысленное символьное имя. Например, если мы используем в качестве промежуточного хранилища регистр R16, намного проще присвоить ему имя Temp и в дальнейшем использовать уже его:

.defTemp = R16

Одному и тому же регистру можно присвоить несколько имен, но обратная операция недопустима.

  • Оператор .equ позволяет присвоить выражению или константе некоторую символьную метку. То есть, если какое-то число встречается в программе часто и нам понадобится его изменять, мы один раз меняем присвоенную ему метку вместо изменения всех чисел в тексте программы. Также с помощью этого оператора можно присвоить выражение. Примеры:

.equXTAL = 4000000 // определяем тактовую частоту контроллера в МГц

.equbaudrate = 9600 // задаемскорость передачи данных Бит/с

.equbauddriver = XTAL/(16*baudrate)-1 // вычисляемзначениеделителя

  • Оператор .include позволяет подключать в тело программы часть кода из другого текстового файла. Если необходимо подключить не весь файл, а только его часть, то нужно воспользоваться директивой .exit, дойдя до которой компилятор попросту выйдет из файла, забрав с собой только необходимый участок кода.

  • .macro – оператор макроподстановки. В языках ассемблера макрос – символьное имя, заменяемое при обработке препроцессором на последовательность программных инструкций. Он представляет собой последовательность команд, которые подставляются в нашу программу при вызове этого самого макроса.

Операнды

Программа для любого МК представляет собой последовательность команд, записанных в памяти программ. Большинство команд при выполнении изменяют содержимое одного или нескольких регистров общего назначения, регистров ввода/вывода или ячеек ОЗУ. Для обращения к различным областям адресного пространства памяти данных используются различные команды, реализующие, в свою очередь, различные способы адресации. Доступ к регистрам ввода/вывода осуществляется по их адресам, являющимися операндами команды.

Мнемоническая запись команды выглядит следующим образом: сначала идет непосредственно сама команда, затем пробел, затем следуют операнды. Некоторые команды не имеют (RETI,NOP) или имеют только один операнд (INC/DEC). Если же команда имеет два операнда, сначала указывают приёмник, затем источник, причем между ними должна стоять запятая.

SUBR16, R17 // из содержимого R16 нужно вычесть содержимое R17, результат окажется в R16

  • Практически каждая команда занимает одну ячейку программы;

  • AVR-ассемблер не различает буквенный регистр;

  • Каждая команда должна занимать отдельную строку;

  • Числе по умолчанию считаются десятеричными, двоичные числа как в языке Си: 0b00010101;

Типы ассемблерных команд

  • Команды логических операций;

  • Команды арифметических операций и команды сдвига;

  • Команды операций с битами;

  • Команды пересылки данных;

  • Команды передачи управления;

  • Команды управления системой.

Соседние файлы в предмете Микропроцессорные системы