Code generation
[ ] Force far calls [X] Word align data
[ ] Overlays allowed [ ] 286 instructions
Деление на ноль
Думал,что нужно использовать прерывание INT 00h, но не понимаю как писать обработчик и перехватчик данного прерывания. Может кто-нибудь знает решение данной задачи без прерываний или предложит обработчик интовского прерывания?
условие "Программа должна поделить на 0, а лишь потом проверить: был ли делителем 0" автомтически означает что нужно использовать прерывание. Чтобы задать обработчик используй дос-функцию №25h.
не совсем дорубил, потому что я собирася использовать прерывание INT 00h. Объясните принцип работы данного прерывания.
Небольшой hint: при возникновении INT 00h на стеке в качестве адреса возврата лежит адрес инструкции вызвавшей деление на 0, так что если не принять специальных мер то при выходе из обработчика все повторится -- см. операцию mov cx, 5555h в примере
Код:
(* Division by 0 handling demo (INT00) *)
uses dos;
procedure msg; near;
begin
writeln('WARNING: division by 0!');
end;
procedure handler; assembler;
asm
pusha
call msg
popa
mov cx, 5555h { ← fix divisor («k := k div j;» below
translates into instruction IDIV CX) }
iret
end;
var k, j: byte;
Begin
SetIntVec(0, @handler);
asm jmp @1; db 6,6,6; @1: end;
k := k div j;
writeln('ok');
readln;
End.
uses dos;
procedure msg; near;
begin
writeln('WARNING: division by 0!');
end;
procedure handler; assembler;
asm
pusha
call msg
popa
mov cx, 5555h { ← fix divisor («k := k div j;» below
translates into instruction IDIV CX) }
iret
end;
var k, j: byte;
Begin
SetIntVec(0, @handler);
asm jmp @1; db 6,6,6; @1: end;
k := k div j;
writeln('ok');
readln;
End.
Заранее благодарен.
А что вам даст исполняемый файл? Просто сейчас довольно хлопотно компилировать т.к. я свой исходник у себя удалил а при копировании с форума в текст вставляются номера строк...
и у Вас всё в Turbo Pascal компилируется? Исполняемый файл даст мне готовую программу. У меня выдаёт ошибку "instruction are not enable" к pusha.
Цитата: alexeivyg
Исполняемый файл даст мне готовую программу.
*поднял вверх палец*
Цитата: alexeivyg
Исполняемый файл даст мне готовую программу.
а ну да... пример и вправду подходит под исходное условие...
Цитата: alexeivyg
У меня выдаёт ошибку "instruction are not enable" к pusha.
это лечится опциями компилятора -- включить генерацию инструкций 286-го. Если из командной строки то -$G+
Если из IDE то идете в Options → Compiler и там увидите что-то вроде
Код:
спасибо)) а сама функция 5555h отвечает за переполнение регистра?
не понял вопрос. 5555h -- это просто число