![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Упрощенное описание сегментов, используемое с указанием стандартной модели памяти, в большинстве случаев с успехом применяется в прикладных программах. Однако такое описание ограничивает гибкость в употреблении сегментов. Если требуется осуществлять полный контроль всех аспектов создания сегментов, необходимо пользоваться соответствующими директивами. Директива SEGMENT открывает сегмент. Любые команды или данные, следующие за этой директивой, помещаются в указанный сегмент до тех пор, пока не встретится директива ENDS, закрывающая сегмент.
В режиме IDEAL директива имеет следующий формат:
SEGMENT <имя> [<выравнив.><объединение><размер><'класс'><доступ>]
В режиме MASM синтаксис более естественный:
<имя> SEGMENT [<атрибуты>]
Имя – обязательный параметр, являющийся именем, определяемым пользователем, атрибуты - необязательные параметры, указывающие на некоторые свойства сегмента. Атрибуты определяют выравнивание сегмента в памяти на границе байта, слова, двойного слова, параграфа (16 байт) или страницы (256 байт). Другие атрибуты определяют способ, объединения сегмента с другими сегментами с тем же именем и классом сегмента.
Атрибуты выравнивания сегмента:
BYTE – сегмент может начинаться с любого адреса;
WORD – сегмент начинается на границе следующего слова;
DWORD – сегмент начинается на границе двойного слова;
PARA – используется по умолчанию, сегмент начинается на границе параграфа;
PAGE – сегмент начинается на границе страницы (256 байт);
MEMPAGE – сегмент начинается на границе страницы памяти (4 К байт).
Некоторые значения атрибута объединения:
PRIVATE – сегмент не будет объединяться с другими сегментами, находящимися в других модулях и имеющих то же имя, используется по умолчанию;
PUBLIC – сегмент будет объединяться с одноименными сегментами из других модулей в один сегмент;
MEMORY – идентичен PUBLIC, сегмент объединяется при компоновке с одноименными сегментами;
STACK – сегмент стека в явном виде должен быть отмечен с помощью этого атрибута при полном описании сегментов;
COMMON – одноименные сегменты начинаются по одному и тому же адресу, они будут занимать перекрывающуюся разделяемую область памяти;
AT <выражение> - сегмент размещается по абсолютному адресу параграфа, определяемому выражением.
Атрибуты размера:
USE16 – устанавливается по умолчанию, позволяет 16-разрядное внутрисегментное смещение и ограничивает размер сегмента в 64К байт;
USE32 - позволяет 32-разрядное смещение и ограничивает размер сегмента в 4Гбайт.
Атрибут класса представляет собой заключенное в апострофы имя, которое позволяет компоновщику группировать сегменты с одинаковым классом.
Атрибут доступа может принимать следующие значения:
EXECONLY – сегмент может содержать только код;
EXECREAD - сегмент может содержать код и данные только для чтения;
READONLY - сегмент может содержать только данные для чтения;
READWRITE - сегмент может содержать только изменяемые данные.
Формат завершающей сегмент директивы END в режиме IDEAL:
ENDS [<имя>], в режиме MASM: <имя> ENDS, где <имя.> имя сегмента, использованное в директиве SEGMENT.
В кодовом сегменте должна присутствовать директива ASSUME, связывающая имена сегментных регистров с именами сегментов, формат для разных режимов компилятора одинаковый:
ASSUME <сег._рег.>:<имя>[,…]
Директива GROUP используется для помещения сегментов в группу. Группа позволяет обеспечить доступ к данным всех сегментов, которые находятся в группе, с помощью одной загрузки адреса группы в сегментный регистр. Формат директивы:
GROUP <имя_группы> <имя>[,…]
где <имя_группы> - имя, определяемое пользователем, а <имя> – имя сегмента, использованное в директиве SEGMENT.
Квадратные скобки означают, что за первым обязательным аргументом директивы через запятую может следовать очередной аналогичный по смыслу аргумент.
Дата публикования: 2015-10-09; Прочитано: 307 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!