реклама на сайте
подробности

 
 
> Вопрос про прерывания в паскале, Как кроме моего оставить и штатное?
Diusha
сообщение Aug 26 2008, 14:14
Сообщение #1


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Упрощенно прога:

Var xxx : pointer;
{$F+}
Procedure pr; interrupt;
begin
. . . . . .
end;
{F-}
BEGIN
getintvec($08, xxx);
setintvec($08, addr(pr));
. . . . . . .
END.

Вместо срандартного прерывания $08 назначена и выполняется моя процедурка pr, это работает. А как бы так сделать, чтобы кроме pr выполнялась и штатная ПП этого прерывания? (то биш в pr надо как-то вставить CALL (xxx) ???)
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
zltigo
сообщение Aug 26 2008, 14:27
Сообщение #2


Гуру
******

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



Цитата(Diusha @ Aug 26 2008, 16:14) *
...то биш в pr надо как-то вставить CALL (xxx)

И пред этим pushf не забыть smile.gif, ибо iret. А вообще не лезте на 08h таймера, тем более Паскль... Учтите матчасть - 1Сh для юзеров.
И вообще, учитесь вопросы задавать, тем более на эмбеддерском форуме вдруг со своими боладопаскалями и писишкаим sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Diusha
сообщение Aug 26 2008, 14:47
Сообщение #3


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



1. А Вы не могли бы написать с правильным синтаксисом про pushf и call?
2. Правильно ли я понял, что если 1С, а не 08, то call не нужен?
(сейчас откопал, что inicially он указывает на dummy iret)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 26 2008, 16:03
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 26 2008, 16:09
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 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 конечно.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Diusha
сообщение Aug 26 2008, 16:24
Сообщение #6


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



zltigo, AHTOXA,
спасибо!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 26 2008, 17:31
Сообщение #7


Гуру
******

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



Цитата(AHTOXA @ Aug 26 2008, 18:09) *
SetIntVec($60,Save_08);

Только вот гарантий свободости 60h вектора в общем случае нет.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 26 2008, 18:09
Сообщение #8


фанат дивана
******

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



Конечно. Но это не помешает работать нашей программеsmile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 26 2008, 18:18
Сообщение #9


Гуру
******

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



Цитата(AHTOXA @ Aug 26 2008, 20:09) *
Конечно. Но это не помешает работать нашей программеsmile.gif

Еще как помешает sad.gif - именно в качестве софтового прерывания его именно и используют, например Ethernet пакетный драйвер попытается общаться с обработчиком.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 26 2008, 18:31
Сообщение #10


фанат дивана
******

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



Цитата(zltigo @ Aug 27 2008, 00:18) *
Еще как помешает sad.gif - именно в качестве софтового прерывания его именно и используют, например Ethernet пакетный драйвер попытается общаться с обработчиком.


Это настраивается. И в пакетном драйвере, и в программе.
Однако же не припоминаю конфликтов. У меня это работало под всеми дос от 3.3 до 7.0 и с несколькими драйверами сетевух.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 26 2008, 18:38
Сообщение #11


Гуру
******

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



Цитата(AHTOXA @ Aug 26 2008, 20:31) *
Это настраивается. И в пакетном драйвере, и в программе.

Естествнно настраивается, если знать sad.gif что надо убираться с этого прерывания при использовании Вашей программы, можно и искать свободный, эмулировать jump,... многое, что можно...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Demeny
сообщение Aug 27 2008, 05:33
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 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.


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 27 2008, 08:11
Сообщение #13


фанат дивана
******

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



Цитата(zltigo @ Aug 27 2008, 00:38) *
Естествнно настраивается, если знать sad.gif что надо убираться с этого прерывания при использовании Вашей программы


А какие проблемы настроить? Почему захват пакетным драйвером вектора 60h вас не смущает, а захват оного моей программой - смущает?


Цитата(zltigo @ Aug 27 2008, 00:38) *
можно и искать свободный, эмулировать jump,... многое, что можно...

Да много чего можно, кто же споритsmile.gif

Цитата(Demeny @ Aug 27 2008, 11:33) *
Вот заведомо рабочий код с вызовом старого обработчика.


А где pushf перед вызовом?

Цитата(Demeny @ Aug 27 2008, 11:33) *
Здесь также продемонстрирована подмена стека прерванной программы на собственный стек размером 2048 байт. Подмена стека нужна, если только предполагается запускать программы в защищённом режиме DPMI, иначе возникнет "Runtime Error 202"


Ничего не возникает и без этого.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 27 2008, 08:36
Сообщение #14


Гуру
******

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



Цитата(AHTOXA @ Aug 27 2008, 10:11) *
А какие проблемы настроить? Почему захват пакетным драйвером вектора 60h вас не смущает, а захват оного моей программой - смущает?

Надо отличать минимально необходимые настройки от лишних сущностей.
Цитата
А где pushf перед вызовом?

В приведенном случае вызываемя функция вызывается с параметром smile.gif и декларирована, как обработчик прерывания.
Цитата
Ничего не возникает и без этого.

Слишком категорично smile.gif. Работает какая-то программа, имеет свой стек, на который и рассчитывает и вдруг ее кто-то прерывает и начинает пользовать ее стек sad.gif. Естественно, если Вы воспользуетесь счинанными байтами практически наверняка ничего не произойдет - редко стеки до байта рассчитывают, а вот если что-то будете более-менеее суровое в прерывании делать, то тогда свой стек надо ставить. Вопрос только как, ибо ASM вставки типа приведенных сносят оптимизацию борланду начисто.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Demeny
сообщение Aug 27 2008, 08:38
Сообщение #15


Знающий
****

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



Цитата(AHTOXA @ Aug 27 2008, 12:11) *
А где pushf перед вызовом?

А зачем ? smile.gif Сохранить флаги и регистры и восстановить их - это задача старого обработчика, если он корректно написан (иначе как же он работал до этого).
Цитата(AHTOXA @ Aug 27 2008, 12:11) *
Ничего не возникает и без этого.

Не возникает, если Вы не используете локальные переменные в своём обработчике. У меня, например, в обработчике прерывания идёт гигантская работа с обилием локальных переменных, вызов других функий и т. п. Поэтому я сделал себе свой "локальный" стек. Без него у меня программа валится по "Runtime Error 202" (DPMI, защищённый режим).


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st August 2025 - 21:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01508 секунд с 7
ELECTRONIX ©2004-2016