Руководство по языку B.Pascal 7

         

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


Аналогично обычным процедурам и функциям 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 должна, тем не менее, иметь дальний тип вызова и уста- навливать границы стека.

В том случае, если в программе на языке ассемблера отсутс- твуют прямые или косвенные ссылки на оверлейные процедуры или функции, то никаких специальных требований соблюдаться не должно: программа ассемблере может использовать ближний тип вызова и не устанавливать границ стека.

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



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