Упрощенные сегментные директивы
После выбора модели памяти вы можете использовать упрощенные сегментные директивы для того, чтобы начинать отдельные сегменты. Эти упрощенные директивы вы можете использовать только после директивы MODEL, которая задает для модуля модель памяти. В модуле допускается указывать столько директив сегментации, сколько необходимо. Турбо Ассемблер для получения одного сегмента комбинирует все части с одинаковыми именами (как если бы вы ввели все эти фрагменты после одной директивы сегментации). Перечень директив содержится в этой таблице.
Директива | Описание |
---|
CODESEG [имя] | Начинает или продолжает сегмент кода модуля. Для моделей с дальним типом кода вы можете задать имя, являющееся фактическим именем сегмента. Заметим, что таким образом вы можете генерировать для модуля более одного сегмента кода. | .CODE [имя] DATASEG | Эквивалентна директиве CODESEG. Допускается только для режима MASM. Начинает или продолжает ближний или инициализируемый по умолчанию сегмент данных. | .DATA CONST | Эквивалентна директиве DATASEG. Допускается только для режима MASM. Начинает или продолжает сегмент констант модуля. Постоянные данные всегда являются ближними (NEAR) и эквивалентны инициализированным данным. | .CONST UDATASEG | Эквивалентна директиве CONST. Допускается только для режима MASM. Начинает или продолжает ближний или не инициализируемый по умолчанию сегмент данных. Соблюдайте осторожность и включайте в этот сегмент только неинициализированные данные, в противном случае получаемая выполняемая программа будет иметь больший чем нужно размер. Описание распределения неинициализированных данных можно найти в Главе 12. | .FARDATA? [имя] | Эквивалентна UFARDATA. Действует только в режиме MASM. | .DATA? | Эквивалентна директиве UDATASEG. Действует только для режима MASM. | STACK [размер] | Начинает или продолжает сегмент стека модуля. Необязательный параметр "размер" определяет объем резервируемой для стека памяти (в словах). Если вы не задаете размер, Турбо Ассемблер резервирует по умолчанию 200h слов (1 килобайт).
В режиме MASM все метки, код или данные, следующие за оператором STACK, не будут рассматриваться как часть сегмента стека. Однако в режиме Ideal резервируется специальная область, и сегмент стека остается открытым, благодаря чему вы можете добавлять метки и другие неинициали зированные данные.
Директивы стека обычно требуется использовать, если вы пишете на языке Ассемблера автономную программу. Большинство языков высокого уровня сами создают для вас стек. | .STACK [размер] | Эквивалентна директиве STACK. Действует в режиме MASM. | FARDATE [имя] | Начинает или продолжает дальний неинициализированный сегмент данных (FAR) с заданным именем. Если вы не задаете имя, Турбо Ассемблер использует сегментное имя FAR_DATA. В модуле может содержаться более одного неинициализированного сегмента данных типа FAR. | .FARDATA [имя] | Эквивалентна FARDATA. Действует в режиме MASM. | UFARDATA | Начинает или продолжает дальний неинициализированный сегмент данных с заданным именем. Если вы не задаете имя, то Турбо Ассемблер использует имя сегмента FAR_BSS. В модуле у вас может быть несколько неинициализированных сегментов данных типа FAR. |
Примечание: Если вам требуется знать фактические имена, имена классов и выравнивание сегментов, создаваемых по упрощенным директивам сегментации, см. тут.
Идентификаторы, создаваемые упрощенными директивами сегментации
Когда вы используете упрощенные директивы определения сегментов, они создают переменные, отражающие детали распределения сегмента (аналогично тому, как это делает директива MODEL).
Идентификаторы упрощенных директив сегментацииИдентификатор | Значение |
---|
@code | Сегмент или группа, которые подразумеваются для сегмента CS. | @data | Сегмент или группа, которые подразумеваются для сегмента DS. | @fardata | Имя текущего сегмента FARDATA. | @fardata? | Имя текущего сегмента UFARDATA. | @curseg | Имя текущего сегмента. | @stack | Сегмент или группа, которые подразумеваются для сегмента SS. |
Директива STARTUPCODE
Директива STARTUPCODE обеспечивает код инициализации, соответствующий текущей модели и операционной системе. Она отмечает также начало программы. Эта директива имеет следующий синтаксис:
STARTUPCODE
или
.STARTUP ; (только для режима MASM)
Директива STARTUPCODE инициализирует регистры DS, SS и SP. Для моделей SMALL, MEDUIUM, COMPACT, LARGE, HUGE и TPASCAL Турбо Ассемблер устанавливает DS и SS в @data, а SP - в конец стека. Для моделей TINY и TCHUGE директива STARTUPCODE не изменяет сегментных регистров.
Идентификатор @Startup
Идентификатор @Startup помещается в начало кода инициализации, который генерируется по директиве STARTUPCODE. Он представляет собой ближнюю метку, отмечающую начало программы.
Директива EXITCODE
Директива EXITCODE используется для генерации кода завершения, соответствующего текущей операционной системе. Вы можете использовать ее в модуле несколько раз (для каждой точки входа). Эта директива имеет следующий синтаксис:
EXITCODE [возвращаемое_значение]
В режиме MASM вы можете использовать следующий синтаксис:
.EXIT [возвращаемое_значение]
Необязательное "возвращаемое_значение" описывает число, которое должно возвращаться в операционную систему. Если вы не задаете возвращаемое значение, Турбо Ассемблер предполагает, что это значение содержится в регистре AX.
1 2 3 4 5 6 7
8 8 8
| |