Sunteți pe pagina 1din 19

Bazele Tehnologiei Informaţiei

Curs 11
BTI partea a II-a

 Întreruperi
 Întreruperi software
 Funcții BIOS
 Funcții DOS
 Exemple scrise în limbaj de asamblare

2
Întreruperi
 Sistemul de operare este o colecţie de rutine (proceduri) utile în exploatarea
eficientă a resurselor sistemului. Noţiunea de întrerupere presupune întreruperea
programului în curs de execuţie si transferul controlului la o rutină de tratare.
Mecanismul prin care se face acest transfer este, în esenţă, de tip apel de
procedură, ceea ce înseamnă revenirea în programul întrerupt, după terminarea
rutinei de tratare.

Externe
Hardware
Interne
Întreruperi
Utilizator
Software DOS
Sistem
3
BIOS
Întreruperi
 Întreruperile hardware:
 externe sunt provocate de semnale electrice care se aplică pe intrările de
întreruperi ale procesorului.
 interne apar ca urmare a unor condiţii speciale de funcţionare a procesorului
(cum ar fi execuţia pas cu pas a programelor).
 La scrierea sistemului de operare pentru microcalculatoarele compatibile IBM-
PC s-a ales varianta ca o serie de rutine de sistem să poată fi folosite şi de către
utilizator. Ele au fost scrise sub formă de proceduri apelabile prin sistemul
specific pentru 8086 şi se numesc întreruperi software. Întreruperile software
apar ca urmare a execuţiei unor instrucţiuni, cum ar fi INT. Aceste rutine fac
parte din două categorii mari:
 rutine BIOS scrise pentru a facilita utilizatorului accesul la resursele
sistemului şi
 rutine DOS scrise în scopuri specifice sistemului de operare.

4
Întreruperi software

 Într-un sistem cu procesor 8086, pot exista maxim 256 de întreruperi.


 Fiecare nivel de întrerupere poate avea asociată o Rutină de Tratare a Întreruperii
(RTI), care se execută la apariţia întreruperii respective. Nu sunt definite toate
cele 256 de întreruperi (nu există RTI pentru fiecare întrerupere).
 Marea majoritate a întreruperilor BIOS sunt inițializate la pornirea sistemului. La
încarcarea sistemului de operare, acesta definește/redefinește, la rândul sau unele
întreruperi pentru a putea asigura serviciile sistem care îi sunt specifice (ex. DOS
rescrie rutina asociată întreruperii 21h pentru a implementa serviciile specifice
sistemului de operare DOS).

5
Vectorul de întreruperi
 Procesorul are nevoie de o modalitate simplă de IDENTIFICARE a RTI la
momentul apariției unei întreruperi. Ca atare se utilizează un tabel de vector de
întreruperi.
 Adresele complete (4 octeţi) ale RTI sunt memorate în tabela vectorilor de
întrerupere, pornind de la adresa fizică 0 până la 1KB. Intrarea în tabelă se obţine
înmulţind codul întreruperii cu 4.
 Pentru memorarea punctelor de intrare a celor 256 de întreruperi sunt folosite
adresele de memorie de la 0000h:0000h =>0000h : 0400h(exclusiv). Adresa unui
handler de întrerupere este formată din:
Adresa de segment pe 16 biți + Offset pe 16 biți.
 Așadar adresa unui handler de întrerupere are nevoie de 2*16 biți = 32 biți (2
cuvinte = 4 octeți) pentru a putea fi memorată. Pentru a memora 256 de adrese
este nevoie de 1024 octeți, adică exact spațiul de memorie de la adresa
0000:0000 pana la 0000:0400h.

6
Întreruperi software
 Rutinele unor întreruperi software (BIOS şi DOS) pot trata în mod diferenţiat
întreruperea generată în funcţie de o anumită valoare specificată într-un registru.
Spunem că întreruperea respectivă oferă mai multe “servicii” sau “funcţii”.
 Având un număr limitat de întreruperi și un număr mare de rutine care trebuiesc
implementate, sistemele și aplicațiile utilizator folosesc în general următoarea
convenție:
 La apel în registrul AH se va depune numărul funcției care se va folosi.
 În restul registrelor se pun parametrii necesari execuției funcției respective.
 RTI va verifica la fiecare apel numărul funcției care trebuie apelată și va
preda controlul rutinei în cauză.

MOV AH, nr_funcţie ; specificarea funcţiei


INT nr_int ; specificarea întreruperii

7
Funcții pentru implementarea operațiilor
de I/O
 Accesul din programele utilizator la funcţiile DOS
şi BIOS se face prin întreruperi software
Program utilizator (instrucţiunea INT) .
 Când un program utilizator solicită un serviciu I/O
DOS către sistemul de operare, se transferă cererea la
BIOS, care realizează accesul. Unele servicii pot fi
solicitate direct către BIOS, în special cele pentru
BIOS tastatură şi ecran. O sarcină a DOS-ului este să
interfaţeze cu BIOS când este necesar accesul la
facilităţile sale.
Dispozitiv  BIOS-ul gestionează întreruperile INT 00H – 1FH,
DOS-ul gestionează întreruperile INT 20H – 3FH.
Funcții BIOS
 INT 00H - este de fapt o excepţie de împărţire prin zero, pentru care se afişează un
mesaj corespunzător;
 INT 01H - „Single Step“, este utilizată de programele de depanare (Debug, TD);
 INT 02H - întrerupere nemascabilă (NMI) care este utilizată de erori hardware severe,
cum ar fi eroarea de paritate la memorie;
 INT 03H - este întreruperea de breakpoint, adică cea utilizată de programele de
depanare);
 INT 04H - întreruperea de depăşire a rezultatului operaţiilor aritmetice;
 INT 05H - întreruperea imprimă memoria video; aceeaşi operaţie poate fi activată
extern (nu intern, cum o face instrucţiunea INT 05H) prin combinaţia de taste
CTRL+PrtSc;
 INT 08H - ceasul de timp real; o întrerupere hard actualizează ora şi data sistemului
(un circuit de ceas programabil generează o întrerupere la fiecare 54,9256 ms, adică
de 18,2 ori pe secundă);
 INT 09H - întrerupere dedicată tastaturii, generată la apăsarea şi eliberarea unei taste;
 INT 0BH, INT 0CH - controlează dispozitivele seriale, adică porturile COM1 şi
COM2;
 INT 0DH, INT 0FH - controlează dispozitivele paralele, adică porturile LPT1 şi
LPT2;
 INT 0EH - controlează operarea dischetei;
Funcții BIOS
 INT 10h - utilizarea terminalului video;
 INT 11h - determinarea configuraţiei sistemului;
 INT 12h - determinarea capacităţii memoriei RAM;
 INT 13h - acces la HDD şi FDD(permite citirea şi scrierea sectoarelor pe disc în
mod direct, fără a ţine cont de sistemul de fişiere existent pe disc);
 INT 14h - utilizarea interfeţei seriale;
 INT 15h - controlul perifericelor din punct de vedere al stării lor (pornit/oprit);
 INT 16h - utilizarea tastaturii;
 INT 17h - utilizarea interfeţei paralele;
 INT 18H - intrare de bază în ROM; apelată de BIOS dacă sistemul este pornit fără
un disc care să conţină programele sistemului de operare DOS;
 INT 19h - încărcător sistem rezident pe disc(încărcătorul sistemului de operare de
pe disc; dacă este disponibilă o dischetă sistem, cu sistemul de operare DOS, va citi
pista 0, sectorul 1 în locaţia de încărcare în memorie la adresa 7C00H şi transferă
controlul la această locaţie; dacă nu există un disc sistem, se transferă controlul la
punctul de intrare din ROM, via INT 18H);
 INT 1Ah - controlul ceasului în timp real (RTC);
 INT 1BH - permite controlul asupra tastei Break; când se tastează CTRL+Break,
ROM BIOS transferă controlul la adresa sa de întrerupere, unde este iniţializat un
indicator.
Funcții DOS
 INT 20H - terminare program; operaţia termină execuţia unui program .com, reface
adresele pentru CTRL+Break şi pentru erorile critice, goleşte bufferele şi redă controlul
sistemului DOS;
 INT 21H - solicitare funcţie DOS, al cărei cod este transmis în Ah;
 INT 22H - adresa de terminare. Se copiază adresa acestei întreruperi în PSP-ul
programului (prefix segment program) când programul încărcător încarcă un program
pentru execuţie. La terminarea programului, operaţia transferă controlul la adresa
întreruperii.
 INT 23H - adresa pentru CTRL+Break. Este destinată pentru transferul controlului la o
rutină DOS (prin PSP, offset 0EH) când se tastează CTRL+Break sau CTRL+C. Rutina
termină execuţia unui program sau a unui fişier „batch“. Un program poate înlocui
această adresă cu aceea a unei rutine proprii, pentru a realiza acţiuni specifice fără
terminarea programului.
 INT 24H - manipulare erori critice. Este utilizată de sistem pentru a transfera controlul
(prin PSP, offset 12H) când este recunoscută o eroare critică (de obicei la o operaţie cu
discul sau cu imprimanta). Aceste ultime trei întreruperi, în mod normal, nu ar trebui să
fie apelate de programul utilizator.
 INT 25H, INT 26H, INT 27H (înlocuite de INT 21H).
 INT 2FH - întrerupere multiplexare. Aceasta implică o comunicaţie între programe,
cum ar fi comunicarea stării unei imprimante, prezenţa unui driver de disc,etc.
11
 INT 33H - furnizează serviciile pentru manipulare mouse.
DOS INT 21h – Coduri funcții
 Funcţia 00h: terminare execuție program
xor ah,ah
int 21h
 Funcţia 01h: această funcţie citeşte un caracter de la intrarea standard,
pe care îl trimite în ecou la ieşirea standard. Dacă se citește caracterul
CTRL-C, se execută int 23h. La apel registrul ah va avea valoarea 01h
şi după execuţie registrul al va conține codul ASCII al caracterului
citit.
mov ah,01h
int 21h
 Funcţia 02h: această funcţie scrie un caracter la ieşirea standard. Dacă
se tastează CTRL-C, se execută int 23h. La apel registrul ah va avea
valoarea 02h și registrul dl va conține codul ASCII al caracterului care
trebuie scris.
mov dl,cod_ASCII_caracter
mov ah,02h
int 21h
 Funcţia 05h: scrie caracter la LPT
mov dl,caracter
mov ah,05h 12

int 21h
DOS INT 21h – Coduri funcții
 Funcţia 06h: intrare/ieşire direct la consolă. Această funcţie poate
transfera orice caracter sau cod de control fără interferenţă cu DOS-ul.
Operaţia este fără ecou și nu verifică eventualele combinaţii
<Ctrl>+<Break> sau <Ctrl>+PrtSc. După execuţie registrul al va conține
codul caracterului.
mov dl, caracter
mov ah, 6
int 21h
 Funcţia 07h: această funcţie citeşte un caracter de la intrarea standard.
Caracterul citit nu este trimis în ecou la ieşirea standard şi nu se
efectuează niciun test pentru CTRL-C. La apel registrul ah va avea
valoarea 07h şi după execuţie registrul al va conține codul ASCII al
caracterului citit.
mov ah,7
int 21h
 Funcţia 09h: această funcţie realizează afişarea unui şir de caractere la
ieşirea standard, şirul de caractere fiind terminat cu simbolul '$'.
Caracterul '$' nu se afişează. La apel registrul ah va avea valoarea 09h, iar
ds:dx va conține adresa de început a şirului de caractere respectiv.
lea dx,sir
13
mov ah,9
int 21h
DOS INT 21h – Coduri funcții
 Funcţia 0Ah: această funcţie realizează citirea unui şir de caractere de la intrarea standard. La apel
registrul ah va avea valoarea 0Ah, iar ds:dx va conține adresa unei zone tampon cu următoarea structură:
 primul octet al zonei va conţine la apel numărul maxim (fie acesta n) de caractere care vor fi citite,
inclusiv un caracter CR;
 al doilea octet al zonei va conţine după execuţia funcţiei numărul de caractere efectiv citite,
caracterul CR nefiind contorizat;
 restul zonei va trebui să conţină cel puţin atâţia octeţi câţi au fost specificaţi în primul octet. După
execuţia funcţiei, aici va fi depus şirul citit, primul caracter din şir fiind plasat la adresa cea mai
mică. Caracterele citite sunt plasate în zona tampon specificată, începând cu al treilea octet al zonei.
Citirea se termină când se tastează CR. Dacă se încearcă introducerea mai multor caractere decât
numărul specificat, adică n-1, caracterele în plus se ignoră, fiind trimis la ieşirea standard caracterul
BEL (07h). Ultimul caracter din zona tampon este întotdeauna CR. Dacă se tastează CTRL-C se
execută int 23h”.
lista label byte
dim_max db 50 ;dimensiunea spațiului de memorie alocat
dim_efectiva db ? ;numărul efectiv de caractere citite
sir db 50 dup(?) ;aici se depun caracterele
---------
lea dx,lista
mov ah,0Ah
int 21h

14
Funcții BIOS sau DOS?
 În timp ce BIOS-ul permite manipularea dispozitivelor la nivel scăzut, DOS-ul
furnizează o interfaţă de nivel ridicat pentru multe dispozitive. De exemplu,
una dintre rutinele BIOS permite accesul la unitatea de dischetă. Cu această
rutină se pot citi sau scrie blocuri pe dischetă. Din păcate, BIOS-ul nu
cunoaşte mecanismele legate de fişiere şi directoare, ci operează doar la nivel
de blocuri (sectoare). Dacă se doreşte o operaţie pe disc, utilizând BIOS-ul,
trebuie ştiut exact locul de pe disc (sectorul) unde se află fişierul.
 Pe de altă parte, utilizând DOS-ul se poate opera cu nume de fişiere, în locul
adreselor de pe disc. DOS-ul păstrează informaţii asupra localizării fişierului
pe disc şi apelează rutina ROM-BIOS pentru citirea/scrierea blocurilor
respective. Interfaţa de nivel ridicat reduce efortul programatorului necesar
pentru accesul la date.
 Utilizarea funcţiilor DOS este, în general, mai uşoară decât cea a funcţiilor
BIOS echivalente, primele fiind mult mai independente de maşină.
Exemplul 1
Precizaţi care este rezultatul execuției. Modificați astfel încât afișajul să fie corect.

.model small or al,20h


.stack 100h cmp al,'d'
.data je edimineata
intrebare db 'e trecut de ora 12? (D/N)?$'
dimineata db 13,10, 'neata!',13,10, '$' mov dx, offset salut
salut db 13,10, 'ziua buna!',13,10, '$' jmp salutare
.code
start: edimineata:
mov ax,@data mov dx,offset dimineata
mov ds,ax
salutare:
mov dx,offset intrebare mov ah,09h
mov ah,09h int 21h
int 21h
mov ax,4C00h
mov ah,01h int 21h
int 21h END start
Exemplul 2
Precizaţi care este rezultatul execuției.

.model small salt:


.stack 100h div bx
.data add cx,1
nr dw 10110 xor dx,dx
d dw 0 cmp ax,0
.code jne salt
mov d,cx
start:
mov ax,@data mov dx,d
mov ds,ax add dx,30h
mov ah,02h
mov ax,nr int 21h
xor cx,cx
xor dx,dx mov ax,4C00h
mov bx,10 int 21h
end start
Exemplul 3
Precizaţi care este rezultatul execuției.
.model small
.stack 100h
.code
mov ax,@data
mov ds,ax
start:
;citeste o secventa de tastare pana cand se apasa Enter
tasta:
mov ah, 0
int 16h ;intrerupere BIOS, utilizam tastatura
;daca int16h este apelata cu valoarea 00h depusa in AH, rutina din BIOS va reda
;controlul programului apelant doar in momentul in care o tasta este disponibila in buffer-ul
;tastaturii. La intoarcere, registrul al contine codul ASCII pentru tasta citita din buffer
cmp al, 0 ;functie speciala
jz tasta ;daca da, nu afisa aceasta tasta

mov ah, 0Eh ;in al trebuie sa plasati codul ascii al caracterului


int 10h ;intrerupere BIOS, utilizam terminalul video

cmp al, 0dh ;cod ENTER=odh


jne tasta
mov ax,4C00h
int 21h
end start
Bibliografie

 Floarea Nastase, Razvan Zota, Bazele tehnologiei informatiei, Editura


ASE, Bucuresti, 2005 sau 2014.
 Iuliana Dorobat, Bazele tehnologiei informatiei aplicatii, Editura ASE,
Bucuresti, 2018.
 Somnea D., Vlăduț T., Programarea în assembler, Editura Tehnică,
București, 1992.
 G. Rădulescu, M. Olteanu, Programarea în limbaj de asamblare, Editura
Universităţii Petrol-Gaze din Ploieşti, 2007, disponibil la http://
ac.upg-ploiesti.ro/cursuri/pla/indrumar_lab_pla.pdf
 http://spike.scu.edu.au/~barry/interrupts.html

S-ar putea să vă placă și