Houssey
Moderator
 Din: Buzau
Inregistrat: acum 18 ani
Postari: 260
|
|
1. Obiectivele lucrarii - prezentarea functiilor de întreruperi BIOS folosite în limbajul de asamblare; - familiarizarea cu aceste functii; - însusirea modului de utilizare a functiilor ; - elaborarea si implementarea unui program LASM pentru utlizarea functiilor BIOS.
2. Aparatura si suporturile utilizate
- calculator personal în configuratie unitate centrala, monitor, tastatura, mouse ; - precizarile din prezentul îndrumar;
3. Breviar teoretic
Notiuni generale
Componenta BIOS contine urmatoarele programe : • -testare pentru toate resursele calculatorului (procesor, memorie, sistemul de întreruperi si initializare tabela, tastatura, display, disc, ceas de timp real etc.); • -program pentru încarcarea înregistrarii destinate încarcarii sistemului de operare de pe disc; • -rutine pentru comanda si controlul operatiilor de intrare/iesire la nivel fizic, pentru toate echipamentele; • -rutine pentru încarcarea întreruperilor externe provenite de la : - ceasul de timp real (întreruperea 8); - tastatura (nivelul 9); - unitatea de disc(nivelul 14). Daca programele de test nu semnaleaza nici o eroare, atunci se va lansa în executie programul de încarcare a sistemului de operare de pe disc, dupa care se va da controlul acestuia. O întrerupere este o procedura executata de microprocesor automat la îndeplinirea unor conditii. Dupa felul conditiilor avem întreruperi hard, la care conditia este un eveniment fizic, cum ar fi apasarea pe o tasta, sau întreruperi soft, la care cerem prin program microprocesorului sa execute o întrerupere. Pentru a apela o rutina BIOS, se foloseste o instructiune de întrerupere software int 80x86. Instructiunea int are umatoarea sintaxa: int valoare Valoare este un numar în domeniul 0...255. Executia instructiunii int va cauza la 80x86 sa transfere controlul la una din cele 256 întreruperi intermediare diferite. Tabela cu vectori de întrerupere, porneste de la locatia de memorie fizica 0:0, pastrând adresa acestei întreruperi intermediare. Fiecare adresa necesita patru octeti, doi pentru CS si doi pentru IP, care pereche (CS:IP) arata pozitia în segment si deplasamentul în cadrul segmentului. Spre exemplu, int 0 transfera controlul la rutina a carei adresa este la locatia 0:0, int 1 transfera controlul la rutina a carei adresa este 0:4, int 2 calea 0:8, int 3 calea 0:C si int 4 calea 0:10. La întâlnirea unei instructiuni INT, microprocesorul executa:
PUSHF PUSH CS ;se introduce CS în stiva PUSH IP ;se introduce IP în stiva MOV CS, AdresaSegmentIntrerupere MOV IP, AdresaDeplasamentInterupere
La întâlnirea unei instructiuni IRET, microprocesorul executat:
POP IP ;se scoate IP din stiva POP CS ;se scoate CS din stiva POPF
Prin intermediul unei întreruperi se pot executa mai multe servicii în functie de continutul registrilor în momentul apelarii întreruperilor. Spre exemplu, daca se doreste afisarea unui caracter pe ecran se introduce în AH valoare 0Ah, în AL caracterul dorit, iar dupa aceea se scrie INT 10h. Registri generali sunt: AX, BX, CX, DX. Acestia au dimensiunea de 16 biti, deci 2 octeti. Fiecare din acesti registri poate fi împartit în doua: AX => AH si AL; BX => BH si BL; CX => CH si CL; DX => DH si DL. Pozitia celor doua jumatati este reprezentata în figura:
AL reprezinta octetul cel mai putin semnificativ din AX. Cu acesti registrii generali se pot face operatii aritmetice, logice si rotatii pe biti.
O introducere la functiile BIOS
BIOS-ul PC-ului IBM foloseste software-ul de întreruperi 5 si 10h..1Ah care îndeplinesc diferite operatii. Asadar, instructiunile int 5 si int 10h .. int 1ah furnizeaza interconexiunea BIOS. Urmatorul tabel rezuma functiile BIOS:
INT Functia 5h Operatia Tiparire Ecran. 10h Utilizare terminal grafic. 11h Determinare configuratie sistem. 12h Determinare dimensiune memorie. 13h Utilizare disc flexibil. 14h Utilizare interfata seriala. 16h Utilizare tastatura. 17h Utilizare imprimanta. 19h Reîncarca sistemul de operare. 1Ah Utilizare ceas de timp real.
Multe din aceste rutine necesita parametri variati în registri 80x86.
NT 10h - Utilizare terminal grafic
Instructiunea: int 10h Operatia BIOS: Functia video de intrare/iesire Parametrii: Mai multi, pastrati în ax, bx, cx, dx.
Terminalul grafic poate lucra în doua moduri: alfanumeric si grafic. • Modurile de lucru alfanumerice sunt caracterizate de numarul de linii caracter (25), numarul de coloane caracter (40 sau 80), atribuite de culoare si numarul de pagini. Pentru acest mod de lucru, un caracter este specificat prin codul ASCII si atributul de culoare, care contine 3 elemente (culoare fond-ultimii 4 biti, culoare caracter - 3 biti, afisare continua sau intermitenta, blinking-1bit). • Modul de lucru grafic se caracterizeaza prin numarul de linii si de coloane (de puncte de pe ecran - pixeli), precum si culoare.
Tabel functii video BIOS
AH Parametrii de intrare Parametrii de iesire Descrierea functiei 0 al=mode Selectia modului de afisare video 1 ch- linia de start cl- linia de sfârsit Selectia formei si dimensiunii cursorului. Valorile liniei sunt în domeniul 0..15. Cursorul dispare daca se încarca în ch valoarea 20h. 2 bh- pagina dh- coordonate y dl- coordonate x Pozitionarea cursorul pe ecran 3 bh- pagina (ch,cl)- forma cursorului dh- linia dl- coloana Citirea coordonatelor cursorului. 4 Citirea pozitiei indicatorului optic 5 al- afisare pagina Selectia paginii active pe ecran 6 al- numarul de linii de deplasat; bh- atribut de culoare pt. liniile introduse (ch,cl)- limite de fereastra, stânga sus (dh,dl)- limite de fereastra, dreapta jos Defilarea în sus a imaginii. Daca al este 0, aceasta functie sterge fereastra specificata de cl/ch (coltul stânga sus) si dl/dh (coltul dreapta jos). Daca al contine orice alta valoare, aceasta functie va deplasa fereastra cu un numar de linii specificat în al. 7 al, bh, (ch,cl), (dh,dl) Defilarea în jos a imaginii. Se utilizeaza aceleasi registre ca la functia de deplasare în sus, cu aceeasi semnificatie, a imaginii dintr-o fereastra continuta în pagina activa. 8 bh- pagina referita al- caracterul citit ah- atribut de culoare Citirea codul ASCII si atributul caracterului de pe ecran, din dreptul cursorului. 9 al- caracterul bh- numarul paginii bl- atribut de culoare cx- numarul de repetari ale afisarii caracterului Afisarea caracterelor pe ecran, din pozitia cursorului. 0Ah al- caracter bh- pagina Înlocuirea caracterelor cu pastrarea culorii. Aceasta functie este similara cu cea anterioara cu deosebirea ca se preiau atributele de culoare ale caracterelor anterioare de pe ecran 0Bh bh- culoare de fundal (implicit e 0) bl- cod culoare Fixarea caracteristicilor de culoare. 0Ch dx- numarul liniei cx- numarul coloanei al- culoarea punctului Afisarea punctului pe ecran (pixel) 0Dh cx/dx- nr liniei/coloanei punctului al- codul culorii punctului referit Citirea culorii punctului de pe ecran 0Eh al- caracterul bh- pagina Afisarea caracterului si actualizarea pozitiei cursorului. 0Fh ah- nr coloane al- modul de lucru bh- pagina Citirea caracteristicilor de lucru.
INT 11h - Determinare configuratie sistem
Instructiunea: int 11h Operatia BIOS: Întoarce o lista de echipamente Parametrii: La intrare: nimic, la iesire: AX contine lista de echipamente
La întoarcerea lui int 11h, registrul AX contine un bit-codare a listei de echipamente cu urmatoarele valori:
Bit 0 Disc flexibil instalat Bit 1 Coprocesor matematic instalat Bit 2,3 Rezervat Bit 4,5 Mod video initial 00 - nimic 01 - 40x25 color 10 - 80x25 color 11 - 80x25 alb/negru Bit 6,7 Numarul de discuri flexibile Bit 8 Rezervat Bit 9,10,11 Numarul de placi seriale RS-232 instalate Bit 12 Placa de I/O instalata Bit 13 Modem intern instalat Bit 14,15 Numarul de imprimante atasate
Valoarea returnata în AX este aceeasi cu cea retinuta la locatia de memorie 0:0410h, care este initializata în timpul testelor de pornire. Pentru IBM PC, XT, si PCjr, biti 2 si 3 se foloseau pentru listarea cantitati de RAM instalata pe placa de baza în incrementari de 16K. De exemplu, 00 înseamna 16K, în timp ce 11 înseamna 64K. Bitul 0 indica doar ca sistemul are una sau mai multe unitati de disc. Biti 6 si 7 se refera la cât de multe unitati de disc sunt prezente. Pentru a determina numarul de hard disk-uri instalate, se foloseste INT 13h, functia 08h. Daca schimbatorul DIP pentru PC-uri si XT-uri nu este setat corect reflectând prezenta coprocesorului matematic, atunci bitul 1 (prezenta coprocesor matematic) poate fi incorect. O metoda mai buna este de a testa direct prin executarea unei instructiuni specifice coprocesorului matematic si apoi a se verifica daca instructiunea a fost executata. De observat ca aceste functii BIOS au fost concepute în jurul PC-ului original IBM cu posibilitati de expansiune hardware foarte limitate. Biti returnati de aceste functii sunt aproape fara sens astazi.
INT 12h - Determinare dimensiune memorie
Instructiunea: int 12h Operatia BIOS: Determinarea marimii memoriei Parametrii: Întoarce marimea memoriei în AX (pâna la 640K)
Aceasta functie determina memoria prin examinarea fiecarui schimbator DIP de pe placa de baza sau folosind valoarea retinuta în bateria CMOS, în functie de calculator. Valoarea retinuta în AX este aceeasi cu cea retinuta la locatia de memorie 0:0413h, care este initializata în timpul testelor de pornire. Aceasta este cantitatea de memorie disponibila la intrarea sistemului. Aceasta nu este cantitatea de memorie disponibila pentru programe. Utilizând INT 21h, functia 48h, se determina cantitatea de memorie disponibila pentru programe.
INT 16h - Utilizare tastatura
Instructiunea: int 16h Operatia BIOS: Citeste o tasta, testeaza o tasta, sau primeste starea tastaturii Parametrii: al
Pentru tastatura exista, de fapt 2 proceduri: una pe nivelul 9 de întreruperi, care trateaza semnalele venite de la tastatura si una pe nivelul 16H, care poate fi folosita de utilizator pentru obtinerea unui caracter de la tastatura. Prima procedura depune caracterele transmise de la tastatura într-un buffer (de 16 caractere), în timp ce a doua procedura preia caracterele din acest buffer. Procedura pentru tratarea întreruperilor de la tastatura realizeaza si interpretarea si executia unor comenzi corespunzatoare unor combinatii de taste speciale : • CTR/ALT/DEL=reinitializare sistem; • SHIFT/PRTSC=copiere la imprimanta a caracterelor de pe ecran; • CTRL/NUMLOCK=oprirea executiei unui program pana la apasarea altei taste; • CTRL/SCROLL LOCK=încheie executia unui program; aici utilizatorul îsi poate defini propria sa rutina de tratare a întreruperii (1BH).
În functie de starea tastelor de tip shift (INS, CAPS, NUM LOCK, SCROLL LOCK, ALT, CTRL, SHIFT stânga, SHIFT dreapta) sunt interpretate codurile de scanare provenite de la tastatura. Starea acestor taste este memorata la adresa 40:17H. În functie de starea tastelor de tip shift se obtine o pereche de octeti: • pentru caracterele obisnuite, primul este codul ASCII, iar cel de-al doilea este codul de scanare ; • ALT+tasta numerica furnizeaza setul de caractere ASCII extins (între 128 si 255); primul octet este acest cod, iar cel de-al doilea este 0; • pentru tastele speciale, primul octet este 0, iar cel de-al doilea este codul de scanare . Pentru utilizarea tastaturii se pot utiliza urmatoarele functii :
AH=0: Citirea caracterului
Daca int 16h este apelat cu ah egal cu zero, BIOS-ul va reda controlul doar când o tasta va fi disponibila în bufferul sistemului. La întoarcere, al contine codul ASCII pentru tasta citita din buffer si ah contine codul de scanare. Desigur nu toate tastele au corespondenta în coduri ASCII. Tastele Home, PgUp, End, PgDn, sagetile, si tasta ALT sunt cel mai bun exemplu. Cînd o astfel de tasta e apasata, int 16h întoarce zero în al si codul de scanare în ah. Asadar, oricând se întoarce zero pentru codul ASCII, trebui sa se verifice registrul ah pentru a se determina tasta apasata. De observat ca folosind instructiunea BIOS int 16h pentru citirea unei taste, apasarea acesteia nu este afisata pe ecran. Pentru afisarea caracterului pe ecran se foloseste int 10h.
AH=1 Test pentru caracter disponibil în buffer
Aceasta subfunctie particulara int 16h permite sa se verifice daca o tasta e disponibila în buffer. Chiar daca o tasta nu e disponibila, controlul e returnat la apelare. Cu acest apel se verifica daca exista caracter disponibil în buffer si se continua procesarea daca nu a fost apasata vreo tasta. Nu sunt parametrii de intrare pentru aceasta functie. La întoarcere, ZF=0 daca exista caracter disponibil în buffer si ZF=1 daca nu exista. Daca o tasta e disponibila, registrul ax va contine codul ASCII si codul de scanare pentru acea tasta. Aceasta functie nu sterge caracterul din buffer. Subfunctia #0 trebuie folosita pentru stergerea caracterelor.
AH=2 Citirea starii tastelor de tip shift
Aceasta functie întoarce starea diferitelor taste în registrul ax. Valorile returnate sunt urmatoarele:
Bit Înseamna 7 Declarare Insert (apasând tasta INS) 6 Caps Lock (1=capslock on) 5 Num lock (1=numlock on) 4 Scroll lock (1=scroll lock on) 3 Alt (1=tasta ALT apasata) 2 Ctrl (1=tasta CTRL apasata) 1 Stanga shift (1=tasta shift stânga apasata) 0 Right shift (1=tasta shift dreapta apasata)
4. Desfasurarea lucrarii
În continuare vor fi prezentate câteva exemple de programe care utilizeaza functiile BIOS:
a) utilizare terminal grafic (p1.asm)
.MODEL small .STACK 100h code segment assume cs:code, ds:code ; ; Procedura afisare text utilizind si atribute de culoare ; ; Continut registre la apel" ; ; (DH,DL) = numar linie coloana primul caracter din text ; (BH) = numar pagina in care se face afisarea ; (BL) = atribut culoare utilizat pentru toate ; caracterele ; (DS) = adresa segmentului care contine textul ; (SI) = adresa relativa in segment a textului ; ; Textul se termina cu un octet cu valoare 0. afisare proc mov cx,1 ;repetare caracter iar: mov ah,2 int 10h ;pozitionare cursor lodsb cmp al,0 ;comparare sfarsit text jz gata cmp al,0dh ;comparare ENTER jz cr mov ah,9 int 10h ;afisare caracter inc dl ;repozitionare caracter coordonate x cmp dl,80 jnz iar cr: inc dh ;pozitionare randul urmator mov dl,0 jmp iar gata: ret afisare endp start: mov ax,cs mov ds,ax mov cx,0 mov dx,256*24+79 mov ah,6 mov bh,36h int 10h ;se sterge ecranul cu o culoare mov dx,10*256+12 ;coordonate cursor (linia=10, coloana=12) mov bh,0 ;pagina 0 mov bl,00011101b ;atribut culoare mov si,offset mesaj call afisare mov ax,4c00h int 21h mesaj db 'Merge !!!',0hh,'Ca daca n-ar fi asa...',0 code ends end start b) utilizare tastatura (p2.asm)
.MODEL SMALL .STACK 100h .CODE mov ax,@data mov ds,ax start: ;Citeste o secventa de tastare pana cand se apasa Enter ReadLoop: mov ah, 0 ;citeste codul tastei int 16h cmp al, 0 ;funtie speciala jz ReadLoop ;daca da, nu afisa aceasta tasta mov ah, 0Eh int 10h ;se afiseaza cmp al, 0dh ;inceput de rand (ENTER) jne ReadLoop mov ah,4ch int 21h END start c) program pentru dimensionarea ferestrei
stiva SEGMENT STACK 'STACK' DB 100h DUP(?) stiva ENDS codp SEGMENT start: mov ah,6 ;in registrul ah se incarca functia 6 ;care dimensioneaza ferestra mov al,20 mov ch,1 mov cl,1 mov dh,10 mov dl,10 mov bh,0 int 10h int 21h mov ah,4ch int 21h codp ENDS END start d) program pentru afisarea unui caracter si dimensionarea cursorului
stiva SEGMENT STACK 'STACK' DB 100h DUP(?) stiva ENDS codp SEGMENT start: mov ah,1 ;in registrul ah se incarca functia 1 ;de dimensionare a cursorului mov ch,15 mov cl,7 int 10h mov ah,2 mov bh,0 mov dh,20 mov dl,15 int 10h mov ah,0Eh ;in registru ah se incarca functia 14 ;de afisare a unui caracter mov al,'b' int 10h int 21h mov ah,4ch int 21h codp ENDS END start 5. Modul de lucru
1. Se editeaza programele exemplu (în orice mediu de editare) si se salveaza cu extensia .ASM. 2. Se asambleaza si link-editeaza programele, obtinându-se forma .EXE; 3. Se executa primul executabil (p1.exe) si se observa ca în urma executiei acestui program se sterge ecranul, se schimba atributul de culoare al caracterelor, se repozitioneaza cursorul si se afiseaza un sir de caractere la coordonatele specificate. Se cere sa se creeze un program asemanator care sa stearga întreg ecranul, si sa modifice atributul de culoare al caracterelor la valoarea initiala. 4. Se ruleaza executabilul (p2.exe) si se introduce un sir de caractere de la tastatura pâna se apasa tasta ENTER. Se cere sa se creeze un program asemanator care sa citeasca un sir de caractere pâna se apasa tasta ESC.
_______________________________________ House Music Set`s Me Free!
|
|