Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP_MET_1.DOC
Скачиваний:
2
Добавлен:
25.08.2019
Размер:
595.97 Кб
Скачать

3.3.4. Процедуры

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

метка proc язык тип USES регистры ; TASM

или

метка proc тип язык USES peгистры ; MASM

. . .

ret

метка endp

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

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

Операнд язык действует аналогично такому же операнду директивы .MODEL, определяя взаимодействие процедуры с языками высокого уровня. В некоторых ассемблерах директива PROC позволяет также считать параметры, передаваемые вызывающей программой. В этом случае указание языка необходимо, так как различные языки высокого уровня используют разные способы передачи параметров.

USES-регистры список регистров, значения которых изменяет процедура. Ассемблер поместит в начало процедуры набор команд PUSH, а перед командой RET — набор команд POP, так что значения перечисленных регистров будут восстановлены.

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

end start_label

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

3.3.6. Директивы задания набора допустимых команд

По умолчанию ассемблеры используют набор команд процессора 8086 и выдают сообщения об ошибках, если выбирается команда, которую этот процессор не поддерживал. Для того чтобы ассемблер разрешил использование команд, появившихся в более новых процессорах, и команды расширений, предлагаются следующие директивы:

.8086 — используется по умолчанию. Разрешены только команды 8086.

.186 — разрешены команды 80186.

.286 и .286с — разрешены непривилегированные команды 80286.

.286р — разрешены все команды 80286.

.386 и .386с — разрешены непривилегированные команды 80386.

.386р — разрешены все команды 80386.

.486 и .486с — разрешены непривилегированные команды 80486.

.486р — разрешены все команды 80486.

.586 и .586с — разрешены непривилегированные команды Р5 (Pentium).

.586р — разрешены все команды Р5 (Pentium).

.686 — разрешены непривилегированные команды Р6 (Pentium Pro, Pentium II).

.686р — разрешены все команды Р6 (Pentium Pro, Pentium II).

.8087 — разрешены команды NPX 8087.

.287 — разрешены команды NPX 80287.

.387 — разрешены команды NPX 80387

.487 — разрешены команды FPU 80486.

.587 — разрешены команды FPU 80586.

.ММХ — разрешены команды IA ММХ.

.K3D — разрешены команды AMD 3D.

Не все ассемблеры поддерживают все эти директивы, например MASM не поддерживает .487 и .587, так как их действие не отличается от .387. Естественно, версии ассемблеров, вышедшие до появления последних процессоров и расширений, не поддерживают соответствующие команды.

Если перед директивой .model присутствует директива .386 или выше, ассемблер определяет все сегменты как 32-битные при условии, что не указан явно операнд USE16.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]