Переопределение сегмента
Компоновщик организует и упорядочивает все сегменты, определенные в модулях программы. В общем случае компоновщих начинает размещение сегментов в том порядке, в котором они встречаются в модулях программы. С помощью такого механизма, как комбинирование сегментов и назначение сегментам классов вы можете изменять этот порядок.
Существуют также другие способы повлиять на порядок сегментов в конечной программе. Например, можно изменить тот порядок, в котором сегменты встречаются в исходном модуле. Существуют также директивы, влияющие на порядок сегментов. Ниже следует их описание.
Изменение упорядочивания сегментов в модуле
Порядок сегментов в каждом модуле определяет начальное размещение сегментов в программе компоновщиком. В MASM 1.0 и 2.0 сегменты передавались компоновщику в алфавитном порядке. В Турбо Ассемблере предусмотрены директивы (только в режиме MASM), которые позволяют воспроизвести это поведение.
Заметим, что данные директивы действуют так же, как параметры командной строки /A и /S.
Директива .ALPHA
Директива .ALPHA определяет упорядочивание сегментов по алфавиту. Данная директива сообщает Турбо Ассемблеру, что сегменты в объектном файле нужно разместить в алфавитном порядке (в соответствии с именами сегментов). Она имеет синтаксис:
.ALPHA
Директива .SEQ
Директива .SEQ определяет последовательное упорядочивание сегментов и сообщает Турбо Ассемблеру, что сегменты нужно помещать в объектный файл в том порядке, в котором они встречаются в исходном файле. Поскольку это поведение предполагается Турбо Ассемблером по умолчанию, директиву .SEQ используют обычно только для переопределения предыдущей директивы .ALPHA. Данная директива имеет следующий синтаксис:
.SEQ
Директива DOSSEG: упорядочивание сегментов в порядке DOS
Обычно компоновщик упорядочивает сегменты в последовательном порядке - в том порядке, в котором он их обрабатывает при генерации программы. Если вы включаете в любой модуль программу директиву DOSSEG, то это указывает компоновщику, что вместо этого упорядочивания нужно использовать порядок сегментов, принятый в DOS. Компоновщик при этом выполняет в получаемой программе следующее упорядочивание:
сначала идут сегменты с именем класса CODE (обычно сегменты кода);
затем следуют сегменты, не имеющие имени класса CODE и не являющиеся частью DGROUP;
сегменты, являющиеся частью DGROUP в следующем порядке:
сегменты, не являющиеся классами BSS и STACK (обычно неинициализированные данные);
сегменты класса BSS (обычно инициализированные данные);
сегменты класса STACK (область стека).
Примечание: Не используйте директиву DOSSEG, в программах, не являющихся автономными программами на Ассемблере.
Сегменты в группе DGROUP располагаются в том порядке, в котором они определены в исходных модулях. Приведем синтаксис DOSSEG:
DOSSEG
Изменение размера стека
Начальный и завершающий код процедур работает с регистрами, указывающими на стек. В процессоре 80386 или 80486 сегменты могут быть 16- или 32-разрядными. Таким образом, перед генерацией корректного начального и завершающего кода Турбо Ассемблеру нужно знать корректный размер стека.
Если вы выбираете стандартную модель с помощью директивы MODEL, размер стека выбирается автоматически.
В Турбо Ассемблере предусмотрены директивы, которые могут установить или переопределить используемый по умолчанию при генерации начального и завершающего кода размер стека. Список этих директив приведен в следующей таблице:
Директивы модификации размера стекаДиректива | Значение |
---|
SMALLSTACK | Указывает, что стек 16-разрядный. | LARGESTACK | Указывает, что стек 32-разрядный. |
1 2 3 4 5 6 7
8 8 8
| |