Подобно обычным функциям языка Си, внешние (external) подпрограммы на языке Ассемблера, чтобы хорошо работать с подсистемой
управления оверлеями, должны подчиняться некоторым правилам.
Если подпрограмма на языке ассемблера выполняет вызов любой
оверлейной функции, то такая подпрограмма должна иметь объявление
FAR и устанавливать границу стека при помощи регистра BP. Например, если OtherFunc - это оверлейная функция в другом модуле, и
ее вызывает подпрограмма на языке Ассемблера ExternFunc, то тогда
ExternFunc должна быть дальней (FAR) и устанавливать границы стека, как показано ниже:
ExternFunc PROC FAR
push bp ; сохранить bp
mov bp,sp ; установить стек
sub sp,LocalSize ; распределить локальные
; переменные
...
call OtherFunc ; вызов другого оверлейного
; модуля
...
mov sp,bp ; освобождение локальных
; переменных
pop bp ; восстановление BP
RET ; возврат
ExternFunc ENDP
где LocalSize - это размер локальных переменных. Если LocalSize
равен нулю, вы можете опустить две строки распределения и освобождения локальных переменных, но ни в коем случае нельзя опускать установку границ стека BP, даже если аргументов и переменных
в стеке нет.
Эти требования остаются теми же в случае, когда ExternFunc
делает косвенные ссылки на оверлейные функции. Например, если
OtherFunc вызывает оверлейные функции, но сама не является оверлейной, то ExternFunc должна быть FAR и также должна устанавливать границы стека.
В случае, когда ассемблерная подпрограмма не делает ни прямых, ни косвенных ссылок на оверлейные функции, то специальные
требования отсутствуют; подпрограмма на языке Ассемблера может
быть объявлена как NEAR. Она не обязана устанавливать границ стека.
Оверлейные подпрограммы на языке ассемблера не должны создавать переменные в кодовом сегменте, поскольку все изменения, внесенные в оверлейный кодовый сегмент, теряются при освобождении оверлея. Подобным же образом, указатели объектов, расположенных в оверлейных сегментах, не сохраняют достоверность после вызова других оверлеев, поскольку программа управления оверлеями свободно перемещает и освобождает оверлейные кодовые сегменты в памяти.