Кочегаров И.И. Микроконтроллеры AVR. Лабораторный практикум (2012) (1264221), страница 8
Текст из файла (страница 8)
Метка, которой присвоенозначение данной директивой, не может быть переназначена, и ее значение не может быть изменено.Синтаксис:.EQU метка = выражениеПример:.EQU io_offset = 0x23.EQU porta = io_offset + 2.CSEG; Начало сегмента данныхclr r2; Очистить регистр r2out porta,r2 ; Записать в порт AESEG – Сегмент EEPROMДиректива ESEG определяет начало сегмента EEPROM. Исходный файл может состоять из нескольких сегментов EEPROM, которые объединяются в один сегмент при компиляции. СегментEEPROM обычно состоит только из директив DB, DW и меток. Сегменты EEPROM имеют свои собственные побайтные счетчики положения. Директива ORG может быть использована для размещенияпеременных в необходимом месте EEPROM.
Директива не имеет параметров.Синтаксис:.ESEGПример:.DSEG; Начало сегмента данныхvar1: .BYTE 1; зарезервировать 1 байт для var144table: .BYTE tab_size ; зарезервировать tab_size байт..ESEGeevar1: .DW 0xffff; проинициализировать 1 слово вEEPROMEXIT – Выйти из файлаВстретив директиву EXIT компилятор прекращает компиляциюданного файла. Если директива использована во вложенном файле(см. директиву INCLUDE), то компиляция продолжается со строкиследующей после директивы INCLUDE. Если же файл не являетсявложенным, то компиляция прекращается.Синтаксис:.EXITПример:.EXIT ; Выйти из данного файлаINCLUDE – Вложить другой файлВстретив директиву INCLUDE компилятор открывает указанный в ней файл, компилирует его, пока файл не закончится или невстретится директива EXIT, после этого продолжает компиляцию начального файла со строки следующей за директивой INCLUDE.Вложенный файл может также содержать директивы INCLUDE.Синтаксис:.INCLUDE "имя_файла"Пример:; файл iodefs.asm:.EQU sreg = 0x3f ; Регистр статуса.EQU sphigh = 0x3e ; Старший байт указателя стека.EQU splow = 0x3d ; Младший байт указателя стека; файл incdemo.asm.INCLUDE iodefs.asm ; Вложить определения портовin r0,sreg ; Прочитать регистр статусаLIST – Включить генерацию листингаДиректива LIST указывает компилятору на необходимость создания листинга.
Листинг представляет из себя комбинацию ассемблерного кода, адресов и кодов операций. По умолчанию генерациялистинга включена, однако данная директива используется совмест45но с директивой NOLIST для получения листингов отдельных частейисходных файлов.Синтаксис:.LISTПример:.NOLIST; Отключить генерацию листинга.INCLUDE "macro.inc" ; Вложенные файлы не будут.INCLUDE "const.def" ; отображены в листинге.LIST; Включить генерацию листингаLISTMAC – Включить разворачивание макросов в листингеПосле директивы LISTMAC компилятор будет показывать влистинге содержимое макроса.
По умолчанию в листинге показывается только вызов макроса и передаваемые параметры.Синтаксис:.LISTMACПример:.MACRO MACX; Определение макросаadd r0,@0 ; Тело макросаeor r1,@1.ENDMACRO; Конец макроопределения.LISTMAC; Включить разворачиваниемакросовMACX r2,r1 ; Вызов макроса;(в листинге будет показанотело макроса)MACRO – Начало макросаС директивы MACRO начинается определение макроса. В качестве параметра директиве передается имя макроса. При встрече имени макроса позднее в тексте программы, компилятор заменяет этоимя на тело макроса. Макрос может иметь до 10 параметров, к которым в его теле обращаются через @0-@9. При вызове параметры перечисляются через запятые.
Определение макроса заканчивается директивой ENDMACRO.По умолчанию в листинг включается только вызов макроса,для разворачивания макроса необходимо использовать директиву LISTMAC. Макрос в листинге показывается знаком +.46Синтаксис:.MACRO макроимяПример:.MACRO SUBI16; Начало макроопределенияsubi @1,low(@0) ; Вычесть мл. байт пар-ра 0 из пар-ра 1sbci @2,high(@0) ; Вычесть ст. байт пар-ра 0 из пар-ра 2.ENDMACRO; Конец макроопределения.CSEG; Начало программного сегментаSUBI16 0x1234,r16,r17 ; Вычесть 0x1234 из r17:r16NOLIST – Выключить генерацию листингаДиректива NOLIST указывает компилятору на необходимостьпрекращения генерации листинга.
Листинг представляет из себякомбинацию ассемблерного кода, адресов и кодов операций. Поумолчанию генерация листинга включена, однако может быть отключена данной директивой. Кроме того, данная директива может бытьиспользована совместно с директивой LIST для получения листинговотдельных частей исходных файлов.Синтаксис:.NOLISTПример:.NOLIST; Отключить генерацию листинга.INCLUDE "macro.inc" ; Вложенные файлы не будут.INCLUDE "const.def" ; отображены в листинге.LIST; Включить генерацию листингаORG – Установить положение в сегментеДиректива ORG устанавливает счетчик положения, равным заданной величине, которая передается как параметр.
Для сегментаданных она устанавливает счетчик положения в SRAM (ОЗУ), длясегмента программ это программный счетчик, а для сегментаEEPROM это положение в EEPROM. Если директиве предшествуетметка (в той же строке), то метка размещается по адресу, указанномув параметре директивы. Перед началом компиляции программныйсчетчик и счетчик EEPROM равны нулю, а счетчик ОЗУ равен 32(поскольку адреса 0-31 заняты регистрами). Обратите внимание, чтодля ОЗУ и EEPROM используются побайтные счетчики, а для программного сегмента – пословный.47Синтаксис:.ORG выражениеПример:.DSEG; Начало сегмента данных.ORG 0x37; Установить адрес SRAM равным 0x37variable: .BYTE 1 ; Зарезервировать байт по адресу 0x37H.CSEG.ORG 0x10; Установить программный счетчик равным0x10mov r0,r1 ; Команда будет размещена по адресу 0x10SET – Установить переменный символический эквивалентвыраженияДиректива SET присваивает имени некоторое значение.
Это имяпозднее может быть использовано в выражениях. Причем в отличиеот директивы EQU значение имени может быть изменено другой директивой SET.Синтаксис:.SET имя = выражениеПример:.SET io_offset = 0x23.SET porta = io_offset + 2.CSEG; Начало кодового сегментаclr r2; Очистить регистр 2out porta,r2 ; Записать в порт AВыраженияКомпилятор позволяет использовать в программе выражения,которые могут состоять из операндов, знаков операций и функций.Все выражения являются 32-битными.ОперандыМогут быть использованы следующие операнды:Метки, определенные пользователем (дают значение своегоположения).Переменные, определенные директивой SET.Константы, определенные директивой EQU.Числа, заданные в формате:oДесятичном (принят по умолчанию): 10, 255oШестнадцатеричном (два варианта записи): 0x0a, $0a,0xff, $ff48Двоичном: 0b00001010, 0b11111111oВосьмеричном (начинаются с нуля): 010, 077PC – текущее значение программного счетчика (ProgrammCounter).oОперацииКомпилятор поддерживает ряд операций, которые перечисленыв таблице (чем выше положение в таблице, тем выше приоритет операции).
Выражения могут заключаться в круглые скобки, такие выражения вычисляются перед выражениями за скобками.ПриоритетСимволОписание14!Логическое отрицание14~Побитное отрицание14-Минус13*Умножение13/Деление12+Суммирование12-Вычитание11<<Сдвиг влево11>>Сдвиг вправо10<Меньше чем10<=Меньше или равно10>Больше чем10>=Больше или равно9==Равно9!=Не равно8&Побитное И7^Побитное исключающее ИЛИ6|Побитное ИЛИ5&&Логическое И4||Логическое ИЛИЛогическое отрицаниеСимвол: !Описание: Возвращает 1, если выражение равно 0, и наоборотПриоритет: 14Пример: ldi r16, !0xf0 ; В r16 загрузить 0x0049Побитное отрицаниеСимвол: ~Описание: Возвращает выражение, в котором все биты проинвертированыПриоритет: 14Пример: ldi r16, ~0xf0 ; В r16 загрузить 0x0fМинусСимвол: Описание: Возвращает арифметическое отрицание выраженияПриоритет: 14Пример: ldi r16,-2 ; Загрузить -2(0xfe) в r16УмножениеСимвол: *Описание: Возвращает результат умножения двух выраженийПриоритет: 13Пример: ldi r30, label*2ДелениеСимвол: /Описание: Возвращает целую часть результата деления левого выражения на правоеПриоритет: 13Пример: ldi r30, label/2СуммированиеСимвол: +Описание: Возвращает сумму двух выраженийПриоритет: 12Пример: ldi r30, c1+c2ВычитаниеСимвол: Описание: Возвращает результат вычитания правого выражения излевогоПриоритет: 12Пример: ldi r17, c1-c2Сдвиг влевоСимвол: <<Описание: Возвращает левое выражение, сдвинутое влево на числобит, указанное справа50Приоритет: 11Пример: ldi r17, 1<<bitmask ; В r17 загрузить 1, сдвинутую влевоbitmask разСдвиг вправоСимвол: >>Описание: Возвращает левое выражение, сдвинутое вправо на числобит, указанное справаПриоритет: 11Пример: ldi r17, c1>>c2 ; В r17 загрузить c1, сдвинутое вправо,c2 разМеньше чемСимвол: <Описание: Возвращает 1, если левое выражение меньше, чем правое(учитывается знак), и 0 в противном случаеПриоритет: 10Пример: ori r18, bitmask*(c1<c2)+1Меньше или равноСимвол: <=Описание: Возвращает 1, если левое выражение меньше или равно,чем правое (учитывается знак), и 0 в противном случаеПриоритет: 10Пример: ori r18, bitmask*(c1<=c2)+1Больше чемСимвол: >Описание: Возвращает 1, если левое выражение больше, чем правое(учитывается знак), и 0 в противном случаеПриоритет: 10Пример: ori r18, bitmask*(c1>c2)+1Больше или равноСимвол: >=Описание: Возвращает 1, если левое выражение больше или равно,чем правое (учитывается знак), и 0 в противном случаеПриоритет: 10Пример: ori r18, bitmask*(c1>=c2)+1РавноСимвол: ==Описание: Возвращает 1, если левое выражение равно правому (учитывается знак), и 0 в противном случае51Приоритет: 9Пример: andi r19, bitmask*(c1==c2)+1Не равноСимвол: !=Описание: Возвращает 1, если левое выражение не равно правому(учитывается знак), и 0 в противном случаеПриоритет: 9Пример: .SET flag = (c1!=c2) ;Установить flag, равным 1 или 0Побитное ИСимвол: &Описание: Возвращает результат побитового И выраженийПриоритет: 8Пример: ldi r18, High(c1&c2)Побитное исключающее ИЛИСимвол: ^Описание: Возвращает результат побитового исключающего ИЛИвыраженийПриоритет: 7Пример: ldi r18, Low(c1^c2)Побитное ИЛИСимвол: |Описание: Возвращает результат побитового ИЛИ выраженийПриоритет: 6Пример: ldi r18, Low(c1|c2)Логическое ИСимвол: &&Описание: Возвращает 1, если оба выражения не равны нулю, и 0в противном случаеПриоритет: 5Пример: ldi r18, Low(c1&&c2)Логическое ИЛИСимвол: ||Описание: Возвращает 1, если хотя бы одно выражение не равно нулю, и 0 в противном случаеПриоритет: 4Пример: ldi r18, Low(c1||c2)52ФункцииОпределены следующие функции: LOW(выражение) возвращает младший байт выражения HIGH(выражение) возвращает второй байт выражения BYTE2(выражение) то же что и функция HIGH BYTE3(выражение) возвращает третий байт выражения BYTE4(выражение) возвращает четвертый байт выражения LWRD(выражение) возвращает биты 015 выражения HWRD(выражение) возвращает биты 1631 выражения PAGE(выражение) возвращает биты 1621 выражения EXP2(выражение) возвращает 2 в степени (выражение) LOG2(выражение) возвращает целую часть log2(выражение)53Глава 6. Работа с пакетом AVR Studio 4 Работа в среде AVR Studio.