Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
на печать11.doc
Скачиваний:
41
Добавлен:
11.06.2015
Размер:
1.04 Mб
Скачать

9. Сегментная модель памяти, описание сегментов.

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

из одного или нескольких сегментов. Обычно область памяти, в которой находятся команды, называют сегментом кода, область памяти с данными – сегментом данных и область памяти, отведенную под стек, - сегментом стека. Разумеется, ассемблер позволяет изменять устройство программы как угодно - помещать данные в сегмент кода, разносить код на множество сегментов, помещать стек в один сегмент с данными или вообще использовать один сегмент для всего. Сегмент программы описывается директивами SEGMENT и ENDS.

имя_сегмента segment readonly выравн. тип разряд 'класс'

имя_сегмента ends

Имя сегмента - метка, которая будет использоваться для получения сегментного адреса, а также для комбинирования сегментов в группы. Все пять операндов директивы SEGMENT необязательны. READONLY. Если этот операнд присутствует, MASM выдаст сообщение об ошибке на все команды, выполняющие запись в данный сегмент. Другие ассемблеры этот операнд игнорируют. Выравнивание. Указывает ассемблеру и компоновщику, с какого адреса может начинаться сегмент. Значения этого операнда:

BYTE - с любого адреса;

WORD - с четного адреса;

DWORD - с адреса, кратного 4;

PARA - с адреса, кратного 16 (граница параграфа);

PAGE - с адреса, кратного 256.

По умолчанию используется выравнивание по границе параграфа.

Тип. Выбирает один из возможных типов комбинирования сегментов:

-- тип PUBLIC означает, что все такие сегменты с одинаковым именем, но разными классами будут объединены в один;

-- тип STACK - то же самое, что и PUBLIC, но должен использоваться для сегментов стека, потому что при загрузке программы сегмент, полученный объединением всех сегментов типа STACK, будет использоваться как стек;

-- сегменты типа COMMON с одинаковым именем также объединяются в один,

но не последовательно, а по одному и тому же адресу, следовательно, длина

суммарного сегмента будет равна не сумме длин объединяемых сегментов,

как в случае PUBLIC и STACK, а длине максимального.

-- тип AT - выражение указывает, что сегмент должен располагаться по фиксированному абсолютному адресу в памяти. Результат выражения, использующегося в качестве операнда для AT, равен этому адресу, деленному на 16.

-- PRIVATE (значение по умолчанию) - сегмент такого типа не объединяется

с другими сегментами.

Разрядность. Этот операнд может принимать значения USE16 и USE32. Раз-

мер сегмента, описанного как USE16, не может превышать 64 Кб, и все команды

и адреса в этом сегменте считаются 16-битным. USE32 могут занимать до 4 Гб, и все команды и адреса в них по умолчанию 32-битные.

Класс сегмента - это любая метка, взятая в одинарные кавычки. Все сегменты

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

Модели памяти задаются директивой .MODEL .model модель,язык,модификатор

где модель - одно из следующих слов:

-- TINY - код, данные и стек размещаются в одном и том же сегменте размером до 64 Кб.

-- SMALL - код размещается в одном сегменте, а данные и стек - в другрм (для их описания могут применяться разные сегменты, но объединенные в одну группу).

-- COMPACT - код размещается в одном сегменте, а для хранения данных мо-

гут использоваться несколько сегментов.

-- MEDIUM - код размещается в нескольких сегментах, а все данные - в одном

-- LARGE и HUGE — и код, и данные могут занимать несколько сегментов;

-- FLAT - то же, что и TINY, но используются 32-битные сегменты, так что максимальный размер сегмента, содержащего и данные, и код, и стек, - 4 Мб.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]