Obr. 21. Spolupráca počítača a prídavného zariadenia
Obr. 22. Časový diagram výstupu na asynchrónne prídavné zariadenie
Obr. 23. Časový diagram vstupu z asynchrónneho prídavného zariadenia
in AL/AX, adresa portu/DX
(input from port)
Inštrukcia in kopíruje hodnotu z adresovaného
V/V portu do registra AL alebo AX (podľa typu portu). Ak je adresa portu z
intervalu á0,255ñ, môže sa uviesť priamo v inštrukcii, v opačnom prípade ju musíme
najprv uložiť do registra DX.
out adresa portu/DX, AL/AX
(output to port)
Inštrukcia out kopíruje obsah registra AL alebo
AX do adresovaného V/V portu. Ak je adresa portu z intervalu á0,255ñ, môže sa uviesť priamo v
inštrukcii, v opačnom prípade ju musíme najprv uložiť do registra DX.
Inštrukcie in a out nemenia príznaky.
Z hľadiska spolupráce procesora a prídavného
zariadenia počas styku možno rozlíšiť tri spôsoby riadenia prídavných
zariadení:
- programovaný vstup/výstup
- vstup/výstup cez prerušenia
- priamy prístup k pamäti
Programovaný vstup/výstup
Programovaný vstup/výstup si vyžaduje neustálu
pozornosť procesora počas styku. Typickým príkladom tohto spôsobu komunikácie
je tlačiareň.
Vstup/výstup cez prerušenia
Pri programovanom vstupe/výstupe musí procesor často čakať na to, kým
zariadenie bude pripravené na prevzatie dát, alebo kým zariadenie poskytne
požadované dáta. Keby komunikácia s klávesnicou bola organizovaná ako
programovaný V/V, potom za predpokladu, že prenos znaku z klávesnice do
počítača trvá 10 mikrosekúnd a užívateľ dokáže zadať 10 znakov za sekundu, by
procesor zaháľal 99,99 % svojho času. Preto je vstup z klávesnice
organizovaný cez prerušenie. Kým sa
čaká na stlačenie znaku, venuje sa procesor užitočnej práci. V okamihu,
keď je znak pripravený na prenos, vyšle interface klávesnice signál, ktorým sa
preruší doterajšia činnosť procesora. Procesor chvíľu venuje pozornosť
klávesnici – vykoná obslužný program
prerušenia, aby sa po jeho skončení opäť vrátil k pôvodnej práci.
Existujú tri druhy prerušení:
- hardvérové prerušenie – je vyvolané signálom z technického
zariadenia. Práve tento typ prerušenia sa používa pri komunikácii
s periférnymi zariadeniami, napr. s už spomenutou klávesnicou alebo
s diskom.
- softvérové prerušenie – je vyvolané inštrukciou int
v programe. Používa sa najmä na vyvolanie služieb operačného systému.
- interné prerušenie generované procesorom (výnimka)
– vzniká ako dôsledok vykonania nepovolenej operácie, napr. pri delení nulou.
Ako procesor vie, na akej adrese leží obslužný
program prerušenia? V reálnom režime sú adresy obslužných programov
uložené v tabuľke vektorov prerušení.
Adresu obslužného programu (segment a offset) nazývame vektorom
prerušenia. Každé prerušenie má svoje číslo, ktoré slúži ako index do tejto
tabuľky. Číslo softvérového prerušenia je operandom inštrukcie
int. Hardvérovému prerušeniu priraďuje číslo technické zariadenie (radič
prerušení), do ktorého prichádza signál vyvolávajúci prerušenie. Výnimkám
priraďuje číslo procesor.
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.