TURBO PASCAL |
Новости
|
Внешние программы в оверлеяхАналогично обычным процедурам и функциям 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 должна, тем не менее, иметь дальний тип вызова и уста- навливать границы стека. В том случае, если в программе на языке ассемблера отсутс- твуют прямые или косвенные ссылки на оверлейные процедуры или функции, то никаких специальных требований соблюдаться не должно: программа ассемблере может использовать ближний тип вызова и не устанавливать границ стека. Оверлейные программы на языке ассемблера не должны создавать переменных в сегменте кода, поскольку при освобождении оверлея любые изменения, внесенные в оверлейный сегмент кода, теряются. Аналогично, не следует считать, что указатели на размещенные в оверлейном сегменте кода объекты останутся действительными при вызове других оверлеев, поскольку подсистема управления оверлеями может свободно перемещать и освобождать оверлейные сегменты кода. |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |