Prerušenia


<= =>


V dobe vykonávania úlohy musí byť zaistená i programová obsluha niektorých udalostí. Za tieto udalosti považujeme napríklad: stlačenie klávesy, pohyb myší, hroziaci výpadok napájania, kritická chyba v pamäti, . . . I keď by bolo možné testovať stlačenie klávesy v rámci prevádzanej úlohy, je pohodlnejšie, ak obsluhu tejto udalosti zaistí počítač sám na úrovni technického vybavenia. Napriek tomu je k tejto činnosti nutný mikroprocesor. Preto je dočasne prerušená prebiehajúca úloha. Po obsluhe sa procesor vracia späť k tej časti úlohy, z ktorej bol prerušený.

Celý mechanizmus prerušení sa dá popísať v niekoľkých krokoch:

Za inštrukciou INT môže byť číslo v rozpätí 0..255. Toto číslo v prípade obsluhy programovej udalosti udáva, odkiaľ požiadavka prišla. Pretože je ale nemožné, aby všetkých 256 úrovní prerušení bolo obsadené, sú niektoré hodnoty obsadené tzv. službami.

Za služby môžeme považovať podprogramy, ktoré sú súčasťou operačného systému alebo BIOSe. Sú umiestnené v pamäti počítača. Umožňujú jednoducho prevádzať činnosti, ktoré sa v programoch často opakujú, sú pracné alebo sa líšia na počítačoch s rôznou konfiguráciou.

Služby voláme rovnako ako obsluhy prerušení inštrukciou INT číslo. Hodnota číslo určuje, o jakú službu sa jedná. Často sa v rámci jednej služby môže vyskytovať i niekoľko činností. Tým budeme hovoriť podslužby. Pred volaním podslužieb musíme najskôr nastaviť v určitom registri (najčastejšie v AH) hodnotu im určenú. Potom až voláme službu inštrukciou INT. Mnoho služieb sa chová ako podprogramy volané parametrami. Hodnoty parametrov sa neukladajú do zásobníka, ale do niektorých registrov. Výstupy z týchto "podprogramov" nájdeme opäť v registroch. Informácie o službách DOSu i BIOSu nájdete v odborných publikáciách alebo v SYSMANe. Tu tiež nájdete informácie o tom, ktoré registre k čomu použijete.

Najpoužívanejšou službou je INT 0x21. Tá zahrňuje služby DOSu ako je vstup a výstup dát, práce so súbormi, čas, . . . Je tiež použitá k výstupu reťazca na obrazovku v nasledujúcom príklade. Výstup reťazca realizuje podslužba AH = 0x09. Vstupom do podslužby je adresa reťazca v registroch DS, DX. Výstup podslužba nemá. Jediná činnosť je výpis na obrazovku. Dôležité je označenie konce reťazca znakom ‘$‘. V prípade, že tento znak na konci nie je, vypíše sa obsah časti pamäti až do jeho náhodného výskytu.

#include <conio.h>
#include <string.h>

vypis(char *retaz) { unsigned char dlzka = strlen(retaz); asm { PUSH DS // ulož DS, budeme ho meniť MOV AH, 0x09 // nastav hodnotu podslužby MOV di, retaz // čítaj adresu reťazca MOV DX,DI // vlož ju do registra DX pre podslužbu XOR BH,BH // nuluj BH MOV BL, dlzka // do BL vlož dĺžku reťazca MOV BYTE PTR [DI+BX],'$' // na koniec reťazca dosaď ukončovací znak INT 0x21 // volaj službu DOSu POP DS // vráť DS } } main() { clrscr(); vypis("Ahoj"); // skús vypísať }

Uvedený program prevedie reťazec do podoby reťazca, v ktorom ho očakáva služba. Nastaví registre hodnotami vstupov a zavolá podslužbu DOSu. Výstup reťazca touto procedúrou môžeme realizovať na ľubovolnom grafickom adaptéri. Možné odlišnosti si vyrieši práve služba DOSu.


<= =>