Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВС сети и телекомм-практикум.doc
Скачиваний:
45
Добавлен:
01.07.2025
Размер:
614 Кб
Скачать
☆

12. Процедуры

Естественно предположить, что сложные программы удобнее писать не единым целым, а с использованием по ходу программы таких элементов, как процедуры, глобальные объявления и макроопределения.

Процедурой в ассемблере является все то, что в других языках называют подпрограммами, функциями, процедурами и т.д. Ассемблер не накладывает на процедуры никаких ограничений. Иными словами, при помощи CALL можно передать управление в любое место программы. Ну а встретив команду возврата RET мы вернемся к вузвавшей переход процедуре. С одной стороны подобный метод является очень легким. С другой – именно такая легкость способна сделать программу сложной для восприятия. Именно по этой причине разработчики ассемблера ввели в него директивы логического оформления процедур. Выглядят они следующим образом:

метка PROC язык тип USES регистры

...

RET

метка ENDP

Следует отметить, что все операнды директивы PROC не являются обязательными. Разберем их.

Метка. Значение данного операнда ничем не отличается от того, что было разобрано при описании операндов директивы SEGMENT.

Тип. Принимает значения NEAR и FAR, показывая, происходит ли переход в границах текущего сегмента или вне его.

Язык. Определяет взаимодействие процедуры с языками высокого уровня.

USES. Представляет собой список регистров, значения которых изменяет процедура. При работе программы не следует беспокоиться, что их значения могут быть изменены или потеряны. Дело в том, что перед началом выполняемой процедуры будет задействован набор команд PUSH, а перед командой возврата RET – набор команд POP. Следовательно, все возможные изменения будут восстановлены.

13. Глобальные объявления

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

Если мы объявим метку с помощью директивы PUBLIC, то она окажется доступной для других программных модулей.

PUBLIC язык метка

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

Для описания общих переменных предназначена директива COMM. Общие переменные характеризует то, что они доступны из всех модулей, и их размещение в программе определяется на этапе компоновки

COMM расст язык метка:тип

Отметим, что тут присутствуют как обязательные, так и необязательные операнды. К обязательным относятся «метка» и «тип», связанные между собой оператором «:». Тип при этом может принимать значения: BYTE, WORD, DWORD, FWORD, QWORD, TBYTE или имя структуры

Необязательными операндами являются уже описанный ранее «язык», назначение которого остается неизменным, а также «расстояние». Последний указывает, находится ли переменная в группе сегментов DGROUP (для доступа к которым достаточно смещения) или вне этих сегментов (для доступа нужен сегментный адрес).

В случае, если необходимо описать метку, определенную при помощи PUBLIC в другом модуле, используется директива EXTRN.

EXTRN язык метка:тип... ; для MASM и TASM

Необязательным операндов вновь является «язык», а обязательными – метка и тип, связанные между собой оператором «:».Тип при этом может принимать значения: BYTE, WORD, DWORD, FWORD, QWORD, TBYTE, имя структуры, FAR, NEAR, ABS (тип ABS используется для констант из других модулей, определенных директивой EQU). Отметим, что операнд «тип» должен соответствовать типу метки в том модуле, где она была установлена.

Последняя директива глобального объявления GLOBAL используется в случаях, когда мы хотим совместить действия директив PUBLIC и EXTRN.

GLOBAL язык метка:тип

Отметим, что когда указанная метка находится в этом же модуле, она становится доступной для других модулей (действие PUBLIC). Если метка не описана – она считается внешней (действие EXTRN).