Шаг 33.
Межсегментные вызовы
На этом шаге мы рассмотрим организацию межсегментных вызовов.
Современные программные проекты состоят, как правило, из нескольких модулей, каждый из которых содержит свою
часть программы. Так как отдельный модуль в соответствии с концепцией модульного программирования - это
функционально автономный объект, то он ничего не должен знать о внутреннем устройстве других модулей, и наоборот,
другим модулям также ничего не известно о внутреннем устройстве данного модуля. Но должны быть какие-то средства,
с помощью которых можно связать модули в одно целое.
Таким образом, каждый модуль должен иметь такие средства, с помощью которых он извещал бы транслятор о том, что
некоторый объект (процедура, переменная) должен быть видимым вне этого модуля. И наоборот, нужно объяснить
транслятору, что некоторый объект находится вне данного модуля. Это позволит транслятору правильно сформировать
машинные команды, оставив некоторые их поля незаполненными. Позднее, на этапе компоновки, программа компоновки
произведет настройку модулей и разрешит все внешние ссылки в объединяемых модулях.
Для того чтобы объявить о подобного рода видимых извне объектах, программа должна использовать две директивы
EXTRN и PUBLIC. Директива EXTRN предназначена для объявления некоторого имени
внешним по отношению к данному модулю. Это имя в другом модуле должно быть объявлено в
директиве PUBLIC. Директива PUBLIC предназначена для объявления некоторого имени,
определенного в этом модуле, видимым также в других модулях. Синтаксис этих директив следующий:
EXTRN <имя1: тип1>, ..., <имяN: типN>
PUBLIC <имя1>, ...,<имяN> .
Здесь имя - идентификатор, определенный в другом модуле. В качестве идентификатора могут
выступать:
- имена переменных, определенных директивами типа DB, DW и т. д.;
- имена процедур;
- имена констант, определенных операторами = и EQU.
Тип определяет тип идентификатора. Указание типа необходимо для того, чтобы транслятор правильно
сформировал соответствующую машинную команду. Действительные адреса будут вычислены на этапе редактирования,
когда будут разрешаться внешние ссылки. Возможные значения типа определяются допустимыми типами объектов для
этих директив:
- если имя - это имя переменной, то тип может принимать значения BYTE, WORD, DWORD,
PWORD, FWORD, QWORD и TBYTE;
- если имя - это имя процедуры, то тип может принимать значение NEAR или FAR;
- если имя - это имя константы, то тип должен быть ABS.
Покажем принцип использования директив
EXTRN и
PUBLIC на схеме связи двух модулей 1 и 2.
;Модуль 1
PUBLIC my_proc_1 ;Объявляем процедуру видимой извне.
. . . . .
Codesg SEGMENT PARA PUBLIC
my_proc_1 PROC FAR ;Данное значение расстояния указывает, что
;при возврате из процедуры из стека будет
;извлечено два слова.
. . . . .
my_proc_1 ENDP
my_proc_2 PROC
. . . . .
my_proc_2 ENDP
Codesg ENDS
END
;Модуль 2
EXTRN my_proc_1: Far ;Объявляем процедуру внешней.
;Заданный тип указывает, что при обращении
;к процедуре в стек в качестве адреса возврата
;будет помещено два слова.
. . . . .
Codesg SSGMENT PARA PUBLIC
Begin PROC FAR
. . . . .
CALL my_proc_1 ;Вызов процедуры из модуля 1.
. . . . .
Begin ENDP
Codesg ENDS
END Begin
Рассмотренная нами схема связи - это, фактически, связь по управлению. Но не менее важно организовать
информационный обмен между модулями. Рассмотрим основные способы организации такой связи.
На следующем шаге мы рассмотрим способы передачи данных в процедуру.
Предыдущий шаг
Содержание
Следующий шаг