Učebnice Assembleru 86

Přerušení

V době vykonávání úlohy musí být zajištěna i programová obsluha některých událostí. Za tyto události považujeme například: stisk klávesy, pohyb myší, hrozící výpadek napájení, kritická chyba v paměti, . . . I když by bylo možné testovat stisk klávesy v rámci prováděné úlohy, je pohodlnější, jestliže obsluhu této události zajistí počítač sám na úrovni technického vybavení. Přesto je k této činnosti nutný mikroprocesor. Proto je dočasně přerušena probíhající úloha. Po obsluze se procesor vrací zpět k té části úlohy, ze které byl přerušen.

Celý mechanismus přerušení se dá popsat v několika krocích:

  • Do řadiče přerušení přichází požadavek o přerušení, ten vyhodnotí jeho prioritu. Jestliže je přerušení možné, je vyslán do procesoru signál požadavku o přerušení.
  • Mikroprocesor přijal signál požadavku přerušení. Jestliže je přerušení možné (není zakázáno nastavením IF = 0), po dokončení probíhající instrukce vyšle procesor signál potvrzení přerušení.
  • Řadič přerušení přijal signál povolení přerušení. Vyšle na datovou sběrnici instrukci přerušení INT číslo, ta zajistí, že procesor provede tyto činnosti:
    • do zásobníku se uloží registr příznaků F (po návratu se musí obnovit)
    • vynulují se příznaky IF (zakáže se další přerušení) a TF (nejde krokovat program)
    • do zásobníku se uloží obsahy CS a IP (místo, kde byla přerušovaná úloha)
    • registry CS a IP se naplní adresou, přečtenou z tabulky vektorů přerušení (to je tabulka na začátku paměti, v ní jsou za sebou uloženy celé adresy všech obsluh přerušení, klíčem pro hledání v této tabulce je právě číslo přerušení uvedené za instrukcí INT)
  • Proběhne obsluha přerušení (například načtení dat, hláška na obrazovku,...).
  • Po obsluze je ze zásobníku obnoven obsah registrů IP, CS, F (procesor se vrátí k původní úloze, příznaky TF, IF se obnoví s registrem F). Obnovu těchto registrů zajistí instrukce IRET (která je na konci obsluhy přerušení).

Za instrukcí INT může být číslo v rozpětí 0..255. Toto číslo v případě obsluhy programové události udává, odkud požadavek přišel. Protože je ale nemožné, aby všech 256 úrovní přerušení bylo obsazeno, jsou některé hodnoty obsazeny tzv. službami.

Za služby můžeme považovat podprogramy, které jsou součástí operačního systému nebo BIOSu. Jsou umístěny v paměti počítače. Umožňují jednoduše provádět činnosti, které se v programech často opakují, jsou pracné nebo se liší na počítačích s různou konfigurací.

Služby voláme stejně jako obsluhy přerušení instrukcí INT číslo. Hodnota číslo určuje, o jakou službu se jedná. Často se v rámci jedné služby může vyskytovat i několik činností. Těm budeme říkat podslužby. Před voláním podslužeb musíme napřed nastavit v určitém registru (nejčastěji v AH) hodnotu jim určenou. Potom teprve voláme službu instrukcí INT. Mnoho služeb se chová jako podprogramy volané parametry. Hodnoty parametrů se neukládají do zásobníku, ale do některých registrů. Výstupy z těchto "podprogramů" najdeme opět v registrech. Informace o službách DOSu i BIOSu najdete v odborných publikacích nebo v SYSMANu. Zde také najdete informace o tom, které registry k čemu použijete.

Nejpoužívanější službou je INT $21. Ta zahrnuje služby DOSu jako je vstup a výstup dat, práce se soubory, čas, . . . Je také použita k výstupu pascalovského řetězce na obrazovku v následujícím příkladu. Výstup řetězce realizuje podslužba AH = $9. Vstupem do podslužby je adresa řetězce v registrech DS, DX. Výstup podslužba nemá. Jediná činnost je výpis na obrazovku. Důležité je označení konce řetězce znakem $. V případě, že tento znak na konci není, vypíše se obsah části paměti až do jeho náhodného výskytu.

Příklad:

procedure outstring (retezec:string);assembler;
asm
 PUSH DS        {ulož DS, budeme ho měnit}
 MOV AH,$09     {nastav hodnotu podslužby}
 LDS DI,retezec {čti adresu řetězce}
 MOV DX,DI      {vlož ji do registru DX pro podslužbu}
 INC DX         {zvyš adresu až za informaci o délce}
 XOR BH,BH      {nuluj BH}
 MOV BL,[DI]    {do BL vlož délku řetězce}
 MOV BYTE PTR [DI+BX+1],'$'{na konec řetězce dosaď ukončovací znak}
 INT $21        {volej služby DOSu}
 POP DS         {vrať DS}
end;

begin
 outstring ('Ahoj'); {zkus vypsat}
end.

Uvedený program převede pascalovský řetězec do podoby řetězce, ve které ho očekává služba. Nastaví registry hodnotami vstupů a zavolá podslužbu DOSu. Výstup řetězce touto procedurou můžeme realizovat na libovolném grafickém adaptéru. Možné odlišnosti si vyřeší právě služba DOS.

Směr