Класс сегмента
Это заключенная в кавычки строка, помогающая компоновщику определить соответствующий порядок следования сегментов при собирании программы из сегментов нескольких модулей. Компоновщик объединяет вместе в памяти все сегменты с одним и тем же именем класса (имя класса, в общем случае, может быть любым, но лучше, если оно будет отражать функциональное назначение сегмента). Например, имя класса 'Stack' для сегмента стека или 'Code' для сегмента кода, или 'Data' для сегмента данных.
Сегмент стека определяется следующим образом:
stacksg SEGMENT PARA STACK 'Stack'
…
stacksg ENDS
Сегмент кода определяется следующим образом:
codesg SEGMENT PARA 'Code'
…
codesg ENDS
Сегмент данных определяется следующим образом:
datasg SEGMENT PARA 'Data'
…
datasg ENDS
При использовании стандартных директив сегментации сегменты загружаются в память в том порядке, в котором они следуют в тексте программы.
Все сегменты сами по себе равноправны, так как директивы SEGMENT и ENDS не содержат информации о функциональном назначении сегментов. Для того чтобы использовать их как сегменты кода, данных, стека или дополнительного сегмента данных необходимо предварительно сообщить транслятору об их назначении, для чего используют специальную директиву ASSUME, имеющую формат, показанный на рис.5.2.
Рис. 5.2. Директива ASSUME
Эта директива сообщает транслятору о том, какой сегмент к какому сегментному регистру привязан. В свою очередь это позволит транслятору корректно связывать символические имена, определенные в сегментах. Каждое имя сегмента, используемое директивой ASSUME, должно совпадать с соответствующим именем сегмента задаваемого парой директив SEGMENT и ENDS. Для того чтобы разорвать связь между сегментами и сегментными регистрами (либо для всех сразу, либо для каждой пары независимо друг от друга) используется ключевое слово nothing.
Пример записи директивы ASSUME для EXE-программ:
ASSUME CS:codesg,DS:datasg,SS:stacksg,ES:nothing
Пример записи директивы ASSUME для COM-программ:
ASSUME CS:codesg,DS:codesg,SS:codesg,ES:nothing