Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прогр_на_ассембл_для_WINLOWS.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
908 Кб
Скачать
☆

2.6.3. Директивы упрощенного определения сегментов

Эти директивы употребляются в программе после описания модели памяти с помощью директивы MODEL. В тексте программного модуля директивы упрощенного описания могут располагаться в произвольном порядке. Turbo Assembler компонует все части с одинаковыми именами в один сегмент. Ниже приведены список и краткое описание директив упрощенной сегментации.

CODESEG [<имя>] - начало или продолжение кодового сегмента модуля. Для модели с типом FAR можно задавать имя, которое становится действующим именем сегмента. В этом случае нельзя иметь более одного кодового сегмента в модуле.

.CODE [<имя>] - аналог CODESEG для режима MASM.

DATASEG - начало или продолжение сегмента данных, инициализированных по умолчанию, или типа NEAR.

.DATA - аналог DATASEG для режима MASM.

CONST - начало или продолжение сегмента постоянных данных модуля. Постоянные данные всегда имеют тип NEAR и эквивалентны инициализированным данным.

.CONST - аналог CONST для режима MASM.

UDATASEG - начало или продолжение сегмента данных, неинициализированных по умолчанию, или типа NEAR.

.DATA? - аналог UDATASEG для режима MASM

STACK [<размер>] - начало или продолжение сегмента стека программного модуля. Необязательный параметр "размер" указывает объем памяти, отводимый под стек в словах.

.STACK [<размер>] - аналог STACK для режима MASM

FARDATA [<имя>] - начало или продолжение сегмента инициализированных данных дальнего типа с указанным именем (по умолчанию используется имя FAR_DATA). В программном модуле можно размещать несколько сегментов такого типа.

.FARDATA [<имя>] - аналог FARDATA для режима MASM.

UFARDATA [<имя>] - начало или продолжение сегмента неинициализированных данных типа FAR с указанным именем (по умолчанию используется имя FAR_BSS). В программном модуле можно размещать несколько сегментов такого типа.

.FARDATA? [<имя>] - аналог UFARDATA для режима MASM [5].

2.6.4. Директивы определения сегментов и групп

Упрощенное описание сегментов, используемое с указанием стандартной модели памяти, в большинстве случаев с успехом применяется в прикладных программах. Однако такое описание ограничивает гибкость в употреблении сегментов. Если требуется осуществлять полный контроль всех аспектов создания сегментов, необходимо пользоваться соответствующими директивами. Директива 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.

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