[имя] DB выражение [,…….]
определяет переменную или присваивает ячейке памяти начальное значение. Резервирует 1 или более байт (при наличии запятых)
DW
[имя] DW выражение [,…….]
аналогично предыдущему резервирует двухбайтовые слова
DD
[имя] DD выражение [,…….]
Резервирует 4-х байтовые двойные слова
Псевдооператор
Формат и Функция
Определения сегмента или процедуры
SEGMENT
Имя_cer SEGMENT [тип_выравнивания (подгонки)] [тип_связи] [‘класс’]
. . . .
Имя_cer ENDS
Определяет границы сегмента программы. Обязательно содержит начало описания Имя_cer SEGMENT и окончание описания Имя_cer ENDS
ASSUME
ASSUME регистр_cer: Имя_cer [,…….]
Или ASSUME регистр_cer: NOTHING
Cообщает Ассемблеру, какой регистр сегмента связан с соответствующим сегментом программы. Оператор ASSUME регистр_cer: NOTHING отменяет действие всех предыдущих операторов ASSUME для данного регистра
PROC
Имя PROC [NEAR] или Имя PROC FAR
. . . .
. . . .
RET
имя ENDP
Присваивает имя последовательности операторов. Должно иметь начало PROC и окончание ENDP
Управление трансляцией
END
END [метка точки входа]
Отмечает конец исходной программы
Внешние ссылки
PUBLIC
PUBLIC идентификатор
Делает определенный ранее идентификатордоступным другим модулям программы, которые впоследствии должны быть присоединены к данному модулю
EXTERN
EXTERN имя: тип [, ….]
Указывает, что имя определено в другом модуле программы
INCLUDE
INCLUDE файл вставляет содержимое указанного файла в текущий файл исходной программы
Псевдооператор
Формат и Функция
Определение идентификаторов
EQU
Имя EQU текст или
Имя EQU числовое_выражение
Постоянно присваивает идентификатору имя текст или числовое_выражение
Имя = числовое_выражение
Числовое_выражение присваивается идентификатору имя, но может быть переприсвоено
Директивы определения данных присутствуют только в сегменте данных (сегмент данных является аналогом раздела VAR в программах на языке Паскаль). Как и в других языках программирования, для операций с данными необходимо указать в команде имя этого элемента данных, и также имена данных должны быть уникальными и не совпадать с зарезервированными словами (мнемокодами команд или псевдооператорами).
Важно отметить, что функциональное назначение сегментации несколько шире, чем просто разбиение программы на сегменты кода и данных. Сегментация является частью более общего механизма, связанного с концепцией модульного программирования. Этот механизм предполагает унификацию оформления объектных модулей, создаваемых компилятором, в том числе с разных языков программирования. Это позволяет объединять части большой программы, написанные на разных языках.
В директиве SEGMENT тип_выравнивания указывает, на границе байта (BYTE) слова (WORD ), параграфа (PARA) или другой должен быть установлен адрес начала сегмента. Выравнивание на границу параграфа означает, что адрес начала сегмента д.б. кратен 16, слова - кратен 2.
Тип_связи (комбинирования сегментов) указывает, как нужно комбинировать сегменты различных модулей, имеющие одно и то же имя. По умолчанию предполагается PRIVATE, что означает, что сегмент не будет объединяться с сегментами с таким же именем вне данного модуля. PUBLIC заставляет компоновщик объединить все сегменты с одинаковым именем. Объединенный сегмент будет непрерывным, все адреса данных или команд будут определяется относительно начала этого сегмента. COMMON - все сегменты с одним именем располагаются по одному адресу (перекрываются).
'класс' заключенная в кавычки строка символов определяет назначение сегмента и помогает компоновщику определить порядок следования сегментов внутри программы. Формально этот порядок может быть любым, но лучше, если все сегменты кода (содержат команды обработки) объединяются в общую группу. Заключенное в кавычки слово класс может принимать следующие значения: code, stack, data, что означает соответственно сегмент кода (команд программы), сегмент стека и сегмент данных.
Все сегменты сами по себе равноправны, т.к. директива SEGMENT не содержит информации о функциональном назначении сегментов. Для того, чтобы Ассемблер использовал сегмент либо как сегмент кода, либо как сегмент данных, необходимо предварительно транслятору сообщить об этом в директиве ASSUME. Именно он сообщает транслятору, какой сегмент к какому сегментному регистру привязан.
Директивы определения данных по своим функциям и назначению аналогичны описаниям переменных в языках высокого уровня. Особенность в том, что слово DUP означает дубликат или иначе, повторение столько раз, сколько указано числом перед этим словом. Если после DUP в скобках указано значение, то оно будет занесено в память в начале работы программы. Если это значение?, то выделенный для переменной участок памяти инициализироваться не будет (останется таким, каким было при выполнении предыдущих действий).
Ниже приводится таблица примеров определения переменных в программе на ассемблере.
Таблица 5.2. Примеры определения переменных.
Имя
Директива определения
значения
комментарий
DB – определение байтов
BYTE1
DB
?
Без указания значения
BYTE2
DB
Десятичная константа
BYTE3
DB
30Н
Шестнадцатеричная константа
BYTE4
DB
01111010В
Двоичная константа
BYTE5
DB
10 DUP(0)
Десять нулевых значений
BYTE6
DB
‘Input simbol’
Строка символов
BYTE7
DB
‘12345’
Строка цифровых символов
BYTE8
DB
01, ‘Jan’, 02, ‘Feb’, 03, ‘mar’, 04, . . . .
Таблица месяцев года, состоит из числовых значений номера месяца и его сокращенного названия
DW – определение слов (16 бит=2 байта)
WORD1
DW
0fff0h
Шестнадцатеричная константа
WORD2
DW
01111010В
Двоичная константа
WORD3
DW
BYTE3
Константа адреса переменной
WORD4
DW
2,3,4,5,6
Таблица из 5 констант
WORD5
DW
8 DUP(0)
Восемь нулевых значений
DD – определение двойных слов (32 бита = 4 байта)
DWORD1
DD
?
Без значения
DWORD2
DD
Десятичное значение
DWORD3
DD
48Н, 24Н, СА
3 шестнадцатеричные константы
DWORD4
DD
WORD1
Адрес слова в виде сегмент:смещение
DWORD5
DD
BYTE8-BYTE5
Разность между адресами переменных (количество байт)