Mihai Sprinceana
Un forum de programare cu de toate. Va astept sa va inscrieti si sa deveniti moderatori. Oricine este binevenit aici sa se inscrie si sa aiba acces la informatie free! Fiecare este liber sa adauge proiecte programe free etc. Ajutati acest forum sa devina o comunitate puternica unde fiecare invata de la fiecare! Tot ce trebuie sa faceti este sa va inregistrati si fiecare contributie se poate dovedi utila in timp! Forumul este free informatia free dk aveti timp liber ajutati si pe ceilalti si invatati si voi in acelasi timp! Haideti sa facem ceva pt.a ne ajuta intre noi! Cititi regulament postare forum inainte de a posta!
Lista Forumurilor Pe Tematici
Mihai Sprinceana | Inregistrare | Login

POZE MIHAI SPRINCEANA

Nu sunteti logat.
Nou pe simpatie:
Alesiandra
Femeie
24 ani
Cluj
cauta Barbat
28 - 58 ani
Mihai Sprinceana / Assembler 8086 / Intreruperi BIOS Moderat de fireratbat, profu.info, sade5000
Autor
Mesaj Pagini: 1
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!

pus acum 18 ani
   
Pagini: 1  

Mergi la