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

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

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

Таблица 3.5 Список директив ассемблера

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

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

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

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

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

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

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

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

.DEVICE AT90S1200 |AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103

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

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

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

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

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

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

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

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

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

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

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

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

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

.SET имя = выражение

Выражения

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

Операнды

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

Источник

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

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

В этой главе обсуждаются те директивы, которые доступны независимо от целевой платформы, под которую сконфигурирован 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 «Архитектурные Особенности»), Вы можете проигнорировать этот текст.

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

Источник

Урок 6

Работа с памятью

Сегмент данных предназначен для определения констант, рабочих полей и областей для вводв-вывода. В соответствии с имеющимися директивами в ассемблере разрешено определение данных различной длины: например, директива DB определяет байт, а директива DW oпределяет слово. Элемент данных может содержать непосредственное значение или константу, определенную как символьная строка или как числовое значение. Другим способом определения константы является непосредственное значение, т.е. указанное прямо в ассемблерной команде, например:

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

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

Ассемблер обеспечивает два способа определения данных: во-первых, через указание длины данных и, во-вторых, по их cодержимому. Рассмотрим основной формат определения данных:

или знак вопроса для неопределенного значения, например

Выражение может содержать несколько констант, разделенных запятыми и ограниченными только длиной строки:

загружает в регистр AL значение 14 (шест. 0E). Выражение допускает также повторение константы в следующем формате:

Следующие три примера иллюстрируют повторение:

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

Символьные строки

Числовые константы

Десятичный формат

Десятичный формат допускает десятичные цифры от 0 до 9 и обозначается последней буквой D, которую можно не указывать, например, 125 или 125D. Несмотря на то, что ассемблер позволяет кодирование в десятичном формате, он преобразует эти значения в шест. объектный код. Например, десятичное число 125 преобразуется в шест. 7D.

Шестнадцатиричный формат

Шестнадцатиричный формат допускает шест. цифры от 0 до F и обозначается последней буквой H. Так как ассемблер полагает, что с буквы начинаются идентификаторы, то первой цифрой шест. константы должна быть цифра от 0 до 9. Например, 2EH или 0FFFH, которые ассемблер преобразует соответственно в 2E и FF0F (байты во втором примере записы ваются в объектный код в обратной последовательности).

Двоичный формат

Двоичный формат допускает двоичные цифры 0 и 1 и обозначается последней буквой B. Двоичный формат обычно используется для более четкого представления битовых значений в логических командах AND, OR, XOR и TEST. Десятичное 12, шест. C и двоичное 1100B все генерируют один и тот же код: шест. 0C или двоичное 0000 1100 в зависимости от того, как вы рассматриваете содержимое байта.

Восмеричный формат

Восмеричный формат допускает восмеричные цифры от 0 до 7 и обозначается последней буквой Q или O, например, 253Q. На сегодня восмеричный формат используется весьма редко.

При записи символьных и числовых констант следует помнить, что, например, символьная константа, определенная как DB ’12’, представляет символы ASCII и генерирует шест. 3132, а числовая константа, oпределенная как DB 12, представляет двоичное число и генерирует шест. 0C.

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

Из различных директив, определяющих элементы данных, наиболее полезной является DB (определить байт). Символьное выражение в диpективе DB может содержать строку символов любой длины, вплоть до конца строки. Числовое выражение в директиве DB может содержать одну или более однобайтовых констант. Один байт выражается двумя шест. цифpами. Наибольшее положительное шест. число в одном байте это 7F, если подразумевается, что это число знаковое, и 0FF, если подразумевается, что число беззнаковое

Директива определения слова (DW)

Директива определения двойного слова (DD)

Директива определения учетверённого слова (DQ)

Ассемблер преобразует все числовые константы в директиве DQ в шест. представление, но записывает объектный код в обратной последовательности, как и в дирек- тивах DD и DW. Обработка ассемблером символьных строк в директиве DQ aналогично директивам DD и DW.

Директива определения десяти байт (DT)

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

Непосредственные операнды

Длина непосредственных операндов

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

однако, если непосредственный операнд короче, чем получающий операнд, как в следующем примере

то ассемблер расширяет непосредственный операнд до двух байт, 0025 и записывает объектный код в виде 2500.

Непосредственные форматы

Непосредственная константа может быть шестнадцатиричной, напpимер, 0123H; десятичной, например, 291 (которую ассемблер конвертирует в шест.0123); или двоичной, например, 100100011В (которая преобразуется в шест. 0123). Ниже приведен список команд, которые допускают непосредственные операнды:

Директива EQU

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

Имя, в данном случае TIMES, может быть представлено любым допустимым в ассемблере именем. Теперь, в какой-бы команде или директиве не использовалось слово TIMES ассемблер подставит значение 10. Например, ассемблер преобразует директиву

Имя, связанное с некоторым значением с помощью директивы EQU, может использоваться в командах, например:

Ассемблер заменяет имя COUNTR в команде MOV на значение 05, cоздавая операнд с непосредственным значением, как если бы было закодировано

Здесь приемущество директивы EQU заключается в том, что многие команды могут использовать значение, определенное по имени COUNTR. Если это значение должно быть изменено, то изменению подлежит лишь одна директива EQU. Естественно, что использование директивы EQU разумно лишь там, где подстановка имеет смысл для ассемблера. В директиве EQU можно использовать символические имена:

Первый пример предполагает, что в сегменте данных программы опpеделено имя TOTALPAY. Для любой команды, содержащей операнд TP, ассемблер заменит его на адрес TOTALPAY. Второй пример показывает возможность использования в программе слова MPY вместо обычного мнемокода MUL.

Работа с файлами в MS-DOS

Функции типа дескриптора

Для работы с файлом с помощью функции типа дескриптора, нужно поместить адрес имени файла в DS:DX. В регистр ah помещается номер функции, после чего вызывается прерывание int 21H. Все функции типа дескриптора после выполнения возвращают опущенный флаг переноса, если функция выполнена успешно и наоборот. Чтобы совершить переход к вашему обработчику ошибки, выполните команду

Создание файла

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

По заданному в коде ASCIIZ пути открывает файл на указанном или текущем диске или на указанном или текущем каталоге. Возвращается дескриптор. При вызове:

Закрытие файла

Источник

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

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