Tabuľka vektorov prerušení je umiestnená na
začiatku pamäti od adresy 0000:0000. Má 100h položiek. Každá položka pozostáva z dvoch
slov, v ktorých je uložený vektor prerušenia (na nižšej adrese offset, na
vyššej segment). Inštrukcia
int n
potom spôsobí, že do
zásobníka sa uloží register príznakov FLAGS a návratová adresa, vynulujú sa
príznaky IF a TF, register IP sa naplní obsahom slova na offsete n*4
v tabuľke vektorov prerušení a register CS obsahom slova na offsete n*4+2.
Inštrukcia
iret
vykonáva návrat z obslužného
programu prerušenia, a to tak, že vyberie zo zásobníka návratovú adresu a
register príznakov.
Môžeme
vytvoriť vlastný obslužný program ktoréhokoľvek prerušenia a nahradiť ním
pôvodný obslužný program definovaný operačným systémom. Urobíme to tak, že
pôvodný vektor prerušenia v tabuľke vektorov prerušení prepíšeme adresou
nového obslužného programu. Ak však nový obslužný program nezostane rezidentný
v pamäti po skončení programu, ktorý ho zaviedol do tabuľky vektorov
prerušení, musíme pred návratom do operačného systému obnoviť pôvodný vektor
prerušenia. Inak by sa mohlo stať, že sa nový obslužný program prepíše iným
programom alebo dátami a pri výskyte daného prerušenia sa operačný systém
zrúti. Program zostane v pamäti, ak sa ukončí službou DOS-u číslo 31h
(Terminate & Stay Resident). Vstupným parametrom tejto služby je register DX, ktorý
obsahuje veľkosť kódu, ktorý má zostať v pamäti (v 16-bajtových paragrafoch).
Zmenu
v tabuľke vektorov prerušení môžeme urobiť vlastnými silami, alebo pomocou
služieb DOS-u číslo 25h a 35h. Služba 25h (Set Interrupt Vector) prepíše
zvolený vektor prerušenia novou hodnotou. Vstupnými parametrami sú číslo
prerušenia v registri AL a nový vektor prerušenia v registroch DS:DX.
Služba 35h (Get Interrupt Vector) vráti vektor zvoleného prerušenia
v ES:BX. Vstupným parametrom je číslo prerušenia v registri AL.
V nasledujúcom
príklade vytvoríme rezidentný obslužný program prerušenia číslo 0, ktoré vzniká
ako výnimka pri delení nulou (alebo keď sa výsledok delenia nezmestí do
určeného registra). Obslužný program zostane v pamäti aj po ukončení
zavádzacieho programu. Nový obslužný program prerušenia sa bude správať podobne
ako pôvodný obslužný program – vypíše správu o delení nulou a vráti riadenie
DOS-u. Zmenu vektora prerušenia vykonáme „ručne“ (bez využitia služby 25h).
.MODEL tiny
.CODE
ORG 100h
Zac: jmp PrvaInstr
Sprava DB 'Joj, neviem delit nulou!',0Dh,0Ah,'$'
Moj: push cs
pop ds; treba nastaviť ds, lebo pri
vstupe do
; prerušenia
má hodnotu z prerušeného programu
mov ah,9
mov dx, offset Sprava
int 21h
mov ah,4Ch
int 21h
PrvaInstr:
cli
mov ax,0
mov es,ax
mov es:word ptr [0],offset Moj
mov es:[2],cs
sti
;terminate and stay resident
mov cl,4
mov dx,DlzkaProgramu
shr dx,cl; div 16
inc dx; pre istotu
mov ah,31h
int 21h
DlzkaProgramu = PrvaInstr - Zac + 100h
END Zac
Priamy prístup k pamäti
Výstup z počítača na obrazovku je
organizovaný ako priamy prístup k pamäti. To znamená, že údaje, ktoré sa
majú zobraziť, sa zapisujú do vyhradenej oblasti pamäti (video pamäti), odkiaľ
ich potom riadiaca jednotka obrazovky prečíta a transformuje na signály, ktoré
riadia jas bodov obrazovky. Obrazovka môže pracovať v textovom alebo
grafickom režime. Adresa video pamäti závisí od zvoleného režimu:
v textovom režime má video pamäť adresu 0B800:0000, v grafickom režime
0A000:0000. Princíp priameho prístupu do pamäti vysvetlíme na textovom režime.
V textovom režime je každý znak zapísaný
vo video pamäti v dvoch bajtoch: prvý bajt (na nižšej adrese) obsahuje
ASCII kód znaku, druhý bajt atribúty znaku. Atribúty znaku sú:
- farba znaku (bity 0 – 3)
- farba pozadia (bity 4 – 6)
- blikanie (bit 7)
Predpokladajme, že sme zvolili textový režim s
25 riadkami a 80 znakmi na jednom riadku. Riadky sú číslované zhora nadol,
stĺpce zľava doprava, najnižší index je 0. Ak chceme zapísať znak do stĺpca x
na riadku y, musíme jeho ASCII kód uložiť na offset 2(80y+x)
a jeho atribúty na offset 2(80y+x)+1.
Nasledujúca programová sekvencia vymaže obrazovku tak, že do
video pamäti zapíše toľko medzier, koľko je na obrazovke znakov a atribúty
nastaví tak, aby sa farba textu zhodovala s farbou podkladu:
mov ax,0B800h
mov es,ax
mov di,0
mov cx,2000; počet znakov na obrazovke
mov al,’ ’
mov ah,0; atribúty znaku => čierna obrazovka
cld
rep stosw
BIOS ponúka celý rad služieb pre komunikáciu
s obrazovkou. Označujú sa pojmom video služby a volajú sa cez softvérové
prerušenie int 10h. Tabuľka 10 uvádza niekoľko
z nich. Číslo služby sa odovzdáva v registri AH.