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.2.2. Тестовая программа
В следующей программе осуществляется ввод произвольного вещественного числа и находится частное от деления единицы на корень квадратный из этого числа. В программе возможно возникновение исключительной ситуации при вводе числа (ошибочный символ в записи вещественного числа), извлечении корня (число меньше нуля) и делении (делитель равен нулю). Все три критические точки запоминаются в переменной Jump, которая используется в исключительной ситуации. Программа повторяет описанные действия до тех пор, пока не будет введена единица.
_+———————---—————————————————————+