запятая ( с любым числом пробелов до или после нее, или вообще без них). Так, выражение
sub r16, r17 означает, что из содержимого r16 нужно вычесть содержимое r17, а результат окажется в r16.
Сразу заметим, что AVR-ассемблер регистр букв не различает, в том числе и присвоенных программистом именах переменных, констант, меток и т.п. (одинаково правильно будет форма записи JMP, Jmp, jMP).
Каждая команда должна занимать отдельную строку ( в большинстве языков высокого уровня операторы можно записывать в одной строке, например, разделяя их знаками препинания – здесь это не допускается!)
Разбивать команду на части разрывом строки нельзя. Кроме команды, единая строка может содержать метки и примечания.
Метка (label) – идентификатор произвольной длины, придуманный программистом и заканчивающийся двоеточием без пробелов перед ним (metka:). Метку можно располагать и в отдельной строке. Кроме простого указания на адрес перехода для команд ветвления, метки служат также указанием на адрес подпрограмм (процедур) и заодно являются их именем.
2.1 Числа и выражения.
В некоторые команды можно включать выражения и числовые значения. Числа по умолчанию считаются десятичными, за исключением чисел с ведущим нулем, которые если не немеют дополнительных признаков, воспринимаются как восьмеричные. Шестнадцатеричные числа можно записывать двоякими способами: как в языке С (0x0A), так и в языке Pascal($0A). Интеловская форма записи (0Ah) не допускается. Двоичные числа записываются как в языке С: 0b00000101.
В команды можно включать алгебраические и логические выражения, например: ldi r30, c1+c2 (где с1 и с2 – константы).
В выражениях допустимы все арифметические и логические операции, включая даже операции сравнения. Однако действия в выражениях могут, естественно производиться только над константами, а не над содержимым регистров, которые к моменту компиляции не известны.
2.2 Директивы и функции
Кроме команд, в ассемблерной программе могут встречаться директивы компилятора. Их довольно много, но самых употребительных, которые есть практически в каждой программе, три : def (definitions),
equ (equivalent), include. Первые две предназначены для определения имени пользовательских переменных и констант (обратите внимание на точку перед именем директивы):
.equ max_value = $11; максимально значение равно 17
.def temp = r16; регистр r16 есть переменная temp
.def counter = r05 ; регистр r05 есть переменная counter
Эти определения в целях структурирования программы обычно располагают в начале текста.
Пример:
.def temp = r16; регистр r16 есть переменная temp
.def counter = r16 ; регистр r16 есть переменная counter
Как видно из листинга изменение temp будет автоматически означать изменения counter и наоборот.
С помощью директивы equ можно определять довольно сложные выражения, которые располагаются не в регистрах ! , а в области SRAM. Например, следующая последовательность директив и команд запишет содержимое регистра counter в SRAM по адресу $60 ( для большинства моделей, кроме старших Mega, - это первый свободный адрес после занятых адресами регистров).
Пример:
.equ counter_addr = $60
clr ZH
ldi ZL, counter_addr
st Z, counter
Сам ассемблер не знает о существовании таких вещей как PortA или DDRC, а знает только числовые адреса соответствующих регистров РОН. Для того чтобы включить все инструкции в программу для определенного типа МК нужно подключить уже написанную библиотеку с расширением .inc.
Например мы работаем с ATmega8 приведем листинг включение
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.