Атрибут выравнивания сегмента (тип выравнивания) сообщает компоновщику (редактору связей) о том, что нужно обеспечить размещение начала сегмента на заданной границе. Это важно, поскольку в зависимости от выравнивания доступ к оперативной памяти выполняется с разной скоростью.
Допустимые значения этого атрибута следующие:
- byte – выравнивание не выполняется; сегмент может начинаться с любого адреса памяти
- word – сегмент начинается по адресу, кратному двум; выравнивание на границу слова
- dword – сегмент начинается по адресу, кратному четырем; выравнивание на границу дв. слова
- para – сегмент начинается по адресу, кратному 16; выравнивание на границу параграфа (16 б)
- page – сегмент начинается по адресу, кратному 256; выравнивание на границу страницы (256 б)
- mempage – сегмент начинается по адресу, кратному 4 Кб; выравнивание на границу страницы памяти (4 Кб).
Атрибут комбинирования сегментов сообщает редактору связей о том, как нужно объединять сегменты, имеющие одно и то же имя. Сегменты с различными именами объединять нельзя. Значениями атрибута комбинирования могут быть:
- private – сегмент не будет объединяться с другими сегментами
- public – заставляет компоновщик соединить все сегменты с одинаковыми именами. Новый объединенный сегмент будет целым и непрерывным.
- common – располагает все сегменты с одним и тем же именем по одному адресу. Все сегменты с данным именем будут перекрываться и совместно использовать память. Размер полученной в результате области загрузки будет равен размеру самого большого сегмента
- at xxxx – располагает сегмент по абсолютному адресу параграфа, который задается выражением xxxx. Компоновщик располагает сегмент по заданному адресу памяти.
- stack – определение сегмента стека. Заставляет компоновщик соединить все одноименные сегменты и вычислять адреса в этих сегментах относительно регистра ss. Комбинированный тип stack (стек) аналогичен комбинированному типу public, за исключением того, что регистр ss является стандартным сегментным регистром для сегментов стека. Регистр sp устанавливается на конец объединенного сегмента стека.
Неявно атрибут комбинирования принимает значение private.
Атрибут класса сегмента (тип класса) – это заключенный в кавычки идентификатор (имя класса). Сегменты, для которых указано одно и то же имя класса, будут располагаться в памяти последовательно друг за другом.
Атрибут размера сегмента (режим адресации) может принимать следующие значения:
- use16 – для адресации информации внутри сегмента используется 16-разрядное смещение;
- use32 – при формировании адреса внутри сегмента используется 4 Гбайта (защищенный режим работы микропроцессора).
Тип микропроцессора задает следующая директива:
.тип_микропроцессора
.486; режим работы микропроцессора 80486
; 8086, 80186, 80286 - 16 битный режим адресации
; 80386 – 32 битный режим адресации
Все сегменты сами по себе равноправны, так как директивы segment и ends не содержат информации о функциональном назначении сегментов. Для того, чтобы использовать их как сегменты кода, данных или стека, необходимо предварительно сообщить транслятору об этом, для чего используют специальную директиву assume.
assume сегментный_регистр: имя_сегмента[,сегментный_регистр: имя_сегмента…]
Эта директива сообщает транслятору о том, какой сегмент к какому сегментному регистру привязан.
Последним оператором программы должна быть директива end. Она имеет такой формат: