Ознакомление с программой AVR Studio

Страницы работы

Фрагмент текста работы

запятая ( с любым числом пробелов до или после нее, или вообще без них). Так, выражение

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 приведем листинг включение

Похожие материалы

Информация о работе