Субпроцессор ва резидент программалар. Фойдаланувчининг ўзи ҳам узилиш программаларини яратиши мумкин. Бу процедура бош қисми қуйидагича бўлиши керак.
Procedure IntProc (Flag, CS, IP, ..., ES, BP : Word); Interrup;
Параметрлар рўйхатида узилиш бўлмаслиги керак. Бош қисмидан маълум қисмини ташлаб юбориш мумкин.
Мисол.
Uses Dos;
Var
GlVar1, GlVar2, GlVar3, ... , GlVarK : Word;
{$F+}
Procedure MyInterupt(Flag, Cs, Ip, Ax, ..., Bp : Word); Interrupt;
Var
{локал ўзгарувчилар}
Begin
GlVar1 :Ax;
GlVar2 : Port[N];
. . .
End;
{$F-}
Var
N : Byte;
OldInterrupt : Pointer;
Begin
N :={алмаштириладиган узилиш номери}
GetIntVec (N, OldIntVectN);
SetIntVec(N, @MyInterrupt);
{ программа ўз узилиши билан ишлайди}
SetIntVec(N, OldIntVecN);
End;
Субпроцесс (субжараён) деганда бир программа ичидан иккинчи программани ишга туширишга айтилади. Мисол учун Norton Commander программаси субпроцессорли норезидент программадир. Субпроцесс рўй берганда асосий программа «тўхтаб» қолади, субпроцесс тугагандан кейин ўз ишини давом эттиради.
Резидент программаларнинг асосий хусусияти шундаки, бу программалар оператив хотирага юклангандан кейин хотирада сақланиб қолади ва маълум бир шартлар бажарилганда ишга тушади. Одатда бундай программалар узилиш номерларига боғланган бўлади (масалан, турли драйверлар, антивирус ва вирус программалар ва ҳакозо). Пассив ҳолда резидент программалар ҳеч қандай таъсирга эга эмас.
Субпроцессни амалга оширишда хотирадан унумли фойдаланиш керак. Бунинг учун {$М, Стек, МинимумУюм, МаксимумУюм} псевдоизохи ёрдамида хотирани программалар ўртасида тақсимотини амалга ошириш мумкин. Бунда стек – 1..64Kb, МинимумУюм ва МаксимумУюм 0..655360 (640Kb) бўлган сон. Бу қийматлар орқали хотиранинг стек ва уюмига «буюртма» бериш мумкин.
Мисол учун, программа 986 байт стек, 2000 байт уюм хотира ишлатадиган бўлса, бу талаб {$M 1024,0,2048} орқали берилиши мумкин. {$М, 4096, 0, 0} – уюм ишлатмайдиган программа.
Субпроцессор процедуралари. SwapVectors – ТП муҳитидан бир программа ишга тушганда узилишлар векторида ўзгаришлар содир бўлади. Лекин узилишлар векторининг олдинги ҳолати Pointer туридаги SaveIntNN (NN-узилиш номери) ўзгарувчиларида сақланиб қолади. Субпроцессорлар ишга тушганда асосий программа ҳолатини англатувчи (аниқловчи) узилишлар векторини сақлаб қолиш ва субпроцессор тугагандан кейин тиклаш керак. Бу вазифани SwapVectors амалга оширади. Биринчи марта чақирилганда ҳолатни сақлаб қолади, иккинчи марта чақирилганда уни тиклайди.
Exec(ExeFile, Comline : String) – субпроцессорни ишга туширади. Бу ExeFile – ишга тушириладиган иш модул (файл) номи, Сomline – ишга тушириладиган программа учун буйруқ сатри.
Мисол учун, “C:Format a:s” DOS буйруғини программа ичидан бажариш учун қуйидаги процедура – операторларини ёзиш керак.
Swapvectors;
Exec(‘c: format.com’,’a:/s’) ;
Swapvectors;
Do'stlaringiz bilan baham: |