Аналогично обычным процедурам и функциям Borland Pascal при
использовании внешних программ на языке ассемблера для обеспече-
ния корректной работы подсистемы управления оверлеями должны соб-
людаться определенные правила программирования.
Если в программе на языке ассемблера осуществляется обраще-
ние к любой оверлейной процедуре или функции, то в программе ас-
семблера должен использоваться дальний тип вызова, и с помощью
регистра BP должны быть установлены границы стека. Например,
предположим, что OtherProc является оверлейной процедурой в дру-
гом модуле и ее вызывает программа ExternProc на языке ассембле-
ра. Тогда программа ExternProc должна иметь дальний тип вызова и
устанавливать границы стека следующим образом:
ExternProc PROC FAR
PUSH bp ; сохранить регистр ВР
mov bp,sp ; установить границы стека
SUB sp,LocalSize ; выделить локальные
; переменные
...
CALL OtherProc ; вызвать другой оверлейный
; модуль
...
mov sp,bp ; отменить локальные переменные
pop bp ; восстановить регистр ВР
RET ParamSize ; возврат управления
ExternProc ENDP
где LocalSize представляет собой размер локальных переменных, а
ParamSize - размер параметров. Если значение LocalSize равно 0,
то две строки, в которых выделяются и уничтожаются локальные пе-
ременные, можно опустить.
Если в программе ExternProc имеются косвенные ссылки на
оверлейные процедуры и функции, то эти требования остаются теми
же. Например, если процедура OtherProc вызывает оверлейные проце-
дуры или функции, но сама не является оверлейной, то программа
ExternProc должна, тем не менее, иметь дальний тип вызова и уста-
навливать границы стека.
В том случае, если в программе на языке ассемблера отсутс-
твуют прямые или косвенные ссылки на оверлейные процедуры или
функции, то никаких специальных требований соблюдаться не должно:
программа ассемблере может использовать ближний тип вызова и не
устанавливать границ стека.
Оверлейные программы на языке ассемблера не должны создавать
переменных в сегменте кода, поскольку при освобождении оверлея
любые изменения, внесенные в оверлейный сегмент кода, теряются.
Аналогично, не следует считать, что указатели на размещенные в
оверлейном сегменте кода объекты останутся действительными при
вызове других оверлеев, поскольку подсистема управления оверлеями
может свободно перемещать и освобождать оверлейные сегменты кода.