Rezidentní programy

Rezidentní programy jsou obecně takové programy, které zůstávají v paměti i po ukončení. Definice je jednoduchá, stejně tak je jednoduché i psaní rezidentních programů. Je ale potřeba znát některé důležité věci, bez kterých končí první vyvolání rezidentní rutiny krachem systému.

Poznámka: Od teďka se již vůbec nebudu zmiňovat o tom, že si to a to můžeš přečíst v SYSMANovi. Znalost veškerých parametrů služeb, adres portů, zde nepopsaných instrukcí atd. budu brát jako samozřejmnost.

Již u popisování instrukce INT jsem se lehce zmínil o tom, že existují dva druhy přerušení. Lépe řečeno - žádné druhy nejsou, jen některá přerušení jsou na určitý podnět sama volána řadičem přerušení(příchod znaku z portu, časovač, stisknutí/uvolnění klávesy ...). K tomu je třeba dodat několik věcí :

  1. Instrukce jsou nedělitelné, neboli hardwarové přerušení může nastat vždy po dokončení instrukce. Procesor prostě aktuální instrukci dodělá a pak teprve může nastat přerušení.
  2. Hardwarová přerušení nemohou nastat v případě, že interrupt flag je roven 0. Toto neplatí pro nemaskovatelné(NMI) přerušení, které nastává v případě havárie(vypnutej proud).
    Pro připomenutí - Měnění hodnot flagů.
  3. Existuje 16(+NMI) hardwarových přerušení. Pomocí řadiče lze nadefinovat, která mohou nastat a která nikoliv. Pokud chci dělat rez. program, který využívá přerušení, které je za normálních okolností zakázané(třeba komunikace po sér. portu, kde není myš), musím si toto přerušení povolit.
Zatím nechám teoretických úvodů a raději napíšu náš první rezident, na kterém vysvětlím vše potřebné. Něco jednoduchého ... Jo. Program, který jednou za nějakou dobu napíše do levého horního rohu obrazovky znak "A", za chvíli "B" atd. Napíšu to jen s některými komentáři, kompletní popis najdeš dole.

Rezident č. 1, použití hardwarového přerušení

A           SEGMENT
            ASSUME CS:A,DS:A
            ORG 100H
            .386

START:      JMP SETUP     ; Skočím na inicializační část programu

VISIM:      INC CS:[CAS]  ; Přičtu si svůj interní časovač
            TEST CS:[CAS],15   ; Jsou jeho 4 dolní bity=0 ?
             JNZ SEM      ; Ano, neboli časovač je dělitelný 16-ti
            PUSH ES AX    ; Uložím hodnoty ES a AX

            MOV AL,20H
            OUT 20H,AL    ; Viz. vysvětlení

            MOV AX,0B800H
            MOV ES,AX     ; Adresa videopaměti(v text. módu) do ES

            MOV AX,CS:[CAS]
            SHR AX,4      ; Do AX jde čas dělený 16-ti(které písmeno vykreslit)
            ADD AL,65     ; Přičtu ASCII hodnotu písmena "A"
            MOV ES:[0],AL ; Dám do videopaměti
            POP AX ES     ; Původní registry

SEM:        DB 0EAH       ; Viz. vysvětlení
PUVOB       DD 0          ; Adresa původní obsluhy přerušení
CAS         DW 0          ; Můj časovač

SETUP:      MOV AX,3508H
            INT 21H       ; Zjištění adresy obsluhy přerušení
            MOV WORD PTR CS:[PUVOB],BX
            MOV CS:[PUVOB+2],ES  ; Uložím si ji do proměnné PUVOB

            MOV DX,OFFSET VISIM  ; Adresa nové obsluhy přerušení(mojí)
            MOV AX,2508H
            INT 21H      ; Nastavení adresy

            MOV DX,OFFSET SETUP+1
            INT 27H      ; Ukončí program, ale nechá ho v paměti

A ENDS
END START
A teď to vysvětlím(napsat to zabere tak půl hodiny...) : Zapsání písmene do videopaměti je(doufám) jasné, tak jdem na poslední věc. Půl hodiny uplynulo a ty již (doufám) rozumíš tomuto jednoduchému rezidentu.

Poznámka pro ty, kteří nečtou text odzhora dolů : Pokud nechápeš, co má Norton společného s rezidenty, přečti si třetí bod vysvětlení. Pochopíš, že to je jen příklad.


Rezident používající hardwarové přerušení máme za sebou a teď napíšu něco pro softwarové přerušení. Třeba program, který nedovolí smazat žádný soubor ani adresář(ze všech disků).

Rezident č. 2, použití softwarového přerušení

A       SEGMENT
        ASSUME CS:A,DS:A
        ORG 100H
START:  .286
        JMP SETUP

VISIM:  CMP AH,41H     ; Služba DOSu "Smaž soubor"
         JZ NEMAZ
        CMP AH,14H     ; Služba DOSu "Smaž soubor přes FCB"
         JZ NEMAZ
        CMP AH,3AH     ; Služba DOSu "Smaž adresář"
         JZ NEMAZ
        JMP SEM        ; Nic se nemaže, skočím na pův. obsluhu

NEMAZ:  PUSH BX        ; Mazat se nebude !
        MOV BX,SP     
        OR WORD PTR SS:[BX+6],1 ; Nastavím vlajku CF(=nastala chyba)

        MOV AX,5       ; Nějaký chybový kód
        POP BX
        IRET

SEM:    DB 0EAH
PUVOB   DD 0

SETUP:  MOV AX,3521H  ; Klasická inicializační část, no comment.
        INT 21H
        MOV WORD PTR CS:[OFFSET PUVOB],BX
        MOV WORD PTR CS:[PUVOB+2],ES
        MOV AX,2521H
        MOV DX,OFFSET VISIM
        INT 21H

        MOV DX,OFFSET SETUP
        INT 27H

A       ENDS

END     START
Ještě to vysvětlit a můžu konečně začít pařit Dunu 2000(mimochodem, pro ty, kteří hráli DUNU II je to pěkně chabý. A jednoduchý).

Uvedené rezidenty
Und das ist alles.

.

.

Pokud někdo vlastní právě tuto verzi mého dokumentu, tak ať ví, že zde bude v budoucnosti pokračovat další výklad ...

.

.

Z vlastní zkušenosti doporučuji používat Volkov Commander při psaní rezidentů. Má jednu funkci k nezaplacení - dokáže odstranit(Alt-F5) všechny (jednoduché) rezidentní programy, které z něj spustíš. To je neocenitelná věc, protože většina tvých rezidentů bude nejspíš neodinstalovatelná. A reset po každém nepodařeném pokusu je hrozná ztráta času ...

Jak tak přemýšlím nad tím, co jsem teď napsal a vzpomínám na doby před třemi čtymi lety, dospívám k názoru, že by nebylo úplně od věci napsat úvahu na téma "Význam rezidentních programů v době WINDOWS 95 a hlavně WINDOWS NT." Fakt je ten, že ve woknech nemají rezidenty valný význam. Jinými slovy - nechodí.

Ale mě se stejně podařilo napsat vira, který používá pouze DOSovské služby a dokáže se množit i ve WIN 95. Pokud je spuštěn už před startem woken(třeba v autoexecu), dokáže se množit v DOSovských programech puštěných z WIN 95(pustíš Volkova z woken a vir se šíří).

The end

Úvodní stránka Zbylé instrukce První program
Rejstřík

Stránku připravuje Lukáš Valenta, 1. v celostátním kole soutěže v programování, kategorie mládež.