Информационный сервер для программистов: Исходники со всего света. Паскальные исходники со всего света
  Powered by Поисковый сервер Яndex: Найдется ВСЁ!
На Главную Исходники Форум Информер Страны мира
   Резидентные Программы    >>    tsrkeep
   
 
 Об использовании KEEP() в резидентах   Виктор Вагнер 12.12.1993

Небольшая статья Виктора Вагнера об использовании KEEP для создания резидентных программ



1k 
 

From: vitus@agropc.msk.su (Vitus Wagner) Organization: Agroecological problems Center Процедура Keep - объявляет программу резидентной и делает это тупо и в лоб. Как и EXEC она не сделает ничего хорошего если вы не измените распределение памяти в вашей программе, поскольку она резервирует всю память, принадлежащую Вашей программе. Поэтому по умолчанию после ее выполнения Ваша программа займет вообще всю память и работать после ее загрузки станет невозможно. Поэтому 1. поставьте в начале программы (до слова program или uses) управллящий комментарий {$M xxx,0,zzz} где xxx - размер стека - минимум 1024, обычно достаточно 4096 для резидентной программы, а по умолчанию 16384, 0 - минимально допустимый размер динамической памяти (как правило ни на что не влияет) zzz - максимально допустимый размер динамической памяти. Ваша программа займет в памяти 256+CodeSize+DataSize+xxx+zzz байт, где Codesize и DataSize - информация, которую выдает компилятор TPC после успешной компиляции или которую можно увидеть выполнив команду меню File/Get Info в среде turbo. Не надейтесь, что и после этого память занимаемая Вашей программой будет меньше 13К 2. Процедура Keep не выполняет ExitProc и не освобождает перехваченные программой вектора прерываний, поэтому перед ее вызовом вызовите SwapVectors. 3. Позаботьтесь о том, чтобы можно было как-то добраться до того кода который вы сажаете резидентным, для чего опишите хотя бы одну процедуру типа interrupt и с помощью процедуры SetIntVec установите на нее вектор какого-нибудь прерывания. Процедуры interrupt вообще темы для отдельного разговора, но вот вам совет - не заводите в них локальных переменных (лучше совсем) ибо локальные переменные живут в стеке, а стек во время выполнения процедуры interrupt это даже не тот килобайт, который вы выделили диррективой $M а то, на что расщедрилась DOS. А она выделяет иногда всего несколько десятков байт, куда еще перед началом процедуры запихивается содержимое ВСЕХ регистров процессора. И вообще - хотите написать хороший резидент - пишите на ассемблере ;-) Origin "All dragons can fly"