Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обработка вектора прерывания (0).

26K
13 апреля 2007 года
An12345
3 / / 30.03.2007
Добрый вечер всем=)
Столкнулся с необходимостью ручной обработки ошибок вычислений
(Деление на 0, неверный параметр корня и т.д.).

Собсно как я понял в Паскале единственный способ это сделать, это перенаправить вектор прерываний?
Написал небольшой примерчик,
Код:
uses DOS;
var No:Byte;P:^Byte;PP:Pointer;x,y:integer;isErr:Boolean;
Procedure NN; interrupt;
Begin
writeln('Err DBZ...');
y:=0;
isErr:=true;
End;
Begin
   isErr:=false;
  {PP:=PTR($0,$0);}
  No:=0;
  getIntVec(No,PP);
  setIntVec(No,addr(NN));
  Readln(x);
  writeln(1 div (2-x));
  setIntVec(No,PP);
  readln;
End.


Но возник вопрос, как вернуть управление в программу из функции на которую ссылается правленный вектор?
Если в процедуре прописать исходный вектор setIntVec(No,PP);, то программа все - равно выпадает с Division by Zero.
Мне нужно, чтобы в случае деления на нуль, устанавливался флаг ошибки, модифицировалась переменная и продолжилась линия основной программы, как это можно реализовать? И если кто знает, какое прерывание отвечает за извлечение корня из отрицательного числа?

P.S.> Сейчас функция NN при делении на 0 (вводе 2) зацикливается и выход из нее не происходит :(

P.P.S.> Может есть более рациональный способ реализовать это ?
(проверку делителя на <>0 не предлагать :) )

Заранее огромное спасибо кто откликнется :p
252
15 апреля 2007 года
koderAlex
1.4K / / 07.09.2005
возврат происходит по адресу инструкции вызвавшей прерывание . так как аргументы не изменились , то прерывание присходит снова .
26K
16 апреля 2007 года
An12345
3 / / 30.03.2007
Цитата: koderAlex
возврат происходит по адресу инструкции вызвавшей прерывание . так как аргументы не изменились , то прерывание присходит снова .


Это возможно обойти ?
Простое изменение переменной x не помогает =(

252
16 апреля 2007 года
koderAlex
1.4K / / 07.09.2005
надо изменить или адрес возврата , или аргументы команды в обработчике прерывания .
26K
16 апреля 2007 года
An12345
3 / / 30.03.2007
Не подскажешь, как это сделать ? :)
так все равно зацикливается :(
Код:
uses DOS;
var No:Byte;P:^Integer;PP:Pointer;x,y:integer;
Procedure NN; interrupt;
Begin
writeln('Error...',x);
y:=0;
x:=x-1;
End;

Begin
  No:=$0;
  getIntVec(No,PP);
  setIntVec(No,addr(NN));
  Readln(x);
  y:=(1 div (2-x));
  setIntVec(No,PP);
  readln;
End.
252
18 апреля 2007 года
koderAlex
1.4K / / 07.09.2005
естественно . ты же меняеш значение переменной , а не значение регистра . посмотри под дебагером в какой регистр кладётся переменная и в обработчике вставь строчку вида : asm{inc [регистр]};
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог