Директива STARTUPCODE выполняет код инициализации программы, зависящий от текущей модели и операционной системы.
Синтаксис:
STARTUPCCODE ;для режима IDEAL
или
.STARTUP ; для режима Masm.
STARTUPCODE инициализирует регистры DS, SS и SP. Для моделей SMALL, MEDIUM, COMPACT, LARGE, HUGE и TRANSCAL TASM устанавливает DS и SS на @data, а SP - на вершину стека. При использовании моделей TINY и TCHUGE директива STARTUPCODE не изменяет содержимого сегментных регистров.
Идентификатор @Startup автоматически помещается перед начальным кодом, генерируемым директивой STARTUP, и представляет собой метку ближнего типа, указывающую на начало программы. Таким образом, в начале программы не нужно ставить метку (как в примере раздела 4.7, где на начало программы указывает метка Begin). Также не нужно указывать эту метку в директиве END.
Для автоматического создания в программе кода завершения программы, требуемого установленным типом операционной системы, предназначена директива EXITCODE. Ее можно указывать в нескольких местах программы, в которых необходимо указать точку выхода. Синтаксис в режиме IDEAL:
EXITCODE [код_возврата] ;для режима IDEAL
.EXIT [код_возврата] ; для режима Masm.
Необязательный параметр код_возврата - выражение, результат вычисления которого возвращается операционной системе по завершении работы программы. По умолчанию TASM присваивает коду возврата значение, находящееся в регистре AX.
Таким образом, программа, представленная в разделе 4.7, может быть изменена:
IDEAL ;включаем режим IDEAL Tasm'а
DOSSEG ; директива упорядочивания сегментов
MODEL SMALL ; модели кода и данных ближнего типа
STACK 200h ; стек объемом 512 байт
DATASEG ; начало сегмента данных
DisplayString DB 13,10 ; описание какой-то переменной
CODESEG ; начало сегмента кода
STARTUPCODE ;директива, указывающая на начало программы
.
.
.
EXITCODE ;директива завершения программы
END ;директива, отмечающая конец исходного кода
Сравним с разделом 4.7. Видно, что программа стала более короткой и более простой для понимания и запоминания.
Контрольные вопросы и задания
1. Для сегментов кода, данных и стека даны имена CDSEG, DATSEG и STKSEG соответственно. Сформируйте директиву ASSUME:
1) ASSUME CX:CDSEG, DX:DATSEG, SP:STKSEG;
2) ASSUME CS=CDSEG, DS=DATSEG, SS=STKSEG;
3) ASSUME CS:CDSEG, DS:DATSEG, SS:STKSEG.
2. Какая директива является закрывающей для директивы SEGMENT ?
1) ENDP 2) ENDS 3) END.
3. Для нормальной работы программы необходимо предварительно:
1) Инициализировать все используемые программой регистры;
2) Сохранить в стеке все используемые программой регистры;
3) Выполнить сначала 1), потом 2);
4) Выполнить сначала 2), потом 1).
4. Для определения массива констант от 0 до 9 в формате слова, с именем VAR в сегменте данных необходимо написать конструкцию:
1) VAR DW 0,1,2,3,4,5,6,7,8,9
2) VAR DB 0,1,2,3,4,5,6,7,8,9
3) VAR DW 0..9
5. Для внесения дополнительного сегмента данных DOPSEG в программу необходимо включить в ASSUME следующую конструкцию (сегмент данных имеет имя DATSEG):