Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

КР1 / 9

.docx
Скачиваний:
3
Добавлен:
08.04.2022
Размер:
20.33 Кб
Скачать

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

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

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

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

Комментарии

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

Операторы

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

.def Temp = R16

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

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

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

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

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

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

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

Операнды

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Позволяют выполнять стандартные логические операции над байтами, такие как логическое умножение (И), логическое сложение (ИЛИ), операцию исключающее ИЛИ, вычисление обратного (дополнительного до единицы) и дополнительного (дополнение до двух) кода числа. Сюда также можно отнести команды очистки/установки регистров. Операции выполняются между регистрами общего назначения или между регистром и константой; результат сохраняется в РOН.

Все команды из этой группы выполняются за один машинный цикл.

  1. Арифметические команды и команды сдвига.

В эту группу входят команды, которые позволяют выполнять такие базовые операции, как сложение, вычитание, сдвиг (влево и вправо), инкремент и декремент. В микроконтроллерах семейства Mega также есть команды, позволяющие умножать 8-битные значения. Все операции выполняются только над регистрами общего назначения. В то же время микроконтроллеры AVR позволяют легко работать как со знаковыми, так и беззнаковыми числами, а также работать с числами, представленными в дополнительном коде.

Практически все команды этой группы выполняются за один машинный цикл. Команды умножения и команды, оперирующие двухбайтовыми значениями, выполняются в два цикла.

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

В эту группу входят команды, выполняющие установку или сброс заданного бита РOН или PBB. Более того, для изменения разрядов регистра состояния SREG существуют и дополнительные команды (точнее, эквивалентные мнемонические обозначения общих команд), поскольку чаще всего проверяется состояние битов именно этого регистра. Условно в эту группу также могут входить две команды передачи управления типа «проверка / пропуск», которые пропускают следующую команду в зависимости от состояния разряда РОН или РВВ. Все задействованные биты РВВ имеют свои собственные символические имена. Определения этих имен описаны в том же включаемом файле, что и определения символьных имен адресов регистров. Таким образом, после включения указанного файла в программу команды вместо числовых значений номеров цифр смогут указывать свои символьные имена.

  1. Команды пересылки данных.

Команды этой группы предназначены для пересылки содержимого ячеек, находящихся в адресном пространстве памяти данных. Разделение адресного пространства на три части (РОН, РВВ, ОЗУ) предопределило разнообразие команд данной группы. Пересылка данных, выполняемая командами группы, может производится в следующих направлениях: РОН  РОН, РОН  РВВ, РОН  память данных. Также к данной группе можно отнести стековые команды PUSH и РОР позволяющие сохранять в стеке и восстанавливать из стека содержимое РОН.

На выполнение команд данной группы требуется в зависимости от команды от одного до трех машинных циклов.

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

В эту группу входят команды перехода, вызова подпрограмм и возврата из них и команды типа «проверка/пропуск», пропускающие следующую за ними команду при выполнении некоторого условия. Также к этой группе относятся команды сравнения, формирующие флаги регистра SREG и предназначенные, как правило, для работы совместно с командами условного перехода. В системе команд микроконтроллеров семейства имеются команды как безусловного, так и условного переходов. Команды относительного перехода (RJMP), а в микроконтроллерах семейства Mega также косвенного (IJMP) и абсолютного (JMP) безусловного перехода являются самыми простыми в этой группе. Их функция заключается только в записи нового адреса в счетчик команд. Команды условного перехода также изменяют содержимое счетчика команд, однако это изменение происходит только при выполнении некоторого условия или, точнее, при определенном состоянии различных флагов регистра SREG.

Команды вызова подпрограммы (ICALL, RCALL и СALL) работают практически так же, как и команды безусловного перехода. Отличие заключается в том, что перед выполнением перехода значение счетчика команд сохраняется в стеке. Кроме того, подпрограмма должна заканчиваться командой возврата REТ.

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

  • NOP – пустая команда-заглушка;

  • SLEEP – перевод МК в режим пониженного энергопотребления;

  • WDR – сброс сторожевого таймера.

Все команды этой группы выполняются за один машинный цикл.

Соседние файлы в папке КР1