INTRERUPERILE LA MICROPROCESOARELE INTEL
1. Scopul lucrarii
Scopul lucrarii - studentii se vor familiariza cu modurile de apelare ale diferitelor intreruperi care asigura accesul la dispozitivele de intrare/iesire sau alte periferice, specifice microprocesoarelor Intel functionand "in modul real".
2. Memoriu de instructiuni
O intrerupere este de fapt o atentionare transmisa sitemului de calcul care anunta aparitia unui eveniment. La microprocesoarele Intel 8086 pot exista maxim 256 intreruperi. La semnalarea unei intreruperi se sare din programul principal la o adresa unde se afla o Rutina de Tratare a Intreruperii (RTI) specifica cererii. Nu exista rutine asociate cu cele 256 de intreruperi.
Pentru memorarea celor 256 rutine de intrerupere sunt folosite adresele de memorie de la 0000h:0000h =>0000h : 0400h(exclusiv).
Figura 6.1. Tabela vectorilor de intrerupere, fiecare vector dispune de patru octeti care includ offsetul si segmentul. Deci sunt rezervati 1024 octeti sau 1KB pentru tabela vectorilor de Intrerupere in Mod Real
Figura 6.2. Modul de salvare in stiva a registrelor IP si CS
Etapele parcurse la aparitia unei cereri de intreruperi:
a) oprirea programului principal dupa executia instructiunii in curs;
b) salt la rutina de tratare a intreruperii (dupa ce s-a salvat in stiva adresa de unde s-a facut saltul, iar registrele de adrese au fost incarcate cu adresa de inceput a rutinei);
c) executia rutinei;
d) revenire in programul principal.
Intreruperile se pot clasifica (functie de cauza care genereaza intreruperea):
Intruperi externe microprocesorului: NMI, INTR, etc.
Ex: - afisaj
- intrare/iesire consola
Intreruperi interne microprocesorului INT x:
Ex: INT 0 - impartirea la zero
INT 1 - trasare pas cu pas
INT 3 - breakpointer
INT 4 - apelata de INT 0 daca OF=0 NOP, daca OF=1 se executa INT 4
- tentativa de adresare a unei zone de memorie care nu exista
- tentativa de executarea a unei instructiuni care are cod inexistent
La aparitia unei intreruperi interne, programul curent in curs de executie se termina si controlul este transmis sistemului de operare.
O alta clasificare a intreruperilor functie de nivelul la care sunt definite intreruperile:
a) Intreruperi hard. Rutinele sunt scrise de furnizori
b) Intreruperi BIOS. Rutinele sunt scrise de proiectantii BIOS-ului calculatorului.
Ex:
intreruperea 10h - lucrul cu ecranul in mod grafic;
- intreruperea 11h - ofera informatii despre echipamentele instalate in sistem.
c) Intreruperi DOS. Rutinele sunt scrie de proiectantii sistemului de operare.
Ex:
intreruperea 20h - terminarea unui program.
intreruperea 33h - lucrul cu mouseul
d) Intreruperi definite de programatori.
3. Instructiuni de intrerupere
O alta convetie care se utilizeaza in acest laborator este:
tip: un operand de 8 biti care indica tipul unei intreruperi si face parte din formatul instructiunii (adresare imediata).
Cerere de |
OF DF IF TF SF ZF AF PF CF |
|
INT [tip] |
intrerupere |
0 0 |
software |
Descrierea formala a semanticii, in general:
(SP) (SP) - 2
((SS) 0H + (SP) +1) ((SS) 0H + (SP)) (F)
(IF) 0
(TF) 0
(SP) (SP) - 2
((SS) 0H + (SP) +1) ((SS) 0H + (SP)) (CS)
if tip then
(CS) (4 tip + 3) (4 tip + 2)
else
(CS) (0000FH) (0000EH)
(SP) (SP) - 2
((SS) 0H + (SP) +1) ((SS) 0H + (SP)) (IP)
if tip then
(IP) (4 tip + 1) (4 tip)
else
(IP) (0000DH) (0000CH)
Operanzi |
Exemple |
Descrierea formala a semanticii |
INT |
(SP) (SP) - 2 ((SS)0H + (SP)+1) ((SS)0H + (SP)) (F) (IF) (TF) (SP) (SP) - 2 ((SS)0H +(SP)+1) ((SS)0H+(SP)) (CS) (CS) (0000FH) (0000EH) (SP) (SP) - 2 ((SS) 0H +(SP) +1) ((SS) 0H+(SP)) (IP) (IP) (0000DH) (0000CH) |
|
tip (tip |
INT 10H |
(SP) (SP) - 2 ((SS)0H + (SP)+1) ((SS)0H + (SP)) (F) (IF) 0 (TF) (SP) (SP) - 2 ((SS)0H +(SP)+1) ((SS)0H+(SP)) (CS) (CS) (00043H) (00042H) (SP) (SP) - 2 ((SS)0H +(SP) +1) ((SS)0H+(SP)) (IP) (IP) (00041H) (00040H) |
Cerere de |
OF DF IF TF SF ZF AF PF CF |
|
INTO |
intrerupere |
0 0 |
software de tip 4 |
Descrierea formala a semanticii:
if (OF) = 1 then
(SP) (SP) - 2
((SS) 0H + (SP) +1) ((SS) 0H + (SP)) (F)
(IF) 0
(TF) 0
(SP) (SP) - 2
((SS) 0H + (SP) +1) ((SS) 0H + (SP)) (CS)
(CS) (00013H) (00012H)
(SP) (SP) - 2
((SS) 0H + (SP) +1) ((SS) 0H + (SP)) (IP)
(IP) (00011H) (00010H)
Revenire din |
OF DF IF TF SF ZF AF PF CF |
|
IRET |
rutina de deservire |
x x x x x x x x x |
a unei intreruperi |
Reface registru indicatori salvat in stiva si salveaza valorile registrelor IP si CS.
Observatii:
Echivalente intre instructiuni:
CALL ↔INT
RET ↔ IRET
Nr |
CALL |
INT |
Se sare la orice locatie in intervalul de adresare de 1MB |
Sare la o adresa fixatain tabelul vectorilor de intrerupere |
|
Utilizat de programator in secvente de instructiuni de program |
Intrerupere externa activata extern, poate apare in orice moment |
|
Nu poate fi mascata |
INTR poate fi mascata |
|
Se salveaza automat in CS: IP adresa noii instructiuni |
In plus fata de CS:IP, registrul de fanioane poate fi salvat |
|
RET este ultima instructiune |
IRET face acelati lucru ca POP pentru F, CS:IP |
3.1. Intreruperi elementare.
BIOS - ansamblu de subrutine de tratare a intreruperilor ce asigura servicii de baza.
Zona de lucru rezervata
- rezervarea se realizeaza la initializarea calculatorului;
- structura de date este pentru configuratia maxima permisa;
- unele date sunt initializate la pornirea PC-ului.
Detalirea instructiunilor
Apelul unei intreruperi presupune o pregatire anterioara a unor date in registrele folosite de rutina de tratare a acelei intreruperi. In general, trebuie parcurse urmatoarele etape:
se plaseaza un cod specific in AH;
se incarca alte registre (asa cum se va vedea in descrierea sumarului functiei dorite), se pregatesc zonele de memorie tampon, sirurile de caractere ASCII, etc. ;
se invoca INT tip;
se urmaresc indicatorii de eroare adusi din rutina de deservire a intreruperii atunci cand este cazul (de exemplu fanionul CF) si se folosesc datele rezultate din executarea rutinei, acolo unde ele exista.
3.1.1. INT 10H - "Servicii Video"
intrare:
AL = desired video mode. AH =
modul video dorit
iar alte registre utilizate sunt AL, CX, DX,
Lista de serviciilor video asigurata de ROM-BIOS este urmatoarea:
AH Functia |
00H impune modul video, 40x25. 16 colors. 16 culori. 8 pages. 8 pagini |
01H impune marimea/forma cursorului |
02H impune pozitia cursorului DH = rand. |
03H citeste pozitia cursorului, |
04H citeste "light pen" |
05H selecteaza pagina activa a afisajului |
06H misca "fereastra" afisata in sus (sau sterge "fereastra") |
07H misca "fereastra" afisata in jos citeste caracter sau atribut |
09H scrie caracter sau atribut |
0AH scrie caracter |
0BH selecteaza paleta de culori sau chenarul |
0CH scrie un pixel in modul grafic |
0DH citeste un pixel in modul grafic intrare: CX = column. CX
= coloan, DX = row. DX =
rand. |
0EH scrie caracter in modul "TTY" AL - caracter |
0FH citeste modul video |
10H impune paleta |
11H generator caractere |
12H functii speciale |
13H scrie sir caractere ("string") intrare: |
14H incarca tipuri de caractere "LCD" |
15H incarca parametrii afisajului |
08H (convertibili PC) |
1AH cere/impune coduri afisaj |
1BH cere stare/functie |
1CH salveaza/aduce starea video |
AX = 1003h - comuta intensitate / sclipitoare |
03h - text mode.example:when
bit 5 of CH is set to 0 , the cursor is visible. when bit 5 is 1
, the cursor is not visible.
INT 10h / AH = 0Ch - change color for a single pixel. b) INT 10h / AH = 0Ch - schimba culoarea pentru un singur pixel.
input: mov al , 13h mov al, 13H
mov ah , 0 mov ah, 0INT 10h / AH = 13h - write string. c) INT 10h / AH = 13H example:
INT 11h - get BIOS equipment list. INT 11H - afiseaza lista de echipamente.
return: intoarcere:
AX = BIOS equipment list word, actually
this call returns the contents of the word at 0040h:0010h. AX = lista
echipamente BIOS, returneaza continutul de la 0040h:0010h.
Currently this function can be used to determine
the number of installed number of floppy disk drives.Exemplu:
INT 12h - get memory size. INT 12h - marime memorie floppy
return: intoarcere:
AX = kilobytes of contiguous memory
starting at absolute address 00000h, this call returns the contents of the word
at 0040h:0013h. AX = acest apel returneaza continutul
de cuvant la 0040h: 0013h.
Floppy drives are emulated using FLOPPY_0(..3)
files. Floppy drive sunt imitat, folosind FLOPPY_0 (.. 3)
de fisiere.
INT 13h / AH = 00h - reset disk
system. INT 20H - "Termina Program"
Aceasta instructiune este folosita pentru a iesi din program si pentru a reda controlul procesului parinte (in mod curent command.com, interpretorul de comenzi DOS). Restaureaza valorile din vectorii de control DOS: INT 22H, INT 23H, INT 24H. Elibereaza toate memoriile-tampon de fisiere (fisierele trebuie sa fie inchise mai intai daca au schimbari in lungime).
INT 21H - "Functii DOS"
Pasii parcursi pentru a accesa o functie DOS:
AH ←numarul functiei DOS;
- AL ← numar subfunctie DOS (daca exista);
se incarca registrele asa cum este descris in sumarul functiei DOS, se pregatesc zonele de memorie-tampon, siruri de caractere ASCII;
se invoca INT 21H;
se urmaresc indicatorii de eroare adusi din DOS (spre exemplu fanionul CF)
DOS pastreaza toate valorile existente in registre in momentul apelului cu exceptia registrelor folosite pentru intoarcerea informatiei.
Functia DOS 01H - "citeste Tastatura"
Primeste - AH |
01H |
Intoarce - AL |
caracterul primit de la intrarea standard |
Asteapta sa citeasca un caracter de la dispozitivul de intrare standard. Intoarce acest caracter catre dispozitivul standard de iesire. Daca Ctrl-Break este detectat, este executata INT 23H.
Citirea codurilor speciale pentru taste ca F1-F12, PgUp, cursor. necesita un apel repetat al acestei intreruperi. La primul apel se va intoarce in AL 0H, iar la al doilea codul extins ASCII.
exemplu:
mov ah, 1
int 21h
Functia DOS 02H - "afisaj"
Primeste - AH DL |
02H caracterul trimis la iesirea standard |
Intoarce |
- |
Trimite caracterul aflat in DL la dispozitivul standard de iesire. Pentru caracterul backspace (ASCII 8) muta cursorul cu o pozitie la stanga.
Daca Ctrl-Break este detectat, se executa INT 23H.
Functia DOS 06H - "intrare/iesire consola"
Primeste - AH DL |
06H 0..0FEH caracterul trimis la iesirea standard 0FFH asteapta caracter de la intrarea standard |
Intoarce - ZF |
daca caracterul este din AL este valid caracterul citit, daca ZF=0 |
Daca in DL este plasat codul 0FFH, se
realizeaza o citire de tip "no wait" a consolei, intorcandu-se ZF=1
daca nu este valid caracterul si, in caz contrar, ZF=0 (caracterul
ce tocmai a fost citit este plasat in
Daca in DL se afla un cod diferit de 0FFH, el este trimis catre dispozitivul standard de iesire.
Nu se face verificare pentru Ctrl-Break. Se face un apel de doua ori al acestui serviciu pentru citirea codurilor ASCII extinse.
exemplu:
mov ah, 2
mov dl, 'v'
int 21h
Functia DOS 09H - "afiseaza sir"
Primeste - AH DS:DX |
09H adresa unui sir terminat cu '$'(ASCII 24) |
Intoarce |
- |
Sirul ce se termina cu caracterul'$' este trimis la dispozitivul standard de ie]ire. Pentru caracterul backspace se procedeaza similar cu functia DOS 02H (se muta cursorul stanga cu o pozitie).
Procedura normala de afisare a unei linii noi este sa se insereze o pereche CR/LF (ASCII 13 urmat de ASCII 0A) in sir.
Sirurile ce contin '$' poate fi tiparite cu functia 40H (BX=0).
Functia DOS 0AH - "citire sir in zona de memorie-tampon"
Primeste - AH DS:DX |
0AH adresa unei memorii-tampon de intrare |
Intoarce |
sirul de intrare plasat in memorie, cu simbol terminal CR (ASCII 13) |
La intrare in subrutina de tratare a intreruperii, zona de memorie de la DS:DX trebuie sa fie configurata astfel:
|max| ? | ? ? ? ? ?
unde, max este intrarea maxima acceptabila (domeniu: 1 .. 254)
La iesirea din subrutina de tratare a intreruperii, zona de memorie de la trebuie sa fie configurata astfel: |max|len| T E X T 0DH
unde, len este lungimea actuata a intrarii, mai putin simbolul terminal CR (in exemplul dat este 4).
Caracterele sunt citite de la dispozitivul standard de intrare pana cand este intalnit CR (ASCII 13) sau atata timp cat numarul lor nu depaseste max-1. Daca valoarea max-1 este depasita, se da un semnal sonor de avertizare pentru fiecare caracter ce este tastat, pana cand este citit CR (ASCII 13).
Al doilea octet din memorie este umplut cu lungimea actuala a intrarii, mai putin simbolul terminal CR. Caracterul final din memoria-tampon este intotdeauna CR (care nu este numarat in octetul de lungime).
Daca este detectat Ctrl-Break, se executa INT 23H si zona de memorie ramane neschimbata.
exemplu:
org 100h
mov dx, offset mesaj
mov ah, 9
int 21h
ret
mesaj db 'Sunt Student $'
Functia DOS 40H - "scrie in fisier via identificator"
Primeste -AH BX DS:DX CX |
40H identificator fisier adresa in memorie din care se vor scrie datele numarul octetilor pentru scriere Nota: 0000H specifica sa se truncheze fisierul |
Intoarce- AX |
un cod de eroare daca CF este setat, altfel, numarul octetilor scrisi actualmente |
Datele cuprinse in numarul de octeti specificati prin CX sunt scrise in fisierul sau dispozitivul cu identificatorul din BX. Datele sunt luate incepand de la adresa data de DS:DX. Datele sunt scrise in pozitia curenta a pointerului de citire/scriere al fisierului.
Este folosita functia DOS 42H ("Lseek") pentru a poztiona pointerul de citire/scriere inainte de apel atunci cand este necesar (OPEN seteaza pointerul de citire/scriere la 0). Pointerul de citire/scriere este actualizat ca subsecventa a accesului secvential.
Se poate compara [ntotdeauna valoarea intoarsa in AX (numarul de octeti scrisi efectiv) cu CX (dimensiunea impusa a fi scrisa). Daca sunt egale scrierea s-a facut cu succes, altfel, (daca AX < CX) a intervenit o eroare (cel mai adesea pentru scrierea pe disc este mesajul 'disk full').
Pentru DOS 3.2+, daca la apel CX=0, fisierul este trunchiat la pozitia curenta a pointerului de fisier.
Functia DOS 4CH - "termina program - EXIT"
Primeste -AH |
4CH codul de iesire |
Intoarce |
Intoarce codul procesului "copil" catre procesul "parinte" si seteaza o valoare a codului de iesire care poate fi ceruta de functia DOS 4DH ("Wait").
Desfasurarea lucrarii
Exemplul 1
Functia 02h a intreruperii 21h permite afisarea unui caracter pe ecran. Intreruperea asteapta in registrul AH codul functiei (02h) iar in registrul DL, codul ASCII al caracterului pe care dorim sa il afisam. Modul de apel este:
mov AH, 02h
mov DL, 'A'
int 21h
Exemplul 2
Functia 00h a intreruperii
10h permite schimbarea modului de lucru din mod text in mod grafic precum
si a rezolutiei ecranului. Intreruperea asteapta in registrul
AH codul functiei (00h), iar in registrul
mov AH, 00h
mov AL, 12h
int 10h
Efectul acestui grup de instructiuni este schimbarea modului de lucru in mod grafic, la o rezolutie de 640x480 de pixeli si mod de lucru cu 16 culori.
Exemplul 3
Sa se citeasca de la tastatura numele unui fisier. Sa se afiseze acest fisier pe ecran
assume cs:code, ds:data
data segment
msg db 'Numele fisierului: $'
maxFileName db
lFileName db ?
fileName db dup (?)
buffer db dup (?),
openErrorMsg db 'Fisierul nu exista.$'
readErrorMsg db 'Nu se poate citii din fisier.$'
data ends
code segment
start
mov ax, data
mov ds, ax
; afisam mesajul cu functia 09h, int 21h
mov ah, 09h
mov dx, offset msg
int 21h
; citim de la tastatura numele fisierului cu ajutorul functiei 0ah, int 21h
mov ah, 0ah
mov dx, offset maxFileName
int 21h
; in urma citirii la adresa maxFileName + 2 = fileName se memoreaza numele fisierului citit
; la adresa maxFileName + 1 = lFileName se memoreaza dimensiunea sirului de caractere care reprezinta numele fisierului
; transformam numele fisierului intr-un sir ASCIIZ
mov al, lFileName
xor ah, ah
mov si, ax
mov fileName[si],
; deschidem fisierul cu functia 3dh, int 21h
mov ah, 3dh
mov al, ; deschidem fisierul pentru citire
mov dx, offset fileName
int 21h
jc openError ; eroare la deschiderea fisierului daca CF e setat
mov bx, ax ; salvam identificatorul fisierului in registrul bx
; cat timp nu e sfarsit de fisier citim din fisier si afisam pe ecran
goOn
mov ah, 3fh
mov dx, offset buffer
mov cx, ; citim maxim 100 de caractere
int 21h
jc readError
; in caz de succes functia 3dh intoarce in ax numarul de octeti cititi
; salvam numarul octetilor cititi si pregatim sirul pentru afisare
mov si, ax
mov buffer[si],
; afisam ce am citit
mov ah, 09h
int 21h
cmp si,
je goOn ; daca am citit 100 de octeti inseamna ca nu am terminat de citit
jmp endPrg ; sarim peste tratarea eventualelor erori
openError
mov ah, 09h
mov dx, offset openErrorMsg
int 21h
jmp endPrg
readError:
mov ah, 09h
mov dx, offset readErrorMsg
int 21h
endPrg:
mov ax,4c00h
int 21h
code ends
end start
Probleme Propuse
Urmatoarele probleme se vor rezolva in limbaj de asamblare:
1. Sa se tipareasca continutul registrilor si suma primilor 4 biti ai lor.
2. Sa se citeasca cate un caracter de la tastatura, fara ecou. Daca este cifra, sa se tipareasca pe ecran, daca este caracterul '$', se termina programul, in orice alta situatie se adauga caracterul intr-un buffer care se va tipari in final pe ecran.
3. Daca unitatea implicita este cea citita de la tastatura (X), atunci sa se selecteze ca si unitate implicita unitatea A:, in caz contrar, sa se selecteze unitatea X:. Orice situatie de eroare va fi semnalata.
4. Sa se afiseze data curenta si ziua curenta din saptamana (in litere).
5. Sa se afiseze ora sistem curenta sub forma hh:mm si sa se specifice cu sirul 'AM' sau 'PM' daca este antemeridian sau postmeridian.
6. Sa se afiseze spatiul liber de pe o discheta.
7. Sa se afiseze spatiul ocupat pe o discheta.
8. Sa se stearga un fisier al carui nume va fi introdus de la tastatura. Orice situatie de eroare va fi semnalata printr-un mesaj corespunzator.
9. Sa se afiseze numele si continutul directorului curent.
10. Sa se afiseze atributele unui fisier al carui nume va fi introdus de la tastatura.
11. Sa se pozitioneze atributele unui fisier al carui nume va fi introdus de la tastatura. Noile atribute vor fi determinate in urma unui dialog cu utilizatorul de la tastatura.
12. Sa se citeaca de la tastatura doua nume de fisiere. Sa se copieze primul fisier in cel de al doilea. Se va semnala orice situatie de eroare.
13. Sa se citeasca de la tastatura un nume de fisier si un nume de director. Sa se afiseze un mesaj corespunzator daca fisierul exista sau nu in directorul dat.
14. Sa se citeasca de la tastatura un cuvant si un nume de fisier. Sa se afiseze daca cuvantul exista sau nu in fisierul dat.
15. Sa se citeasca de la tastatura un doua nume de directoare dir1 si dir2. Sa se creeze directorul dir1dir2.
16. Sa se citeasca de la tastatura numele unui fisier. Sa se verifice daca dimensiunea fisierului este multiplu de 13, si in caz negativ sa se completeze fisierul cu un numar minim de octeti 0 astfel incat dimensiunea fisierului sa devina multiplu de 13.
Anexa Laborator 6
Tabela vectorilor de intrerupere (data de catalog)
Bibliografie
1.https://www.htl-steyr.ac.at/~morg/pcinfo/hardware/interrupts/inte1at0.htm
2. https://spike.scu.edu.au/~barry/interrupts.html
3. https://heim.ifi.uio.no/~stanisls/helppc/idx_interrupt.html
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |