|
Вопрос про прерывания в паскале, Как кроме моего оставить и штатное? |
|
|
|
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, защищённый режим).
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Aug 27 2008, 09:25
|

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

|
Цитата(zltigo @ Aug 27 2008, 12:49)  Понятно  переписали прием откуда-то не думая... Ну дык ... если сороконожка будет думать, как ходит её каждая нога - она вообще с места не сдвинется. А ресурс по Паскалю, откуда я это списал, и вправду неплохой http://pascal.sources.ru. Но то, что у меня это работает - истинная правда.
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Aug 27 2008, 10:15
|

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

|
Цитата(zltigo @ Aug 27 2008, 14:36)  Надо отличать минимально необходимые настройки от лишних сущностей. Настройки есть, как данность. Так что сущностей не добавляется. [off]Меня удивляет вот что. Человек задал вопрос, на который вы не дали ответа, ибо у вас "нет желания вспоминать". Я дал готовый, проверенный вариант, и тут у вас неожиданно появилось это желание. Выходит, желание раскритиковать сильнее желания помочь?  [/off] Цитата(zltigo @ Aug 27 2008, 14:36)  В приведенном случае вызываемя функция вызывается с параметром  и декларирована, как обработчик прерывания. Это где? Вот это чтоль: Код type TInterrupt = procedure (Flags: Word); var OldIntHandler : TInterrupt; ? Какой же это обработчик? Цитата(zltigo @ Aug 27 2008, 14:36)  Слишком категорично  . Работает какая-то программа, имеет свой стек, на который и рассчитывает и вдруг ее кто-то прерывает и начинает пользовать ее стек  . Естественно стек делается с рассчётом на обработчик прерывания. Это гораздо проще, чем заводить отдельный стек на обработчик. "Зачем плодить лишние сущности"?  А моё возражение было насчёт того, что в DPMI надо делать что-то особенное со стеком, а то без этого не работает. Цитата(Demeny @ Aug 27 2008, 14:38)  Не возникает, если Вы не используете локальные переменные в своём обработчике. Конечно же использую, и ничего не валится. Дело наверное в чём-то другом. Может банально не хватает стека.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 27 2008, 16:29
|

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

|
Цитата(AHTOXA @ Aug 27 2008, 12:15)  Человек задал вопрос, на который вы не дали ответа, ибо у вас "нет желания вспоминать". Если быть точным и прочитать написанное мной полностью, то нет желания вспоминать диалект Паскаля не имеющий актуальности с 90x годов. Помочь не оказывался, в том числе и конкретными кодом  . И обсуждать начал отнюдь не Паскаль, а подход к делу. Не нервничайте. Цитата ? Какой же это обработчик? Опять через слово читаете  это декларация обработчика. Цитата Естественно стек делается с рассчётом на обработчик прерывания. Да ну  А DOS, насамом деле вполне себе многозадачная система - драйвера, TSR-ы, само ядро... C чего Вы взяли, что прерывать будут исключительно Вашу программу c "рассчитанным" стеком?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 27 2008, 17:38
|

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

|
Цитата(zltigo @ Aug 27 2008, 22:29)  Помочь не оказывался, в том числе и конкретными кодом  . Однако же не помогли  . Цитата И обсуждать начал отнюдь не Паскаль, а подход к делу. Не нервничайте. Да я не нервничаю. Просто удивляюсь... Цитата Опять через слово читаете  это декларация обработчика. Это вы через слово цитируете. Вы написали, что Цитата В приведенном случае вызываемя функция вызывается с параметром и декларирована, как обработчик прерывания. (выделение моё). Вот я и поинтересовался, где она декларирована как обработчик прерывания. Цитата C чего Вы взяли, что прерывать будут исключительно Вашу программу c "рассчитанным" стеком? Да, тут я был не прав. Посмотрел, почему же тогда у меня всё работало, оказывается я в прерывании работал только с глобальными переменными. Но продолжаю настаивать, что это не зависит от DPMI
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 27 2008, 19:07
|

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

|
Цитата(AHTOXA @ Aug 27 2008, 19:38)  Однако же не помогли  . Однако предлагал C/C++/ASM но никого не заинтересовал  Цитата (выделение моё). Вот я и поинтересовался, где она декларирована как обработчик прерывания. Декларирована и используется как обработчик прерывания c фокусом ввиде запихивания в стек параметра. В борлянячем "С" можно и "естественее" c квалификатором interrupt. Код void interrupt (*old_xxx_vect)(...);
void interrupt xxx_handler(...) { ...... (*old_xxx_vect)(); ..... } Цитата Но продолжаю настаивать, что это не зависит от DPMI Продолжайте настаивать, только зачем обращаясь ко мне  ?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 27 2008, 19:18
|

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

|
Цитата(zltigo @ Aug 28 2008, 01:07)  Декларирована и используется как обработчик прерывания c фокусом ввиде запихивания в стек параметра. Вот именно что декларирована она как обычная процедура с параметром типа word. А используется как обработчик прерывания. Кстати, какие гарантии, что параметр будет передан на стеке? Цитата Продолжайте настаивать, только зачем обращаясь ко мне  ? Да тут больше нет никого, а понастаивать охота
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|