Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по ЭВМ и ПУ.doc
Скачиваний:
64
Добавлен:
16.03.2015
Размер:
1.16 Mб
Скачать

3.2.Организация программы.

3.2.1. Модели памяти

Модели памяти задаются директивой .MODEL.

model модель, язык, модификатор, где модель – одно из следующих слов:

TINY – код, данные и стек размещаются в одном и том же сегменте размером до 64 Кб. Эта модель памяти используется для написания программ на языке ассемблера в формате COM файла;

SMALL – код размещается в одном сегменте, а данные и стек – в другом (для их описания могут применяться разные сегменты, но объединенные в одну группу). Эта модель памяти используется для написания программ на языке ассемблера в формате EXE файла;

COMPACT – код размещается в одном сегменте, а для хранения данных могут использоваться несколько сегментов;

MEDIUM – код размещается в нескольких сегментах, а все данные – в одном;

LARGE, HUGE – и код, и данные могут занимать несколько сегментов;

FLAT – то же, что и TINY, но используются 32 – битные сегменты, так что максимальный размер сегмента, содержащего и данные, и код, и стек, - 4 Мб.

Язык – необязательный операнд, принимающий значения различных языков программирования, при указании которого подразумевается, что процедуры рассчитаны на вызов из программ на соответствующем языке программирования.

Модификатор – это необязательный операнд, принимающий значения NEARSTACK (по умолчанию) или FARSTACK. Во втором случае сегмент стека не будет объединяться в одну группу с сегментами данных.

Упрощенные директивы определения сегментов

Каждая программа, написанная на любом языке программирования, состоит из одного или нескольких сегментов. Область памяти, в которой находятся команды, называется сегментом кода, область памяти с данными – сегментом данных и область памяти, отведенная под стек – сегментом стека. Ассемблер позволяет помещать данные в сегмент кода, разносить код по нескольким сегментам, помещать стек в один сегмент с данными или вообще использовать один сегмент для всего. Для описания сегментов программы используются директивы SEGMENT и ENDS. Однако, чаще всего используются упрощенные директивы определения сегментов, которые вступают в силу после установления модели памяти.

Директива .CODE описывает сегмент кода:

.code.

Директива .STACK описывает сегмент стека:

.stack размер.

Директива .DATA описывает основной сегмент данных:

.data.

3.2.2. Процедуры

Процедурой в ассемблере является всё то, что в других языках называют подпрограммами, функциями, процедурами и т.д. Ассемблер не накладывает на процедуры никаких ограничений- на любой адрес программы можно передать управление командой CALL, и оно вернётся к вызвавшей процедуре, как только встретится команда RET. Такая свобода выражения легко может приводить к трудночитаемым программам, и в язык ассемблера были включены директивы логического оформления процедур.

Метка proc язык тип USES регистры

ret

метка endp

Все операнды PROC необязательны.

Тип может принимать значения NEAR и FAR, и если он указан, все команды RET в теле процедуры будут заменены соответственно на RETN и RETF. По умолчанию подразумевается, что процедура имеет тип NEAR в моделях памяти TINY, SMALL и COMPACT.

Конец программы

End start_label

Этой директивой завершается любая программа на ассемблере. В роли необязательного операнда здесь выступает метка (или выражение), определяющая адрес, с которого начинается выполнение программы. Если программа состоит из нескольких модулей, только один файл может содержать начальный адрес, так же как в С только один файл может содержать функцию main().