|
Ассемблерная программа определяет не только машинные команды, которые нужно выполнять процессору, но и команды, которые нужно выполнять самому ассемблеру (например, выделить немного памяти или выдать новую страницу листинга). Команды для ассемблера называются псевдокомандами, или ассемблерными директивами. В листинге 7.1 мы уже встречали типичную псевдокоманду DD. В табл. 7.2 перечислены некоторые другие псевдокоманды (директивы). Они взяты из ассемблера MASM семейства ассемблеров Intel.
Таблица 7.2. Некоторые директивы ассемблера MASM
|
Директива
SEGMENT
|
Описание
Начало нового сегмента (текста, данных и т. п.) с определенными
|
|
|
атрибутами
|
|
ENDS
|
Завершение текущего сегмента
|
|
ALIGN
|
Управление выравниванием следующей команды или данных
|
|
EQU
|
Определение нового символа, равного данному выражению
|
|
DB
|
Выделение памяти для одного или нескольких байтов
|
|
DW
|
Выделение памяти для одного или нескольких 16-разрядных полуслов
|
|
DD
|
Выделение памяти для одного или нескольких 32-разрядных слов
|
|
Директива
|
Описание
|
|
DQ
|
Выделение памяти для одного или нескольких 64-разрядных двойных слов
|
|
PROC
|
Начало процедуры
|
|
ENDP
|
Завершение процедуры
|
|
MACRO
|
Начало макроса
|
|
ENDM
|
Завершение макроса
|
|
PUBLIC
|
Экспорт имени, определенного в данном модуле
|
|
EXTERN
|
Импорт имени из другого модуля
|
|
INCLUDE
|
Вызов другого файла и включение его в текущий файл
|
|
IF
|
Начало условного ассемблирования программы на основе данного
|
|
|
выражения
|
|
ELSE
|
Начало условного ассемблирования программы, если условие для
|
|
|
директивы 1Р не выполнено
|
|
ENDIF
|
Завершение условного ассемблирования программы
|
|
COMMENT
|
Определение нового символа начала поля комментариев
|
|
PAGE
|
Принудительный разрыв страницы в листинге
|
|
END
|
Завершение ассемблерной программы
|
Директива SEGMENT начинает новый сегмент, а директива ENDS завершает его. Разрешается начинать текстовый сегмент, затем начинать сегмент данных, затем переходить обратно к текстовому сегменту и т. д.
Директива ALIGN передает следующую строку (обычно данные) по адресу, заданному аргументом директивы. Например, если текущий сегмент уже содержит 61 байт данных, тогда после выполнения директивы ALIGN 4 следующим выделяемым адресом будет адрес 64.
Директива EQU дает символическое название некоторому выражению. Например, после следующей директивы символ BASE можно использовать в программе вместо значения 1000:
BASE EQU 1000
Выражение, которое следует за директивой EQU, может содержать несколько символов, соединенных знаками арифметических и других операций, например:
LIMIT EQU 4 * BASE + 2000
Большинство ассемблеров, в том числе MASM, требуют, чтобы символ был определен в программе до его появления в таком выражении, как это.
Директивы DB, DD, DW и DQ выделяют память для одной или нескольких переменных размером 1, 2, 4 и 8 байт соответственно. Например:
TABLE DB 11, 23, 49
Эта директива выделяет место для 3 байт и присваивает им начальные значения 11, 23 и 49 соответственно, кроме того, она определяет символ TABLE, равный тому адресу, по которому хранится значение 11.
Директивы PR0C и ENDP определяют начало и конец ассемблерных процедур. Процедуры в ассемблере выполняют ту же роль, что и в языках программирования высокого уровня. Директивы MACRO и ENDM определяют начало и конец макроса. О макросах мы поговорим в следующем разделе.
Директивы PUBLIC и EXTERN определяют видимость (доступность) символов. Программы часто пишут в виде совокупности файлов. Иногда процедуре, находящейся в одном файле, нужно вызвать процедуру или получить доступ к данным, определенным в другом файле. Чтобы такие перекрестные ссылки между файлами стали возможными, символ (имя), который нужно сделать доступным для других файлов, экспортируется с помощью директивы PUBLIC. Чтобы ассемблер не выдавал предупреждений по поводу использования символа, который не определен в данном файле, этот символ может быть объявлен внешним (EXTERN), то есть определенным в другом файле. Символы, которые не определены ни в одной из этих директив, могут использоваться только в пределах одного файла. Поэтому даже если, например, символ F00 встречается в нескольких файлах, это не вызовет никакого конфликта, поскольку указанный символ локален по отношению к каждому файлу.
Директива INCLUDE заставляет ассемблер вызвать другой файл и включить его в текущий. Такие включенные файлы часто содержат определения, макросы и другие элементы, необходимые для разных файлов.
Многие языки ассемблера, в том числе MASM, поддерживают условное ассемблирование программы. Например:
WORDSIZE EQU 16 IF WORDSIZE GT 16 WSIZE: DW32 ELSE
WSIZE: DW 16 ENDIF
Эта программа выделяет в памяти одно 32-разрядное слово и вызывает его адрес WSIZE. Этому слову придается одно из значений: либо 32, либо 16 в зависимости от значения WORDSIZE (в данном случае - 16). Такая конструкция может использоваться в программах для 16-разрядных (как 8088) или 32-разрядных машин (как Pentium 4). Если в начале и в конце машинно-зависимого кода вставить директивы IF и ENDIF, а затем изменить единственное определение, WORDSIZE, программу можно автоматически настроить на один из двух размеров. Применяя такой подход, можно задействовать одну такую исходную программу для нескольких разных машин. В большинстве случаев все машинно-зависимые определения, такие как WORDSIZE, сохраняются в одном файле, причем для разных машин должны быть разные файлы. Путем включения файла с нужными определениями программу можно легко перекомпилировать для разных машин.
Директива COMMENT позволяет пользователю заменить символ начала комментария (точку с запятой) чем-либо другим. Директива PAGE используется для управления листингом программы. Наконец, директивой END помечается конец программы.
В ассемблере MASM есть еще много директив. Другие ассемблеры Pentium 4 содержат другой набор директив, поскольку эти директивы определяются не архитектурой машины, а вкусами разработчиков ассемблера.
⇐Формат оператора в ассемблере || Оглавление || Макросы⇒
|