Четвертый BORLAND С++ и его окружение

       

Внешние подпрограммы в оверлеях


Подобно обычным функциям языка Си, внешние (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. Она не обязана устанавливать границ стека.

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



Содержание раздела