Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2011, 16:35   #1
triest
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 30
По умолчанию Выгрузка резидентной программы по нажатию клавиш

Имеем небольшой резидентик. Как организовать выгрузку по нажатью клавиши?

Код:
$M $800,0,0}

uses crt,dos;
const fil1='c:\f1.txt';
type
sob=record
year:0..2200;
year1:0..2200;
month:1..12 ;
month1:0..12 ;
hour:0..23     ;
hour1:0..23     ;
day:1..31;
day1:0..31;
minute:0..59;
minute1:0..59;
sobitie:string[50];
end;
Var
 timeintvec:procedure;
 counter,chet,year,day_of_week,month,day,hour,minute,second,milisecond,day1,month1,year1,hour1,minute1:word;
 fil:text;
 sobitie:string;
 i,j,p:integer;
 dt:array[1..100] of sob;
 {F+}
Procedure int08;
 begin
{
writeln('1');}
 inline($8);   {  18.6 raz v secundu,prerivanie taimera}
{ timeintvec;}chet:=chet+1; {nakaplivaem prerivanie taimera 60*18.6}
 if chet=1116 then writeln('1');
 { reset(fil);  }
 chet:=0;  {sbrasivaem scetchik}
    gettime(hour,minute,second,milisecond);{poluchaem vrema}
  getdate(year,month,day,day_of_week);
  for j:=1 to i do
    begin
   if dt[j].year1=year then
     if dt[j].month1=month then
      if dt[j].day1=day then
         if dt[j].hour1=hour then
           if dt[j].minute1=minute then begin if p=0 then{sravnivaem s tekychei datoi,esli sovpadaet,to vivodim sobitie}
           writeln(dt[j].sobitie);dt[j].year1:=0;
           dt[j].month1:=0;
           dt[j].day1:=0;
           dt[j].hour1:=0;
           dt[j].minute1:=0;  {vivod sobitia}
{ delay(60000);
  delay(60000); }

  sound(659);delay(500);delay(20);
  sound(523);delay(500);delay(20);
  sound(698);delay(500);delay(20);
  sound(587);delay(500);delay(20);
  sound(784);delay(500);delay(20);
  sound(880);delay(500);delay(20);
  sound(988);delay(500);delay(20);nosound;

      end;{close(fil);} end; inline($8);  end;
   { close(fil);  }

{F-}
BEGIN

{ counter:=0;  }  writeln('ww');
 assign(fil,'f1.txt');
 reset(fil);   i:=0;
 while not eof(fil) do
 begin
i:=i+1;
  readln(fil,dt[i].year1,dt[i].month1,dt[i].day1,dt[i].hour1,dt[i].minute1,dt[i].sobitie);
 end;

  for j:=1 to i do
  writeln(dt[j].year1,dt[j].month1,dt[j].day1,dt[j].hour1,dt[j].minute1,dt[j].sobitie);
  close(fil);
  writeln('shitano');

  int08;
  getintVec($8,@timeintVec);{ {poluchenii vectora}
  setIntVec($8,addr(int08));  {ustanovka vectora}

Последний раз редактировалось triest; 10.06.2011 в 16:38.
triest вне форума Ответить с цитированием
Старый 10.06.2011, 19:56   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Поставить обработчик на прерывание от клавиатуры (irq1, или int9). Словить в нем нажатие клавиши. Убрать все свои обработчики. Освободить руками все выделенные для программы блоки памяти, включая psp и прочее (на паскале это делать будет очень геморно, к слову). Ну и сделать iret из обработчика на прощание.

P.S. Суровый у тебя резидент, такие вещи в обработчике прерывания таймера делать :D
Ну и непонятно, зачем этот эзотерический инлайн. В общем, работать эта штука не будет.

Последний раз редактировалось Son Of Pain; 10.06.2011 в 19:59.
Son Of Pain вне форума Ответить с цитированием
Старый 10.06.2011, 22:10   #3
triest
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
Поставить обработчик на прерывание от клавиатуры (irq1, или int9). Словить в нем нажатие клавиши. Убрать все свои обработчики. Освободить руками все выделенные для программы блоки памяти, включая psp и прочее (на паскале это делать будет очень геморно, к слову). Ну и сделать iret из обработчика на прощание.

P.S. Суровый у тебя резидент, такие вещи в обработчике прерывания таймера делать :D
Ну и непонятно, зачем этот эзотерический инлайн. В общем, работать эта штука не будет.
Эта штука прекрасно работает.
Лучше на примере ловлю прерывания клавиатуры и очистку памяти.
triest вне форума Ответить с цитированием
Старый 10.06.2011, 23:30   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Она не может работать по определению. Как минимум потому что процедуры, обрабатывающие прерывания, должны объявляться в паскале со спецификатором interrupt;, тогда они будут завершаться инструкцией iret. Если этого не сделать, произойдет ошибка при первом же вызове обработчика.
Son Of Pain вне форума Ответить с цитированием
Старый 11.06.2011, 16:22   #5
triest
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 30
По умолчанию

Son Of Pain
Жаль.
Можете привести пример резидента, выгружающегося по нажатию клавиши?
triest вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пример резидентной программы на Delphi triest Общие вопросы Delphi 2 28.05.2011 09:39
Вывод в резидентной части программы bruk_bond Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 12 18.12.2009 11:29
Создание резидентной программы (обработчик прерывания). Петруха Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 23.03.2009 16:31
Создание резидентной программы DenisVR Свободное общение 2 07.11.2007 19:42