Шаг 18.
Структура программы на Ассемблере. Директивы SEGMENT и ENDS

    С этого шага мы начнем рассматривать структуру программы на Ассемблере.

    Программа, написанная на языке Ассемблера, может состоять из нескольких модулей. Основной формат представления команд имеет следующий вид:

    [<метка>:]   <команда>  [<операнд(ы)>]  .

    Метка (если имеется), команда и операнд (если имеется) разделяются, по крайней мере, одним пробелом. Примеры команд:

    COUNT:    MOV  AX,0  ;Метка, команда два операнда.
              MUL  BX    ;Команда, один операнд.

    Метки в языке Ассемблер могут содержать следующие символы:

    Первым символом в метке должна быть буква или специальный символ, например: $e10, PAGE25.

   

    Ассемблер имеет ряд операторов, которые позволяют управлять процессом ассемблирования и формирования листинга. Эти операторы называются псевдокомандами или директивами. Они действуют только в процессе ассемблирования программы и не генерируют машинных кодов. На этом шаге мы рассмотрим директивы SEGMENT и ENDS. Общий вид:

    <имя> SEGMENT [<выравнивание>] [<комбинация>] [<'класс'>]
                 .   .   .
    <имя> ENDS

    Директивы SEGMENT и ENDS отмечают соответственно начало и конец программного сегмента и должны быть помечены одним и тем же именем, которое и считается именем сегмента. Программный сегмент представляет собой последовательность инструкций и/или полей данных, адресуемых относительно одного регистра сегмента. Имя сегмента должно быть уникальным в пределах одного модуля.

    Параметры:

директивы SEGMENT задают информацию для компоновщика программы. Они должны кодироваться в указанной последовательности, но могут быть опущены в произвольной комбинации. Рассмотрим назначение этих параметров.

    Выравнивание определяет границу адреса, начиная с которой сегмент будет загружаться в память. Этот параметр имеет следующие значения:

    Если выравнивание не указано, предполагается PARA. Следует помнить, что точный адрес начала сегмента до его загрузки в память неизвестен. Тип выравнивания только накладывает на него ограничение.

    Тип комбинации определяет возможность и способы объединения программных сегментов, имеющих одно имя. Могут быть указаны следующие значения:

    Если тип комбинации не указан, сегмент ни с чем не объединяется и рассматривается как отдельная программная единица.

    Класс сегмента определяет порядок следования сегментов в памяти. Сегменты одного класса загружаются в память один после другого до того, как начнут загружаться сегменты другого класса.

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

    Если класс не указан, компоновщик копирует сегменты в исполнительный файл в той последовательности, в которой они расположены в объектном файле. Эта последовательность сохраняется до тех пор, пока компоновщик не обнаружит два или более сегмента одного класса, после чего начинается объединение сегментов. Сегменты одного класса копируются в последовательные блоки исполнительного файла.

    Все сегменты имеют класс. Сегменты, для которых класс не указан, считаются принадлежащими к классу с пустым именем и копируются в последовательные блоки памяти вместе с такими же сегментами. Число сегментов, принадлежащих к одному классу, неограничено, но их суммарный объем не должен превышать 64Кб.

    На следующем шаге мы рассмотрим директиву PROC.


Предыдущий шаг Содержание Следующий шаг