|
Вопрос про прерывания в паскале, Как кроме моего оставить и штатное? |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Aug 26 2008, 16:03
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Diusha @ Aug 26 2008, 16:47)  1. А Вы не могли бы написать с правильным синтаксисом про pushf и call? На борландячем паскале нет - нет желания вспоминать. На C++, даже борландячем, могу, на ASM могу... Цитата 2. Правильно ли я понял, что если 1С, а не 08, то call не нужен? Это уже штатный callback из 08h - вешайте на него свой обработчик прерывания и пользуйте.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 26 2008, 16:09
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Я делал так: Код GetIntVec($08,Save_08); SetIntVec($60,Save_08); SetIntVec($08,@Int_08); и в прерывании: Код procedure Int_08; begin ... Intr($60,Reg); Port[$20]:=$20; end; Но я перепрограммировал таймер, потому вынужден был висеть на 8м прерывании. Если такой нужды нет, то лучше 1C конечно.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 26 2008, 18:38
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AHTOXA @ Aug 26 2008, 20:31)  Это настраивается. И в пакетном драйвере, и в программе. Естествнно настраивается, если знать  что надо убираться с этого прерывания при использовании Вашей программы, можно и искать свободный, эмулировать jump,... многое, что можно...
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 27 2008, 05:33
|

Знающий
   
Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237

|
Не нужно придумывать лишнего, усложняя себе жизнь с дополнительным int 60h. Вот заведомо рабочий код с вызовом старого обработчика. Здесь также продемонстрирована подмена стека прерванной программы на собственный стек размером 2048 байт. Подмена стека нужна, если только предполагается запускать программы в защищённом режиме DPMI, иначе возникнет "Runtime Error 202" Код const MyStackSize = 2048; type ... TInterrupt = procedure (Flags: Word); ... var ... { store original Interrupt service routine } OldIntHandler : TInterrupt; SSp, SPp : word; MyStack : array[1..MyStackSize] of char; ...
{==== Interrupt Handlers ====}
{$F+}
procedure MyIntHandler(Flags, CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP: Word); interrupt; begin asm mov SSp, ss mov SPp, sp mov ss, ax mov ax, offset MyStack add ax, MyStacksize-2 mov sp, ax end; .... {user defined code}....
OldIntHandler(Flags);
asm mov ss, SSp mov sp, SPp end;
port[$20]:=$20; end;
{$F-}
begin ... getintvec($08,@OldIntHandler); setintvec($08,@MyIntHandler); ... end.
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Aug 27 2008, 08:11
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(zltigo @ Aug 27 2008, 00:38)  Естествнно настраивается, если знать  что надо убираться с этого прерывания при использовании Вашей программы А какие проблемы настроить? Почему захват пакетным драйвером вектора 60h вас не смущает, а захват оного моей программой - смущает? Цитата(zltigo @ Aug 27 2008, 00:38)  можно и искать свободный, эмулировать jump,... многое, что можно... Да много чего можно, кто же спорит  Цитата(Demeny @ Aug 27 2008, 11:33)  Вот заведомо рабочий код с вызовом старого обработчика. А где pushf перед вызовом? Цитата(Demeny @ Aug 27 2008, 11:33)  Здесь также продемонстрирована подмена стека прерванной программы на собственный стек размером 2048 байт. Подмена стека нужна, если только предполагается запускать программы в защищённом режиме DPMI, иначе возникнет "Runtime Error 202" Ничего не возникает и без этого.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 27 2008, 08:36
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AHTOXA @ Aug 27 2008, 10:11)  А какие проблемы настроить? Почему захват пакетным драйвером вектора 60h вас не смущает, а захват оного моей программой - смущает? Надо отличать минимально необходимые настройки от лишних сущностей. Цитата А где pushf перед вызовом? В приведенном случае вызываемя функция вызывается с параметром  и декларирована, как обработчик прерывания. Цитата Ничего не возникает и без этого. Слишком категорично  . Работает какая-то программа, имеет свой стек, на который и рассчитывает и вдруг ее кто-то прерывает и начинает пользовать ее стек  . Естественно, если Вы воспользуетесь счинанными байтами практически наверняка ничего не произойдет - редко стеки до байта рассчитывают, а вот если что-то будете более-менеее суровое в прерывании делать, то тогда свой стек надо ставить. Вопрос только как, ибо ASM вставки типа приведенных сносят оптимизацию борланду начисто.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 27 2008, 08:38
|

Знающий
   
Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237

|
Цитата(AHTOXA @ Aug 27 2008, 12:11)  А где pushf перед вызовом? А зачем ?  Сохранить флаги и регистры и восстановить их - это задача старого обработчика, если он корректно написан (иначе как же он работал до этого). Цитата(AHTOXA @ Aug 27 2008, 12:11)  Ничего не возникает и без этого. Не возникает, если Вы не используете локальные переменные в своём обработчике. У меня, например, в обработчике прерывания идёт гигантская работа с обилием локальных переменных, вызов других функий и т. п. Поэтому я сделал себе свой "локальный" стек. Без него у меня программа валится по "Runtime Error 202" (DPMI, защищённый режим).
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|