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 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.
| <= | => |