Ответы на билеты / Билет_06_
.docДИРЕКТИВЫ АССЕМБЛЕРА
Директива ASSUME
Назначение директивы ASSUME - установить для ассемблера связь между
сегментами и сегментными регистрами CS, DS, ES и SS. Формат директивы:
ASSUME сегментный_регистр:имя [, ... ]
В директиве указываются имена сегментных регистров, групп (GROUP) и
выражений SEG. Одна директива ASSUME может назначить до четырех сегментных
регистров в любой последовательности, например:
ASSUME CS:CODESG,DS:DATASG,SS:STACK,ES:DATASG
Для отмены любого ранее назначенного в директиве ASSUME сегментного
регистра необходимо использовать ключевое слово NOTHING:
ASSUME ES:NOTHING
Если, например, регистр DS оказался не назначен или отменен ключевым
словом NOTHING, то для ссылки к элементу из сегмента данных в командах
используется операнд со ссылкой к регистру DS:
MOV AX,DS:[BX] ;Использование индексного адреса
MOV AX,DS:FLDW ;Пересылка содержимого поля FLDW
Конечно, регистр DS должен содержать правильное значение сегментного
адреса.
Директива GROUP
Программа может содержать несколько сегментов одного типа (код,
данные, стек). Назначение директивы GROUP - собрать однотипные сегменты
под одно имя так, чтобы они поместились в один сегмент объемом 64 Кбайт,
формат директивы:
имя GROUP имя сегмента [, ... ]
Следующая директива GROUP объединяет SEG1 и SEG2 в одном ассемблерном
модуле:
GROUPX GROUP SEG1,SEG2
SEG1 SEGMENT PARA 'CODE'
ASSUME CS:GROUPX
SEG1 ENDS
SEG2 SEGMENT PARA 'CODE'
ASSUME CS:GROUPX
SEG2 ENDS
Директива PUBLIC
Назначение директивы PUBLIC - информировать ассемблер, что на указанные
имена имеются ссылки из других ассемблерных модулей. Формат директивы:
PUBLIC имя [,...]
Директива SEGMENT
Ассемблерный модуль может состоять из одного или более сегментов,
части сегмента или даже частей нескольких сегментов. Формат директивы:
имя_сегмента SEGMENT [выравнивание] [объединение] [класс]
.
.
.
имя_сегмента ENDS
Все операнды являются необязательными. Ниже описаны операнды для
выравнивания, объединения и указания класса.
В ы р а в н и в а н и е. Операнд выравнивания определяет начальную
границу сегмента, например
PAGE = xxx00
PARA = хххх0 (граница по умолчанию)
WORD = ххххe (четная граница)
BYTE = ххххх
где х - любая шестнадцатиричная цифра,
е - четная шестнадцатиричная цифра.
О б ъ е д и н е н и е. Операнд объединения указывает способ обработки
сегмента, при компоновке:
NONE: Значение по умолчанию. Сегмент должен быть логически отделен от
других сегментов, хотя физически он может быть смежным.
Предполагается, что сегмент имеет собственный базовый адрес;
PUBLIC: Все PUBLIC - сегменты, имеющие одинаковое имя и класс,
загружаются компоновщиком в смежные области. Все такие сегменты имеют
один общий базовый адрес;
STACK: Для компоновщика операнд STACK аналогичен операнду PUBLIC. В
любой компонуемой программе должен быть определен по крайней мере
один сегмент STACK. Если объявлено более одного стека, то стековый
указатель (SP) устанавливается на начало первого стека;
COMMON: Для сегментов COMMON с одинаковыми именами и классами
компоновщик устанавливает один общий базовый адрес. При выполнении
происходит наложение второго сегмента на первый. Размер общей области
определяется самым длинным сегментом;
AT-параграф: Параграф должен быть определен предварительно. Данный
операнд обеспечивает определение меток и переменных по фиксированным
адресам в фиксированных областях памяти, таких, как ROM или таблица
векторов прерываний в младших адресах памяти. Например, для
определения адреса дисплейного видеобуфера используется
VIDEO_RAM SEGMENT AT 0B800H
Класс: Операнд класс может содержать любое правильное имя,
заключенное в одиночные кавычки. Данный операнд используется
компоновщиком для обработки сегментов, имеющих одинаковые имена и
классы. Типичными примерами являются классы 'STACK' и 'CODE'.
Следующие два сегмента объединяются компоновщиком в один физический
сегмент при одном значении сегментного регистра:
Ассемблерный SEG1 SEGMENT PARA PUBLIC 'CODE'
модуль 1 ASSUME CS:SEG1
...
SEG1 ENDS
Ассемблерный SEG2 SEGMENT PARA PUBLIC 'CODE'
модуль 2 ASSUME CS:SEG1
...
SEG2 ENDS
--------------------------------
Сегменты могут быть вложенными один в другой:
SEG1 SEGMENT
... Начало SEG1
SEG2 SEGMENT
... Область SEG2
SEG2 ENDS
... Конец SEG1
SEG1 ENDS
Для объединения сегментов в группы используйте директиву GROUP.