Оператор Segment

    Решить проблему  адресации сегментов поможет ассемблер.  В одной из

    своих  частей  программа  на  языке  ассемблера  должна  определить

    составляющие ее  сегменты. Кроме того  специальные команды сообщают

    ассемблеру,  какие сегменты  с каким  регистром связаны.  Благодаря

    этому ассемблер может, когда требуется, определить какой сегментный

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

    связанную  с регистром  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. В противном случае ассемблер запутается и выдаст сообщение об

    ошибке.

Hosted by uCoz