Решить проблему  адресации сегментов поможет ассемблер.  В одной из  своих частей  программа  на языке  ассемблера  должна определить  составляющие ее  сегменты. Кроме того специальные команды сообщают  ассемблеру,  какие сегменты  с каким  регистром связаны.  Благодаря  этому ассемблер может, когда требуется, определить какой сегментный  префикс нужен  в коде команды.  Если программист задает  ссылку, не  связанную с регистром  DS,  но доступную через  другой сегментный  регистр, то  ассемблер  сам сформирует  правильный  префикс. Это  позволяет программисту работать непосредственно с данными и текстом  программы, оставив ассемблеру работу по осуществлению адресации.  Объявление сегментов позволяет ассемблеру следить за тем, какие  сегменты доступны через сегментные  регистры и определять возможные  ошибки. Например,  в программе могут  появиться переменные, которые  недоступны из-за того, что на  сегмент этой переменной не указывает  ни один из сегментных регистров. Ассемблер квалифицирует это  как

         Microsoft (R) Macro Assembler Version 5.00              1/1/80 03:53:05

         Фиг. 3.9  Сегменты                                Page  1-1

 

                                        PAGE   ,132

                                        TITLE  Фиг. 3.9  Сегменты

 

          0000                   DATA   SEGMENT

          0000  01                     VAR1    DB        1           ; Переменная в сегменте DATA

          0001                   DATA   ENDS

 

          0000                   BUFFER SEGMENT

          0000  02                     VAR2    DB        2           ; Переменная в сегменте BUFFER

          0001                   BUFFER ENDS

 

          0000                   CODE   SEGMENT

          0000  03                     VAR3    DB        3           ; Переменная в сегменте CODE

 

                                        ASSUME CS:CODE, DS:DATA, ES:BUFFER

 

          0001  FE 06 0000 R                 INC     VAR1      ; Переменная из сегмента DATA

          0005  26: FE 06 0000 R            INC     VAR2      ; Переменная из сегмента BUFFER

          000A  2E: FE 06 0000 R            INC     VAR3      ; Переменная из сегмента CODE

 

          000F                   CODE   ENDS

                                        END

         Фиг. 3.9 Сегменты

ошибку. Она возникает  из-за того,  что в  программе не обеспечена  адресуемость.  Это  ограничение,  но лучше  обнаружить  ошибку при  ассемблировании, чем во время работы программы.

Оператор SEGMENT определяет все  сегменты, давая каждому из них  имя. Программа на  Фиг. 3.9  демонстрирует определение  нескольких  сегментов.  В качестве  имени сегмента  может использоваться  любое  допустимое имя переменной. Утверждение SEGMENT сообщает ассемблеру,  что все следующие  команды и данные во время  выполнения программы  будут находиться в  этом сегменте.  Оператор ENDS  указывает конец  текущего сегмента. В этом  утверждении тоже указывается имя сегмента. Каждому утверждению  SEGMENT должно соответствовать утверждение  ENDS. В противном случае ассемблер запутается и выдаст сообщение об  ошибке.