Что такое директива ассемблера

Расширенный ассемблер: NASM

Глава 5: Директивы ассемблера

Хотя NASM и пытается избежать бюрократизм ассемблеров наподобие MASM и TASM, он вынужден поддерживать несколько директив. Все они описаны в этой главе.

Существует два типа директив NASM: пользовательские и примитивные. Обычно каждая директива имеет как пользовательскую, так и примитивную форму. В большинстве случаев рекомендуется использовать пользовательскую форму директив, которая реализована как макрос, вызывающий примитивные формы. Примитивные директивы заключаются в квадратные скобки; для пользовательских директив этого не требуется.

В дополнение к описанным в этой главе универсальным директивам каждый объектный формат может опционально предоставлять дополнительные директивы, служащие для управления особенностями этого формата. Такие дополнительные директивы описываются далее в главе, посвященной выходным форматам файлов (глава 6).

5.1 BITS : Указание разрядности выполняемого кода

Не нужно задавать BITS 32 для использования 32-битных инструкций в 16-битных DOS-программах; если вы это сделаете, ассемблер сгенерирует некорректный код, так как он получится 32-битным и на 16-битных платформах будет не работоспособен.

5.2 SECTION или SEGMENT : Описание и изменение секций

Директива SECTION ( SEGMENT — это абсолютно эквивалентный синоним) указывает, в какую секцию выходного файла будет ассемблирован код, который вы пишете. В некоторых объектных форматах количество и имена секций фиксированы; в других пользователь может сделать их столько, сколько захочет. Поэтому если вы захотите переключиться на секцию, которая в данный момент не существует, директива SECTION может либо вызвать сообщение об ошибке, либо создать новую секцию.

5.2.1 Макрос __SECT__

развернется в две строки:

5.3 ABSOLUTE : Определение абсолютных меток

ABSOLUTE используется следующим образом:

ABSOLUTE в качестве аргумента принимает не только абсолютные константы: это может быть выражение (на самом деле критическое выражение: см. параграф 3.7), а также какое-то значение в сегменте. Например, TSR может реутилизировать свой настроечный код в качестве run-time BSS следующим образом:

Здесь определяется несколько переменных «на верхушке» setup-кода, так что после завершения его работы это пространство может быть реутилизировано как хранилище данных для работающей TSR. Символ ‘ tsr_end ‘ может быть использован для расчета общего размера резидентной части TSR.

5.4 EXTERN : Импорт символов из других модулей

Директива EXTERN подобна директиве MASM EXTRN и ключевому слову extern в С: она используется для объявления символа, который определен в некотором другом модуле. Не все объектные форматы поддерживают внешние переменные: формат bin этого не может.

Директива EXTERN принимает столько аргументов, сколько вам необходимо. Каждый аргумент является именем символа:

Примитивная форма EXTERN отличается от пользовательской тем, что одновременно может принять только один аргумент: поддержка списка аргументов реализуется на уровне препроцессора.

Вы можете объявить одну и ту же переменную как EXTERN более одного раза: NASM спокойно проигнорирует второе и последующие переопределения.

5.5 GLOBAL : Экспорт символов в другие модули

5.6 COMMON : Определение общих данных

Директива COMMON используется для объявления общих переменных. Общая переменная — это глобальная переменная, объявленная в секции неинициализированных данных, поэтому

работает так же, как и

Отличие состоит в том, что если одна и та же переменная определена в разных модулях, во время связывания (сборки) эти переменные будут объединены и ссылки на intvar во всех модулях будут указывать на одно и то же место в памяти.

Источник

Директивы Ассемблера

Группа директив для указания типа процессора

Директивы указания типа процессора задают набор используемых инструкций.

Директивы для указания сегментов

Директива SEGMENT

Определяет сегмент с заданным именем name. Если сегмент с таким именем уже был определен ранее, то данный сегмент интерпретируется как продолжение предыдущего.

BYTEвыравнивание не выполняется. Сегмент может начинаться с любого адреса памяти
WORDвыравнивание на границу слова (2 байта)
DWORDвыравнивание на границу двойного слова (4 байта)
PARAвыравнивание по границе параграфа (16 байт). Используется по-умолчанию.
PAGEвыравнивание на границу в 256 байт
USE16сегмент с 16-разрядной адресацией. Максимальный размер сегмента 64 Кб
USE32сегмент с 32-разрядной адресацией. Максимальный размер сегмента 4 Гб. В модели памяти FLAT используется по-умолчанию

Директива ENDS

Определяет конец сегмента.

Директива ASSUME

Задает сегментный регистр, который будет использоваться для вычисления действующего адреса для всех меток и переменных, определенных для сегмента или группы сегментов с указанным именем.

Директивы для упрощенного указания сегментов

Директива .MODEL

Задает модель памяти для упрощенных директив определения сегментов.

CАргументы передаются через стек, справа налево. Стек очищает вызывающая программа.
PASCAL, BASICАргументы передаются через стек, слева направо. Стек очищает вызываемая подпрограмма.
STDCALLАргументы передаются через стек, справа налево. Стек очищает вызываемая подпрограмма.

Директива .CODE или CODESEG

Определяет начало сегмента кода. Если задали среднюю или большую модель памяти, то за директивой может следовать необязательное имя, которое указывает имя сегмента. По-умолчанию имя сегмента _TEXT.

Директива .DATA или DATASEG

Определяет начало инициализированного сегмента данных.

Директива .DATA?

Определяет в модуле начало неинициализированного сегмента данных.

Директива .CONST

Определяет начало сегмента данных-констант.

Сегменты .DATA, .DATA?, .CONST помещаются в одну группу с именем DGROUP

Директива .STACK или STACK

Определяет начало сегмента стека, выделяя количество байт, заданное параметром. Если размер не указывается, выделяется 1024 байт.

Группа директив для резервирования памяти

Резервирует область памяти, заданного директивой размера, с указанным именем, и инициализирует значением выражения. Выражение может быть числом, строкой символов, специальным символом «?«, а также выражением с использованием директивы DUP.

Повторяет операцию выделения памяти для указанных данных столько раз, сколько задано значением счетчика

Директива STRUC (STRUCT)

Определяет структуру данных с заданным именем, содержащую поля. В каждом поле для определения его размера используются обычные директивы выделения данных (DB, DW и т.д.). Поля структуры могут быть именованными или нет.

Директива ENDS

Определяет конец структуры.

Директива UNION

Группа директив модификации размера указателей

Используются когда возникает неоднозначность в размере операнда команды. Например когда в ячейку памяти записывается число, то компилятор не может определить число какого размера требуется записать, и в этом случае требуется укзать директиву модификации размера.

Директивы определения процедур

Директива PROC

Определяет начало процедуры с указанным именем.

Директива ENDP

Определяет окончание процедуры

Директива USES

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

Директива LOCAL

В процедуре директива LOCAL определяет имена, которые доступны в стеке через отрицательные смещения относительно регистра BP. Если указан идентификатор, то ему присваивается количество байт, выделенных на локальные переменные (размер всего блока локальных переменных в байтах).

Директивы для макроопределений

Директива MACRO

Определяет начало макроопределения с указанным именем. У макроопредения могут быть заданы необязательные параметры, которые будут использоваться при подстановке тела макроопределения в текст программы.

Директива ENDM

Определяет окончание макроопределения

Директива REPT

Повторяет блок операторов, заданный между директивами REPT и ENDM столько раз, сколько задается выражением. Блок операторов должен заканчиваться директивой ENDM.

Директива IRP

Повторяет блок операторов, заданный между директивой IRP и ENDM со строковой подстановкой. Аргументами может быть любой текст: символы, строки, числа и т.д. Для каждого указанного аргумента ассемблирование блока операторов выполняется только один раз. При каждом ассемблировании блока для каждого вхождения «параметра» в операторах подставляется следующий аргумент в списке.

Другие директивы

Директива COMMENT

Позволяет задать многострочный комментарий, ограниченный с начала и с конца заданным символом-ограничителем.

Директива EQU

Определяет имя как строку, псевдоним или число, содержащие результат вычисления выражения.

Директива END

Отмечает конец исполняемого модуля и задает начальный адрес, с которого будет исполняться программа.

Директива EVEN

Округляет счетчик адреса до следующего четного адреса

Директива SEG

Возвращается адрес сегмента выражения со ссылкой на память

Директива OFFSET

Возвращает смещение выражения в текущем сегменте (или в группе, которой принадлежит сегмент, если используются упрощенные директивы определения сегментов).

Директива ORG

Устанавливает счетчик инструкций в текущем сегменте в соответствии с адресом, задаваемым выражением.

Директива RADIX

Задает основание системы счисления для целочисленных констант (2, 8, 10 или 16)

Директива SIZE

Возвращает размер элемента данных, выделенного для переменной

Источник

Что такое директива ассемблера

Все ассемблерные директивы имеют имена, начинающиеся с точки (`.’). Остальная часть имени пишется буквами, обычно строчными.

В этой главе обсуждаются те директивы, которые доступны независимо от целевой платформы, под которую сконфигурирован GNU-ассемблер. Некоторые машинные конфигурации поддерживают дополнительные директивы. Смотрите главу 8, «Архитектурные особенности».

При выводе в формате b.out as воспринимает эту директиву, но игнорирует ее.

Дополняет счетчик места (в данной подсекции) до некоторой границы. Первое выражение (которое должно быть абсолютным) есть требуемое выравнивание, как объяснено ниже. Второе выражение (также абсолютное) задает значение, которое должно быть записано в добавляемые байты. Это выражение (и запятая) могут быть опущены. Если они опущены, то добавляются нули.

.ascii ожидает ноль или более строковых литералов (смотрите раздел 3.6.1.1 Строки), отделенных запятыми. Эта директива ассемблирует каждую строку (без автоматической подстановки нулевого байта в конец строки) в последовательные адреса памяти.

Расширяет счетчик места (в данной подсекции) до некоторой границы. Первое выражение (которое должно быть абсолютным) есть требуемое выравнивание. Например,.balign 8 увеличивает счетчик места до кратного 8. Если счетчик места уже кратен 8, то никаких изменений не нужно.

Второе выражение (также абсолютное) задает значение, которое должно быть записано в добавляемые байты. Это выражение (и запятая) могут быть опущены. Если они опущены, то добавляются нули.

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

.data указывает, что as должен ассемблировать последующие операторы в конец подсекции data с номером ПОДСЕКЦИЯ (который является абсолютным выражением). Если ПОДСЕКЦИЯ опущена, то по умолчанию предполагается ноль.

Эта директива усианавливает дескриптор символа (смотрите раздел 5.5 «Атрибуты Сивола») в младшие 16 бит абсолютного выражения.

.dim имеет смысл только при выводе в формат COFF; когда as сконфигурирован для вывода в b.out, он допускает эту директиву, но игнорирует ее.

.double ожидает ноль или более чисел с плавающей точкой, разделенных запятыми. Эта директива ассемблирует числа с плавающей точкой. Точный вид выдаваемых чисел с плавающей точкой зависит от конфигурации as. Смотрите главу 8 «Архитектурные особенности».

Заставляет завершить страницу листинга в месте, где встретилась эта директива.

.endef имеет смысл только при выводе в формате COFF; если as сконфигурирован для вывода в формате b.out, он допускает эту директиву, но игнорирует ее.

PАЗМЕP и ЗHАЧЕHИЕ могyт быть опyщены. Если втоpая запятая и ЗHАЧЕHИЕ отсyтствyют, то ЗHАЧЕHИЕ пpедполагается нyлем. Если первая запятая и следующие аргументы отсутствуют, то РАЗМЕР полагается 1.

.global делает символ видимым для ld. Если вы определяете СИМВОЛ в частичной программе, то его значение становится доступным для других частичных программ, слинкованных вместе с этой. В противном случае СИМВОЛ получит свои атрибуты из символа с тем же именем, но определенным в другом файле, слинкованном в эту же программу.

Оба написания (.globl и.global) допустиы для совместимости с другими ассемблерами.

Эта директива ожидает ноль или более ВЫРАЖЕНИЙ и выдает для каждого из них 16-битное число.

Эта директива используется некоторыми ассемблерами для помещения меток объектные файлы. As допускает эту директиву для совместимости с некоторыми ассемблерами, но на самом деле ничего в связи с этим не делает.

Ассемблирует следующую секцию кода, если данный СИМВОЛ был определен.

Ассемблирует следующую секцию кода, если данный СИМВОЛ не был определен. Оба варианта написания эквивалентны.

Ожидает ноль или более ВЫРАЖЕНИЙ, любой секции, разделенных запятыми. Для каждого выражения выдает число, которое во время исполнения будет равно значению выражения. Порядок байт и число битов числа зависят от типа целевой машины.

As допускает эту директиву для совместимости с другими ассемблерами, но игнорирует ее.

Меняет логический номер строки. НОМЕР_СТРОКИ должен быть абсолютным выражением. Следующая строка имеет этот логический номер. Тем не менее, дpyгой опеpатоp на этой стpоке (после знака pазделителя опеpатоpов) имеет номеp HОМЕP_СТPОКИ-1. Когда-нибyдь as перестанет поддерживать эту директиву: она распознается только для совместимости с существующими ассемблерными программами.

Команды.macro и.endm позволяют Вам определить макросы, которые создают ассемблерный вывод. Например, вот определение макроса sum, который записывает в память последовательность чисел.

.macro ИМЯ_МАКРОСА АРГУМЕНТЫ_МАКРОСА

Начинает определение макроса comm, который не имеет аргументов.

Оба оператора начинают определение макроса plus1, который имеет два аргумента, внутри определения макроса \p и \p1 обозначают значения аргументов.

.macro reserve_str p1=0 p2

Начинает определение макроса reserve_str с двумя аргументами. Пеpвый имеет значение по yмолчанию, а втоpой нет. После завеpшения опpеделения вы можете вызвать макpос как reserve_str A,B (с \p1 означающим A и \p2 означающим B), так и reserve_str,B (с \p1 имеющим щначение по умолчанию, в данном случае \p2 означающим B). Когда вы вызываете макрос вы можете задать значение аргумента как позицией, так и ключевым словом. Например, sum 9,17 эквивалентно sum to=17, from=9.

Обозначает конец определения макроса.

Преждевременный выход из текущего определения макроса.

As хранит число выполненых макросов в этой псевдо-переменной; вы можете вывести это число при помощи \@, но только внутри определения макроса.

Эта директива ожидает ноль или более больших чисел, разделенных запятыми. Для каждого большого числа она выдает 16-байтное целое.

Поскольку as пытается ассемблировать программу за один проход, NEW-LC не может быть неопределенным.

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

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

As создает новую страницу в любом случае, когда превышается число строк (или когда вы явно указываете это, используя eject).

Использует ПОДЗАГОЛОВОК в качестве заглавия (третья строчка после заглавной строки) при создании ассемблерного листинга.

Эта директива влияет на последующие страницы, также как и на текущую, если она появляется в первых десяти строках этой страницы.

Устанавливает значение символа в выражение. Это меняет значение и тип символа в соответствии с выражением. Если символ был отмечен внешним, то он остается внешним. (Смотpите pаздел 5.5 Атpибyты Символа.)

Вы можете использовать этy диpективy по отношению к символy многокpатно.

Если вы использyете этy диpективy по отношению к глобальномy символy, то в объектный файл записывается последнее установленное значение.

.size имеет смысл только при выводе в формате COFF; когда as выводит в b.out, он допускает эту директиву, но игнорирует ее.

На AMD 29K эта директива игнорируется, она допускается для совместимости с другими ассемблерами AMD 29K.

Это имя символа. Оно может содержать любые знаки кроме \000, так что это более общее понятие, чем обычные имена символов. Некоторые отладчики используют для кодирования произвольных сложных структур имена символов, используя это поле.

Абсолютное выражение. Тип символа устанавливается в 8 младших бит этого выражения. Любые битовые маски разрешены, но ld и отладчики используют самые примитивные битовые маски.

Абсолютное выражение. Этот атрибут символа устанавливается в младшие 8 бит выражения.

Абсолютное выражение. Дескриптор символа устанавлиается в младшие 16 бит выражения.

Абсолютное выражение, которое становится значением символа

.stabd TYPE, OTHER, DESC

«Имя» символа не пустая строка. Это null-указатель, для совместимости. Старые ассемблеры используют null-указатели, так что они расходуют место в объектном файле на пустые строки.

Значение символа установлено в счетчик места, и способно изменятся. Когда ваша программа слинкована, значение этого символа есть адpес счетчика места во вpемя ассемблиpования.stabd.

.stabn TYPE, OTHER, DESC, VALUE

Имя символа yстановлено в пyстyю стpокy.

.stabs STRING, TYPE, OTHER, DESC, VALUE

Все пять полей опpеделены.

Копиpyет знаки в СТPОКА в объектный файл. Вы можете задать более одной стpоки, pазделив их запятыми. Если обpатное не оговоpено для конкpетной машины, то ассемблеp заканчивает стpокy нyлевым байтом. Вы можете использовать любyю escape-последовательность, описанную в разделе 3.6.1.1 «Строки».

.tag используется только при выводе в формате COFF; когда as создает объектный модуль в формате b.out, эта директива допускается, но игнорируется.

.text указывает as, что он должен ассемблировать следующие операторы в конец подсекции text с номером ПОДСЕКЦИЯ (который является абсолютным выражением). Если ПОДСЕКЦИЯ опущена, то по умолчанию предполагается ноль.

Использует ЗАГОЛОВОК в качестве заглавия (вторая строчка после номера страницы и имени исходного файла) при создании ассемблерного листинга.

Эта директива влияет на следующие страницы, также как и на текущую, если она появляется в первых десяти строках этой страницы.

.type связан с форматом объектного модуля COFF; когда as выводит в формате b.out, эта директива допускается, но игнорируется.

.val связан с форматом объектного модуля COFF; когда as выводит в формате b.out, эта директива допускается, но игнорируется.

Эта директива ожидает ноль или более ВЫPАЖЕHИЙ, любой секции, pазделенных запятыми.

Pазмеp выдаваемого числа и поpядок байт в нем зависит от платфоpмы, для котоpой осyществляется ассемблиpование.

Пpедyпpеждение: Специальная Обpаботка для поддеpжки Компилятоpов

Машины с 32-битным адpесным пpостpанством, но испоьзyющие мене чем 32-битнyю адpесацию, тpебyют следyющей особой обpаботки. Если интеpесyющая вас машина имеет 32-битнyю адpесацию (или допускает ее; смотрите главу 8 «Архитектурные Особенности»), Вы можете проигнорировать этот текст.

Когда-нибудь эти директивы перестанут работать. Они включены для совместимости с другими ассемблерами.

Источник

Справка по Ассемблеру для Atmel AVR

Компилятор работает с исходными файлами, содержащими инструкции, метки и директивы. Инструкции и директивы, как правило, имеют один или несколько операндов.

Строка кода не должна быть длиннее 120 символов.

Любая строка может начинаться с метки, которая является набором символов заканчивающимся двоеточием. Метки используются для указания места, в которое передаётся управление при переходах, а также для задания имён переменных.

Входная строка может иметь одну из четырёх форм:

Комментарий имеет следующую форму:

Позиции в квадратных скобках необязательны. Текст после точки с запятой (;) и до конца строки игнорируется компилятором. Метки, инструкции и директивы более детально описываются ниже.

Примеры:

test:═════ rjmp test════ ; Бесконечный цикл (Это инструкция)
════════════════════════ ; Строка с одним только комментарием

Компилятор не требует чтобы метки, директивы, комментарии или инструкции находились в определённой колонке строки.

═ Инструкции процессоров AVR

Ниже приведен набор команд процессоров AVR, более детальное описание их можно найти в AVR Data Book.

Арифметические и логические инструкции

Инструкции ветвления

Инструкции передачи данных

* Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций LD, ST, LDD, STD, LDS, STS, PUSH и POP, необходимо добавить один цикл плюс по одному циклу для каждого ожидания.

Инструкции работы с битами


Ассемблер не различает регистр символов.

Операнды могут быть таких видов:

Rd: Результирующий (и исходный) регистр в регистровом файле
Rr: Исходный регистр в регистровом файле
b: Константа (3 бита), может быть константное выражение
s: Константа (3 бита), может быть константное выражение
P: Константа (5-6 бит), может быть константное выражение
K6; Константа (6 бит), может быть константное выражение
K8: Константа (8 бит), может быть константное выражение
k: Константа (размер зависит от инструкции), может быть константное выражение
q: Константа (6 бит), может быть константное выражение
Rdl:═ R24, R26, R28, R30. Для инструкций ADIW и SBIW
X,Y,Z: Регистры косвенной адресации (X=R27:R26, Y=R29:R28, Z=R31:R30)

Директивы ассемблера

Компилятор поддерживает ряд директив. Директивы не транслируются непосредственно в код. Вместо этого они используются для указания положения в программной памяти, определения макросов, инициализации памяти и т.д. Список директив приведён в следующей таблице.

ДирективаОписание
BYTE Зарезервировать байты в ОЗУ
CSEG Программный сегмент
DB Определить байты во флэш или EEPROM
DEF Назначить регистру символическое имя
DEVICE Определить устройство для которого компилируется программа
DSEG Сегмент данных
DW Определить слова во флэш или EEPROM
ENDM, ENDMACRO Конец макроса
EQU Установить постоянное выражение
ESEG Сегмент EEPROM
EXIT Выйти из файла
INCLUDE Вложить другой файл
LIST Включить генерацию листинга
LISTMAC Включить разворачивание макросов в листинге
MACROНачало макроса
NOLIST Выключить генерацию листинга
ORG Установить положение в сегменте
SET Установить переменный символический эквивалент выражения

Все директивы предваряются точкой.

Директива BYTE резервирует байты в ОЗУ. Если вы хотите иметь возможность ссылаться на выделенную область памяти, то директива BYTE должна быть предварена меткой. Директива принимает один обязательный параметр, который указывает количество выделяемых байт. Эта директива может использоваться только в сегменте данных(смотреть директивы CSEG и DSEG). Выделенные байты не инициализируются.

.CSEG
════════ ldi r30,low(var1)═ ; Загружает младший байт регистра Z
════════ ldi r31,high(var1) ; Загружает старший байт регистра Z
════════ ld r1,Z═══════════ ; Загружает VAR1 в регистр 1

Директива CSEG определяет начало программного сегмента. Исходный файл может состоять из нескольких программных сегментов, которые объединяются в один программный сегмент при компиляции. Программный сегмент является сегментом по умолчанию. Программные сегменты имеют свои собственные счётчики положения которые считают не побайтно, а по словно. Директива ORG может быть использована для размещения кода и констант в необходимом месте сегмента. Директива CSEG не имеет параметров.

Директива DB резервирует необходимое количество байт в памяти программ или в EEPROM. Если вы хотите иметь возможность ссылаться на выделенную область памяти, то директива DB должна быть предварена меткой. Директива DB должна иметь хотя бы один параметр. Данная директива может быть размещена только в сегменте программ (CSEG) или в сегменте EEPROM (ESEG).

Директива DEF позволяет ссылаться на регистр через некоторое символическое имя. Назначенное имя может использоваться во всей нижеследующей части программы для обращений к данному регистру. Регистр может иметь несколько различных имен. Символическое имя может быть переназначено позднее в программе.

Синтаксис:
.DEF Символическое_имя = Регистр

.CSEG
═ldi temp,0xf0═ ; Загрузить 0xf0 в регистр temp (R16)
═in ior,0x3f═ ; Прочитать SREG в регистр ior (R0)
═eor temp,ior═ ; Регистры temp и ior складываются по исключающему или

Директива DEVICE позволяет указать для какого устройства компилируется программа. При использовании данной директивы компилятор выдаст предупреждение, если будет найдена инструкция, которую не поддерживает данный микроконтроллер. Также будет выдано предупреждение, если программный сегмент, либо сегмент EEPROM превысят размер допускаемый устройством. Если же директива не используется то все инструкции считаются допустимыми, и отсутствуют ограничения на размер сегментов.

Синтаксис:
.DEVICE AT90S1200 |AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103

Пример:
.DEVICE AT90S1200═ ; Используется AT90S1200

.CSEG
═══════ push r30══ ; Эта инструкция вызовет предупреждение
══════════════════ ; поскольку AT90S1200 её не имеет

Директива DSEG определяет начало сегмента данных. Исходный файл может состоять из нескольких сегментов данных, которые объединяются в один сегмент при компиляции. Сегмент данных обычно состоит только из директив BYTE и меток. Сегменты данных имеют свои собственные побайтные счётчики положения. Директива ORG может быть использована для размещения переменных в необходимом месте ОЗУ. Директива не имеет параметров.

.CSEG
═══════ ldi r30,low(var1)═══ ; Загрузить младший байт регистра Z
═══════ ldi r31,high(var1)══ ; Загрузить старший байт регистра Z
═══════ ld r1,Z═════════════ ; Загрузить var1 в регистр r1

Директива DW резервирует необходимое количество слов в памяти программ или в EEPROM. Если вы хотите иметь возможность ссылаться на выделенную область памяти, то директива DW должна быть предварена меткой. Директива DW должна иметь хотя бы один параметр. Данная директива может быть размещена только в сегменте программ (CSEG) или в сегменте EEPROM (ESEG).

Директива определяет конец макроопределения, и не принимает никаких параметров. Для информации по определению макросов смотрите директиву MACRO.

Пример:
.MACRO SUBI16══════════════ ; Начало определения макроса
═══════ subi r16,low(@0)═══ ; Вычесть младший байт первого параметра
═══════ sbci r17,high(@0)══ ; Вычесть старший байт первого параметра
.ENDMACRO

Директива EQU присваивает метке значение. Эта метка может позднее использоваться в выражениях. Метка которой присвоено значение данной директивой не может быть переназначена и её значение не может быть изменено.

Синтаксис:
.EQU метка = выражение

Пример:
.EQU io_offset = 0x23
.EQU porta════ = io_offset + 2

.CSEG════════════════ ; Начало сегмента данных
═══════ clr r2═══════ ; Очистить регистр r2
═══════ out porta,r2═ ; Записать в порт A

Директива ESEG определяет начало сегмента EEPROM. Исходный файл может состоять из нескольких сегментов EEPROM, которые объединяются в один сегмент при компиляции. Сегмент EEPROM обычно состоит только из директив DB, DW и меток. Сегменты EEPROM имеют свои собственные побайтные счётчики положения. Директива ORG может быть использована для размещения переменных в необходимом месте EEPROM. Директива не имеет параметров.

Встретив директиву EXIT компилятор прекращает компиляцию данного файла. Если директива использована во вложенном файле (см. директиву INCLUDE), то компиляция продолжается со строки следующей после директивы INCLUDE. Если же файл не является вложенным, то компиляция прекращается.

Пример:
.EXIT═ ; Выйти из данного файла

Встретив директиву INCLUDE компилятор открывает указанный в ней файл, компилирует его пока файл не закончится или не встретится директива EXIT, после этого продолжает компиляцию начального файла со строки следующей за директивой INCLUDE. Вложенный файл может также содержать директивы INCLUDE.

Пример:
; файл iodefs.asm:
.EQU sreg══ = 0x3f════ ; Регистр статуса
.EQU sphigh = 0x3e════ ; Старший байт указателя стека
.EQU splow═ = 0x3d════ ; Младший байт указателя стека

; файл incdemo.asm
.INCLUDE iodefs.asm═══ ; Вложить определения портов
═══════ in r0,sreg════ ; Прочитать регистр статуса

Директива LIST указывает компилятору на необходимость создания листинга. Листинг представляет из себя комбинацию ассемблерного кода, адресов и кодов операций. По умолчанию генерация листинга включена, однако данная директива используется совместно с директивой NOLIST для получения листингов отдельных частей исходных файлов.

Пример:
.NOLIST═══════════════ ; Отключить генерацию листинга
.INCLUDE "macro.inc"══ ; Вложенные файлы не будут
.INCLUDE "const.def"══ ; отображены в листинге
.LIST═════════════════ ; Включить генерацию листинга

После директивы LISTMAC компилятор будет показывать в листинге содержимое макроса. По умолчанию в листинге показывается только вызов макроса и передаваемые параметры.

Пример:
.MACRO MACX════════ ; Определение макроса
═══════ add═ r0,@0═ ; Тело макроса
═══════ eor═ r1,@1═
.ENDMACRO══════════ ; Конец макроопределения

.LISTMAC═══════════ ; Включить разворачивание макросов
═══════ MACX r2,r1═ ; Вызов макроса (в листинге будет показано тело макроса)

С директивы MACRO начинается определение макроса. В качестве параметра директиве передаётся имя макроса. При встрече имени макроса позднее в тексте программы, компилятор заменяет это имя на тело макроса. Макрос может иметь до 10 параметров, к которым в его теле обращаются через @0-@9. При вызове параметры перечисляются через запятые. Определение макроса заканчивается директивой ENDMACRO.

По умолчанию в листинг включается только вызов макроса, для разворачивания макроса необходимо использовать директиву LISTMAC. Макрос в листинге показывается знаком +.

Синтаксис:
.MACRO макроимя

Пример:
.MACRO SUBI16══════════════════ ; Начало макроопределения
═══════ subi @1,low(@0)════════ ; Вычесть младший байт параметра 0 из параметра 1
═══════ sbci @2,high(@0)═══════ ; Вычесть старший байт параметра 0 из параметра 2
.ENDMACRO══════════════════════ ; Конец макроопределения

.CSEG══════════════════════════ ; Начало программного сегмента
═══════ SUBI16 0x1234,r16,r17══ ; Вычесть 0x1234 из r17:r16

Директива NOLIST указывает компилятору на необходимость прекращения генерации листинга. Листинг представляет из себя комбинацию ассемблерного кода, адресов и кодов операций. По умолчанию генерация листинга включена, однако может быть отключена данной директивой. Кроме того данная директива может быть использована совместно с директивой LIST для получения листингов отдельных частей исходных файлов

Пример:
.NOLIST═══════════════ ; Отключить генерацию листинга
.INCLUDE "macro.inc"══ ; Вложенные файлы не будут
.INCLUDE "const.def"══ ; отображены в листинге
.LIST═════════════════ ; Включить генерацию листинга

.CSEG
.ORG 0x10═══════════ ; Установить программный счётчик равным 0x10
═════════ mov r0,r1═ ; Данная команда будет размещена по адресу 0x10

Директива SET присваивает имени некоторое значение. Это имя позднее может быть использовано в выражениях. Причем в отличии от директивы EQU значение имени может быть изменено другой директивой SET.

Синтаксис:
.SET имя = выражение

Пример:
.SET io_offset = 0x23
.SET porta════ = io_offset + 2

.CSEG════════════════ ; Начало кодового сегмента
═══════ clr r2═══════ ; Очистить регистр 2
═══════ out porta,r2═ ; Записать в порт A

Выражения

Компилятор позволяет использовать в программе выражения которые могут состоять операндов, знаков операций и функций. Все выражения являются 32-битными.

Операнды

Могут быть использованы следующие операнды:

Операции

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

ПриоритетСимволОписание
14!Логическое отрицание
14Побитное отрицание
14-Минус
13*Умножение
13/Деление
12+Суммирование
12-Вычитание
11 >Сдвиг вправо
10Больше чем
10>=Больше или равно
9==Равно
9!=Не равно
8&Побитное И
7^Побитное исключающее ИЛИ
6|Побитное ИЛИ
5&&Логическое И
4||Логическое ИЛИ

Логическое отрицание

Побитное отрицание

Описание: Возвращает выражение в котором все биты проинвертированы
Приоритет: 14
Пример: ldi r16,

0xf0═ ; В r16 загрузить 0x0f

Минус

Умножение

Символ: *
Описание: Возвращает результат умножения двух выражений
Приоритет: 13
Пример: ldi r30, label*2

Деление

Символ: /
Описание: Возвращает целую часть результата деления левого выражения на правое
Приоритет: 13
Пример: ldi r30, label/2

Суммирование

Символ: +
Описание: Возвращает сумму двух выражений
Приоритет: 12
Пример: ldi r30, c1+c2

Вычитание

Сдвиг влево

Символ: >
Описание: Возвращает левое выражение сдвинутое вправо на число бит указанное справа
Приоритет: 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 в противном случае
Приоритет: 9
Пример: andi r19, bitmask*(c1==c2)+1

Не равно

Побитное И

Символ: &
Описание: Возвращает результат побитового И выражений
Приоритет:═ 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)

Функции

Определены следующие функции:

Использование программы

Этот раздел описывает использование компилятора и встроенного редактора

Открытие файлов

В WAVRASM могут быть открыты как новые так и существующие файлы. Количество открытых файлов ограничено размером памяти, однако объём одного файла не может превышать 28 килобайт (в связи с ограничением MS-Windows). Компиляция файлов большего размера возможна, но они не могут быть редактируемы встроенным редактором. Каждый файл открывается в отдельном окне.

Сообщения об ошибках

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

Если по строке в окне сообщений клацнуть дважды, то окно файла с указанной ошибкой становится активным, и курсор помещается в начале строки содержащей ошибку. Если же файл с ошибкой не открыт (например это вложенный файл) то он будет автоматически открыт.

Учтите, что если вы внесли изменения в исходные тексты (добавили или удалили строки), то информация о номерах строк в окне сообщений не является корректной.

Опции

Некоторые установки программы могут быть изменены через пункт меню «Options».

Atmel, AVR являются зарегистрированными товарными знаками фирмы Atmel Corporation

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *