Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
379727.doc
Скачиваний:
36
Добавлен:
22.09.2019
Размер:
1.92 Mб
Скачать

40. Директивы описания сегментов. Процедуры в Ассемблере. Вызовы и возвраты (дальние и ближние).

В программировании термин «директива» (указание) по использованию похож на термин «команда», так как так же используется для описания некоторых конструкций языка программирования (то есть указаний компилятору или ассемблеру особенностей обработки при компиляции).

Описание сегмента — директива SEGMENT

Любые ассемблерные программы содержат, по крайней мере, один сегмент — сегмент кода. В некоторых программах используется сегмент для стековой памяти и сегмент данных (основной и дополнительный) для определения данных.

Универсальная директива для описания сегмента имеет следующий формат:

имяС SEGMENT [параметры] ; начало СЕГМЕНТА имяС

…...............................................................................................................................

имяС ENDS ; конец СЕГМЕНТА имяС

Имя сегмента (имяС) должно обязательно присутствовать, быть уникальным и соответствовать соглашениям для имен в Ассемблере или в другом алгоритмическом языке, для стыковки с которым делается ассемблерный модуль. Например, при стыковке Ассемблера с Turbo/Borland Pascal имяС должно быть СТРОГО определенным:

* для сегмента кода CSEG или CODE; * для сегмента данных DSEG или DATA; * для сегмента стека STACK.

Директива ENDS обозначает конец сегмента. Обе директивы SEGMENT и ENDS должны иметь одинаковые имена имяС.

В одном модуле можно открывать и закрывать сегмент с одним и тем же именем имяС несколько раз, но пересекаться (вкладываться друг в друга) разные сегменты НЕ должны. Компилятор просматривает ассемблерный модуль и объединяет вместе все части сегментов с одинаковым именем в том порядке, в каком он их обнаруживает (сверху-вниз).

Директива SEGMENT может содержать три основных типа необязательных параметров, определяющих выравнивание (align), объединение (combine) и класс ('class'), между которыми должен быть хотя бы один пробел в качестве разделителя. Параметры имеют смысл при разработке БОЛЬШИХ ассемблерных программ.

Описание процедур

Модуль на Ассемблере, как и модули на алгоритмических языках, обычно состоит из процедур. Для описания процедур используются две директивы. Визуально они похожи на соответствующие директивы описания сегмента

имяP PROC [параметры] ; начало процедуры имяP

.…………….…………….…………….…………….…………….……………

RET ; КОМАНДА возврата в точку вызова процедуры

.…………….…………….…………….…………….…………….…………….

имяP ENDP ; конец процедуры имяP

У директивы PROC достаточно много параметров. Если кому нужно, то сами поищите, инфы много.

Обратите внимание на ОБЯЗАТЕЛЬНУЮ команду RET. Она может быть в любом нужном месте процедуры и НЕ единственная. Если ее в процедуре НЕ будет, то ассемблерная программа НЕ сможет нормально работать — возникнет зависание.

Вызовы и возвраты (дальние и ближние). Команды безусловных переходов: JMP осуществляет безусловный переход(NEAR(-127; +128), FAR в пределах сегмента, SHORT) команда CALL передает управление подпрограмме с автоматическим сохранением адреса возврата в стеке. Команда RET возвращает управление вызывающей программе. Команда возврата — это косвенный переход т. к. адрес перехода извлекается из вершины стека.

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