TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

2.2.1. Текст модуля F_Jump

Ниже приводится текст модуля F_Jump, в котором объявляется тип JumpRec и два макроса SetJump и LongJump. Макрос Setiump осуществляет необходимые действия по сохранению регистров, поэтому его необходимо размещать непосредственно перед тем оператором, на который требуется передать управление в случае возникновения исключительной ситуации. Макрос LongJump осуществляет обратные действия — восстанавливает сохраненные ранее регистры. В результате его работы управление будет передано в нужную точку программы, поэтому этот макрос следует размещать внутри процедуры выхода, непосредственно перед ее завершением.

^=====—=======; UNIT F_Jump; {===='==========}

{

+----------------------------------------------------------+

I Модуль содержит макроопределения, позволяющие запомнить \ ¦ любую точку программы с тем, чтобы после обработки ошибки\ \ периода исполнения передать управление в эту точку. I

+_-------„--------------------------------------------------/-

;

INTERFACE type

JumpRec = record

SPsave, {Сохраняет регистр SP} BPsave: Word; {Сохраняет регистр DP} JmpPtr: Pointer (FAR-адрес продолжения}

end; {JumpRec} ^——,-.-.-————————;

Procedure Set Jump(var JumpDest: JumpRec);

{Этот макрос обеспечивает сохранение содержимого регистров SP, BP и IP в записи JumpDest. Запоминается состояние, которое имели регистры в момент вызова макроса. Это обеспечивает последующий возврат процедурой LongJump в точку, непосредственно следующую за вызовом.} InLine ( $5F/

{pop di ,'DI^Ofs(JumpDest) } $07/

{pop es ;ES=Seg(JumpDest) } S26/$89/$25/

{mov es:[di],sp ;помещаем SP в SPsave } $26/$89/$6D/$02/

{mov es:[d.i+2],bp /помещаем BP в BPsave } $E8/$00/$OO/

{call null /помещаем в стек текущий} {null: /адрес командой CALL} $58/

{pop ax ;АХ=текущий адрес } $05/$ОС/$ОО/

{add ax,12 ;смещение команды NEXT } $26/$89/$45/$04/

{mov es:[di+4],ax /сохраняем FAR-адрес } $26/$8C/$4D/$O6) ;

{mov es:[dl+6],cs ;команды NEXT в JmpPtr} {NEXT: ; эта инструкция идет сразу за макросом и связана

с началом очередного оператора Турбо Паскаля} _•———.—————————;

Procedure LongJump(var JumpDest: JumpRec);

{Этот макрос восстанавливает содержимое регистров SP и BP из полей SPsave, BPsavp записи JumpDest и делает 

FAR-переход по адресу JmpPtr.}

inline (

$5F/

{pop di ;DI=Ofs(JumpDest) } $07/

{pop es ;ES=Seg(JumpDest) } $26/$8B/$25/

{mov sp,es:[di] ;восстанавливаем SP } $26/$8B/$6D/$02/

{mov sp,es:[di+2] ;восстанавливаем ВР } $26/$FF/$6D/$04);

{jmp far es:[di+4] ; FAR-переход } IMPLEMENTATION

Макрос SetJump располагается непосредственно перед оператором, на который передается управление при возникновении исключительной ситуации. Так как для выполнения всех предусмотренных в макросе действий он должен получить управление, следующий за ним оператор Турбо Паскаля может выполняться дважды: первый раз при инициации процедуры выхода, т.е. до возникновения исключительной ситуации (и сразу после выполнения макроса SetJump), второй раз после ее возникновения (и сразу после выполнения макроса LongJump). Разумеется, второй проход оператора вовсе не обязателен — он будет осуществлен только при возникновении исключительной ситуации. Однако программист обязан помнить о своеобразной реентерабельности этой точки программы и предусмотреть в ней альтернативные действия. Таким образом, оператором, на который передается управление в исключительной ситуации, как правило, является условный оператор. В качестве условия, управляющего его работой, следует использовать какой—то признак, свидетельствующий о возникновении исключительной ситуации или о ее отсутствии. Этим признаком может быть логический флаг, устанавливаемый процедурой выхода, или содержимое стандартных переменных ExitCode и ErrorAddr (если, разумеется, процедура выхода не сбрасывает эти значения).

 

Глава 2

Оглавление

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz