Оператор Segment



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




Содержание раздела