С этого шага мы начнем рассматривать структуру программы на Ассемблере.
Программа, написанная на языке Ассемблера, может состоять из нескольких модулей. Основной формат представления команд имеет следующий вид:
[<метка>:] <команда> [<операнд(ы)>] .
Метка (если имеется), команда и операнд (если имеется) разделяются, по крайней мере, одним пробелом. Примеры команд:
COUNT: MOV AX,0 ;Метка, команда два операнда. MUL BX ;Команда, один операнд.
Метки в языке Ассемблер могут содержать следующие символы:
Первым символом в метке должна быть буква или специальный символ, например: $e10, PAGE25.
Ассемблер имеет ряд операторов, которые позволяют управлять процессом ассемблирования и формирования листинга. Эти операторы называются псевдокомандами или директивами. Они действуют только в процессе ассемблирования программы и не генерируют машинных кодов. На этом шаге мы рассмотрим директивы SEGMENT и ENDS. Общий вид:
<имя> SEGMENT [<выравнивание>] [<комбинация>] [<'класс'>] . . . <имя> ENDS
Директивы SEGMENT и ENDS отмечают соответственно начало и конец программного сегмента и должны быть помечены одним и тем же именем, которое и считается именем сегмента. Программный сегмент представляет собой последовательность инструкций и/или полей данных, адресуемых относительно одного регистра сегмента. Имя сегмента должно быть уникальным в пределах одного модуля.
Параметры:
директивы SEGMENT задают информацию для компоновщика программы. Они должны кодироваться в указанной последовательности, но могут быть опущены в произвольной комбинации. Рассмотрим назначение этих параметров.
Выравнивание определяет границу адреса, начиная с которой сегмент будет загружаться в память. Этот параметр имеет следующие значения:
Если выравнивание не указано, предполагается PARA. Следует помнить, что точный адрес начала сегмента до его загрузки в память неизвестен. Тип выравнивания только накладывает на него ограничение.
Тип комбинации определяет возможность и способы объединения программных сегментов, имеющих одно имя. Могут быть указаны следующие значения:
VIDEO_RAM SEGMENT AT 0B800H.
Если тип комбинации не указан, сегмент ни с чем не объединяется и рассматривается как отдельная программная единица.
Класс сегмента определяет порядок следования сегментов в памяти. Сегменты одного класса загружаются в память один после другого до того, как начнут загружаться сегменты другого класса.
В качестве класса сегмента может быть указан любой идентификатор, на который распространяются все требования и ограничения языка Ассемблера. Поскольку класс сегмента рассматривается как идентификатор, он не может быть определен где-либо еще в программе.
Если класс не указан, компоновщик копирует сегменты в исполнительный файл в той последовательности, в которой они расположены в объектном файле. Эта последовательность сохраняется до тех пор, пока компоновщик не обнаружит два или более сегмента одного класса, после чего начинается объединение сегментов. Сегменты одного класса копируются в последовательные блоки исполнительного файла.
Все сегменты имеют класс. Сегменты, для которых класс не указан, считаются принадлежащими к классу с пустым именем и копируются в последовательные блоки памяти вместе с такими же сегментами. Число сегментов, принадлежащих к одному классу, неограничено, но их суммарный объем не должен превышать 64Кб.
На следующем шаге мы рассмотрим директиву PROC.