Írásban rezidens programok ms dos
Írásban rezidens programok MS DOS
A cikk ismerteti az alapvető lépéseit írásban rezidens programokat assembly nyelven az operációs rendszer MS DOS. Végén a cikk által részletesen elemzett példa egy rezidens program.
TSR MS DOS egy darab kódot tartózkodó a számítógép memóriájában, és felhívta az esetre, ha bizonyos feltételek teljesülnek. Megmutatjuk, hogyan kell írni egy rezidens program assembly, lakóhelye memóriába, és abban az esetben, megszakítások a rendszerben. Először is vizsgáljuk meg meghatározása és az alapvető típusa megszakítások x86 processzorok.
Megszakítás x86 processzorok egy olyan esemény a rendszerben, hogy szükség van egy bizonyos kezelést. Amikor megszakítás történik, kivéve egy esetet, a jelenlegi program megszakad, és egy megszakítás feldolgozás. Miután a megszakítás végrehajtását a megszakított program folytatódik.
Az x86 processzorok, a következő típusú megszakításokat: hardver, szoftver, és a belső processzor megszakítás. Hardver megszakítások viszont megoszlanak a maszkolt és maszkolt. Maskable hardver megszakítások lehetnek proignorirovanny processzor bizonyos feltételek mellett, és az NMI mindig feldolgozásra.
Hardver megszakítás lehet meghatározni, mint egy kérelmet egy periféria (billentyűzet, soros port, floppy meghajtó, és így tovább. D.) Ebből adatfeldolgozó berendezés, kezelésére vagy előfordulása kivétel erre az eszközre. Abban az esetben, egy ilyen kérés, az aktuális program megszakad (ha a megszakítás nem vak), és az eljárást nevezik megszakítást kezelő. Megszakítás kezelő elvégzi a szükséges lépéseket, hogy adatokat szerezzen a periféria vagy irányítani őket, és visszaadja a vezérlést a megszakított programot.
Szoftver megszakítások hívni minden olyan funkciót, illetve az operációs rendszer szolgáltatások és alkalmazások a parancsot INT XX ahol XX - megszakítás száma 0-tól 255-ig A belső processzor megszakíthatja fordul elő, amikor a program bármely művelet okozó végzetes hibákat (például osztás 0, túlcsordulás a hasadási hozam szegmens határok és a t. d.), és amikor a hibakereső üzemmód.
Mindenesetre, ha egy megszakítás történik, a típus a megszakítás kezelő nevezik, amely speciálisan kivitelezett eljárás. Hardveres megszakítja egy megszakítás felvezető mellett dolgozik a készülék, hogy a megszakítást okozó, végre valami műveletet x86 processzor megszakítás mechanizmus vezérlőberendezések.
Tekintsük az írás folyamata megszakítás kezelő eljárás összeszerelés okozza, ha egy szoftver megszakítás történik. Az általános szerkezet és a szoftver megszakítás kezelő szintaxis:
Az ID NAME nevét adja meg a felvezető eljárás, ami lehet bármilyen karaktersor megengedett a szerelés, de legyen egy hivatalos vagy foglalt szó.
Az 1. szakasz megtakarítás minden regiszterek a processzor cserélhető eljárást. Ez biztosítja, hogy visszatérése után a vezérlést a megszakított program megkapta a nyilvántartások ugyanabban a formában, mint volt, mielőtt a szoftver megszakítás hívást. Ha a megszakítás vissza kell térnie a hívó program, néhány eredmények a regisztereket, majd mentse az értéke ezeknek a nyilvántartások van szükség.
A 2. részben inicializálja DS, ES vagy SS szegmens regisztrálja a megszakítás kezelő kezelési eljárások annak belső adatokat, verem vagy néhány további szegmens. Inicializált értéke nyilvántartásokat kell tartani az 1. részben.
A 3. szakaszban, sőt, végre a fő kód a megszakítás kezelő eljárás, a szükséges intézkedéseket, és a gyűjtött adatok nyilvántartása, amikor egy megszakítási vissza kell néhány eredményt a nyilvántartásokban okozta a programját.
A 4. részben helyreáll érték változott eljárás regisztrálja a megszakítás kezelő, kivéve azokat a nyilvántartások, amelyek a megszakítást okozó programot visszatérő eredményt.
IRET utasítást hajt végre visszatér a megszakítás kezelő eljárás a hívó le a program.
Nézzük meg, hogy milyen lépéseket a csapat INT és IRET.
A verem tárolja a következő sorrendben: flags regisztrálni, egy szegmens regisztrációhoz CS, utasítás mutató regiszter IP. Visszaállítása zászlók IF és TF a zászlók regisztráljon.
Számítsuk ki a offset a megszakítási vektort táblázat: offset = XX * 4, ahol XX - a megszakítás száma.
A CS szegmens regiszter alapján számított elmozdulás a megszakítási vektort táblázata megszakítás felvezető beírt érték szegmens, és a nyilvántartás IP - elmozdulás megszakítás kezelő.
Irányítás átadása történik egy szoftver megszakítás kezelő. Ugyanakkor, minden regisztert kivéve CS, IP és zászlók regisztrálja megőrzik értéküket ugyanaz, mint korábban volt az INT XX csapat hívást.
Így, amikor belép a szoftver megszakítás kezelő a verem regiszterek értékei CS, IP és egy zászló nyilvántartásban. Ezek az értékek a adatregiszterek INT XX csapat hívást. A tetején a verem az értéke az IP-nyilvántartásban.
A következő műveleteket végzik, amikor hívja IRET parancsot:
A verem helyreállt érték IP regiszter.
A verem helyreállt érték CS regiszter.
A verem értéke a zászlók regiszter helyreáll.
Irányítás átadása zajlik a megszakított program, a csapat található, közvetlenül mögötte, a szoftver megszakítás parancsot INT XX.
Végrehajtása után IRET parancs verem szerkezete azonos lesz, mint korábban volt INT XX parancs hívást.
Ezek azok a főbb pontok íráskor használt szoftver megszakítás rakodók. Mi most úgy a szerkezetét és működését a hardver megszakításkezelõkben.
Ellentétben szoftver megszakítás foglalkozók, a feldolgozók hardver interrupt parancs INT nem okozott, és a CPU is. Azt mondtuk, hogy írásakor a megszakítás kezelő hardver úgy kell végezni, több és bizonyos tevékenységek x86 processzor megszakítás mechanizmus berendezések kezelése. A legegyszerűbb esetben, a szerkezet a processzor az alábbiak szerint:
Csapatot 20h, AL végzi tevékenységét a x86 processzor megszakítás mechanizmus berendezések kezelése. Pontosabban, egy jelet küld EOI (End Of Interrupt - end interrupt) a megszakítás-vezérlő, és közölte vele, hogy a hardver interrupt feldolgozás befejeződött.
Command OUT 20h, AL, az úgynevezett end hardver megszakítás kezelő elengedi a megszakítás-vezérlő, amely lehetővé teszi számára, hogy működjön együtt a korábban lezárt megszakításokat.
Ha szükséges, hogy írjon egy hardveres megszakítás kezelő, amely csak bizonyos műveleteket, ha a hardver megszakítás történik (például, hogy adjon ki hangot, amikor megnyom egy gombot) által készített, a megfelelő felszereléssel rendszer lehet rendelni egy hardveres megszakítás kezelő. Ebben az esetben, a felvezető felépítése a következő:
Ebben az esetben a JMP SYS_HANDLER csapat végez messze ugrik a rendszer megszakítás kezelő, így a végén a felvezető nem kell igénybe venni a parancs IRET - ez az úgynevezett a rendszerben processzor.
Miután meghatároztuk, hogy az eljárás kiadására hardver vagy szoftver megszakítás kezelő, úgy a szükséges intézkedéseket annak biztosítására, hogy ez az eljárás kezelőt hívja, amikor egy megszakítás történik.
Tekintsük most az szükséges műveletek telepíteni a szegmensben, és az eltolás a táblázatban a szoftver vagy hardver megszakítás kezelő, ahol a rendszer megszakítás kezelő hivatkoznak. Ehhez írás előtt az asztalon új szegmens és offset értékeket, először meg kell menteni a szegmens és offset rendszer felvezető:
Telepítés szegmens és hardver megszakítás kezelő ellensúlyozza értéket kell állítani ezt a zászlót, ha (parancs CLI), és miután az új beállított értékek zászló IF (STI utasítás). Erre azért van szükség, hogy a telepítés során a szegmens és offset nem emelt hardveres megszakítás.
Írásakor hardver megszakítás kezelő figyelembe kell venni azt a tényt, hogy be kell fejezni, mielőtt a következő hardver megszakítás kezelő erre. Ha ez a feltétel nem teljesül, akkor a legjobb esetben, amely abból adódott megszakítás elveszik. A legrosszabb esetben elmulasztása okozhat adatvesztést, vagy lefagy a számítógép. Például, ha írunk egy hardver interrupt az időmérő felvezető, a felvezető kódot kell hajtani egy idő kevesebb, mint 1/18. mivel a megszakítás az alapértelmezett időzítő generált 18,2 másodpercenként. Ugyanez mondható el a processzor hardveres billentyűzet megszakítás - kezelő kód fusson nem hosszabb, mint a késés szimbólum ismétlés.
Továbbá, ha írásban minden megszakítás kezelő kell inicializálni a szegmens regisztrációhoz DS, ha a felvezető bármely olyan belső memória. Ehelyett, akkor a címet a memória sejtek segítségével a helyettesítő kategóriában előtag (pl CS: [BX]), de ez növeli a méret a megfelelő parancsot. A csere szegmens előtag hatásos abban az esetben, ahol a számos hozzáférések a belső processzor memóriájában sejtekre alacsony (2 - 3).
Tekintsük most az azt jelenti, hogy teljes a rezidens program és megőrzése a kódot a memóriájában a későbbi használat esetén megszakításokkal.
DOS INT 27h megszakítás. Megszakítás célja befejezni a programot, és mentse el a memóriában. Ehhez a nyilvántartás DX kell adnia a bájtok számát a visszatartó része a programnak, plusz egy bájt. Az elején a tárolt program egybeesik képest eltolt 0000h a kód szegmens, így a COM-program során figyelembe kell venni a program mérete szegmens előtag (PSP - Program Segment Prefix) - 256 bájt.
DOS INT 21h megszakítás, 31h funkciót. Funkció 31h DOS INT 21h megszakítás végzi ugyanazt a műveletet, mint a megszakítás DOS INT 27h, de a nyilvántartásban tárolt DX méret a tárolt program a fenti (memória blokkok 16 bájt hosszúságú). Lehetőség van arra is, hogy meghatározza a visszatérési kódot a befejezése a rezidens program (a nyilvántartásba felvett AL).
A következő általános szerkezetét TSR:
; adatokat a rezidens része a programnak
HANDLER endp
; adatokat a nem rezidens része a programnak
; a fő része a program (nem rezidens)
A következő kódrészlet példaként a meghatározó az elsődleges szerkezet rezidens program assembly nyelven (műsortípus COM):
Tekintsük a programot.
Az eljárás dekódoló átalakítja BCD száma regiszterben AL két ASCII-karakter értékének megfelelő a óra, perc vagy másodperc (attól függően, hogy az adott érték egy regiszterben tárolt AL). Az eljárás növeli az értékét bit (LSB tárolt első négy bitje AL regisztrációhoz vezető - a felső négy bit) ASCII kódja a karakter „0”, s ezáltal ASCII kód számjegyeinek fiatalabb vagy idősebb mentesítést. Továbbá, az ASCII kód van rögzítve az aktuális minta helyzetét. A felvétel után egy mutatót az aktuális karakter minta sablon nőtt 3 (két számjegy óra, perc vagy másodperc plusz jel „:”).