Сегменты

      Сегмент программы описывается директивами SEGMENT и ENDS :
 

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

                                                               ....................................

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

      Имя сегмента - метка, которая используется для получения сегментного адреса и для комбинирования сегментов в группы. Все 4 операнда директивы SEGMENT не обязательны.
 

      Выравнивание указывает с какого адреса может начинаться сегмент. Значение этого операнда:

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

                WORD                   - с четного

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

                PARA                    - с адреса, кратного 16

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

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

                PUBLIC  (или MEMORY)    - все сегменты с одинаковым именем будут объеденены в один;

                STACK                                 - то же самое, что и PUBLIC, но должен использоваться для сегментов стека;

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

                AT - выражение                   - сегмент должен располагаться по фиксированному абсолютному адресу в памяти;

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

      Разрядность может принимать значения USE16 и USE32. Размер сегмента, описанного как USE16 не может превышать 64 Кб и все адреса считаются 16-битными. Сегменты типа USE32 могут занимать до 4 Гб и все адреса по умолчанию 32-битные.

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

      Несколько сегментов можно объеденить в группу:
 

                имя_группы           GROUP              имя_сегмента
 

Теперь для адресации всех сегментов группы можно использовать один сегментный регистр.

 

      Директива ASSUME указывает, с каким сегментом или группой сегментов связан тот или иной сегментный регистр:
 

                ASSUME              регистр:  связь
 

      В качестве операнда "связь" могут использоваться имена сегментов, имена групп, выражения с оператором SEG или слово NOTHING, означающее отмену действия предыдущей директивы ASSUME для данного регистра. Эта директива не изменяет значений сегментных регистров, а только позволяет ассемблеру проверять допустимость ссылок и самостоятельно вставлять при необходимости префиксы переопределения сегментов.