CATEGORII DOCUMENTE |
1 Utilizarea intreruperilor software
Anumite actiuni standard pe care trebuie sa le execute un program pot fi realizate mai simplu folosind intreruperile software si apelul functiilor sistem, BIOS sau BDOS. Acestea sunt colectii de rutine de larga utilitate existente in sistemul de operare si in firmware-ul computerului si care pot fi apelate de orice program.
Cele mai utilizate rutine ale sistemului de operare sunt cele apelate prin intermediul intreruperii 21H. Aceasta se realizeaza cu instructiunea INT 21H, dupa ce in prealabil au fost incarcate unele registre cu parametrii specifici.
De exemplu, afisarea unui sir de caractere pe ecran se poate face ca in programul urmator:
Exemplul 1:
.radix 16
.model small
.stack 100h
.DATA
Sir1 db 'abcdefghij ABC$'
.code
start:
mov ax,seg Sir1 ;Adresa segmentului de date ;unde se afla sirul
mov ds,ax ;se incarca in DS
mov dx, offset sir1 ;Se va apela functia sistem 09 ;care necesita adresa efectiva ;a sirului in DX
mov ah,09 ;Codul functiei sistem in AH
int 21 ;Se cheama intreruperea pentru ;functii sistem
;Iesirea catre sistemul de operare
mov ah,4c ;se face cu functia 4C
;al carei cod se incarca in AH
int 21 ;Se cheama intreruperea pentru ;functii sistem
end start
Observatii:
- Sirul de caractere trebuie sa fie scris intre semne apostrof si, pentru functia 09, trebuie sa se termine cu caracterul $ (dupa cum se va arata mai jos).
- In locul instructiunii mov ax,seg Sir1 se putea folosi aici si instructiunea mov ax,@data. Daca insa erau mai multe siruri, in segmente diferite, era necesara instructiunea din exemplu.
Functiile sistem sunt apelate prin executia intreruperii 21H, cu anumite valori in registre.
Dintre acestea, functiile de intrare de la tastatura sunt:
01H Intrare caracter de la keyboard.
06H Intrare/Iesire caracter de la keyboard/display.
07H Intrare caracter nefiltrat de la keyboard fara ecou.
08H Intare caracter de la keyboard fara ecou.
0AH Intrare de la keyboard in buffer.
3FH Intrare de la dispozitiv sau din fisier.
Functiile de iesire la display sunt:
02H Iesire caracter la display.
09H Iesire sir la display.
40H Scriere in dispozitiv de iesire
sau fisier.
In afara de acestea mai exista si functii de lucru cu fisierele si cu discul, cu memoria, etc prezentate in Anexa 3.
O functie larg folosita este functia 4Ch care permite iesirea din program catre sistemul de operare.
Registre:
AH
= 01H
Iesire in registre:
AL = Caracterul citit
In caz ca
este un caracter cu cod extins, in AL se va obtine 0 si va fi necesar
sa fie apelata functia din nou pentru a se obtine codul
extins.
Exemplul 2:
;Aici se va citi un caracter de la keyboard
MOV AH,01H; Functia de citire a unui caracter
INT 21 H
Registre:
AH
= 07H
Iesire in registre:
AL = Caracterul citit.
In caz ca
este un caracter cu cod extins, in AL se va obtine 0 si va fi necesar
sa fie apelata functia din nou pentru a se obtine codul
extins.
Exemplul 3:
MOV AH,07H
INT 21 H
Observatie: Functia 07h nu testeaza caracterul, si nu sesizeaza de exemplu Ctrl+C, astfel ca la redirectarea spre un fisier nu este detectat caracterul de sfarsit de fisier, si se continua scrierea in fisierul imediat urmator. Pentru sesizarea Ctrl-C se poate folosi in loc functia 08h, care face filtrarea si este similara cu 07h in rest.
FUNCTION 0AH- Citire de la
keyboard in buffer
Registre:
AH = 0AH.
DS:DX = Adresa zonei unde se vor memora caracterele si in care structura datelor va fi urmatoarea:
BYTE 0 = Numarul total de caractere care urmeaza sa fie citite;
BYTE 1 = Numarul de caractere citite pana la un moment dat.
De la BYTE 2 pana la [BYTE 0] + 2 = caracterele citite
Caracterele vor fi memorate incepand cu octetul al treilea al zonei specificate. Terminarea introducerii se face automat cand s-a citit un numar de caractere egal cu cel specificat in primul octet (moment in care difuzorul va genera un beep) sau cand se apasa tasta ENTER.
3FH FUNCTION - Citire din dispozitiv sau fisier
Registre:
AH = 3FH;
BX = Numarul asignat
dispozitivului;
CX = Numarul de
octeti care trebuie citit;
DS:DX = Adresa zonei in care
se va face memorarea.
Iesiri in registre:
CF = 0 nu au fost erori
iar AX = numarul de octeti cititi;
CF = 1 daca au existat
erori iar AX contine codul erorii.
02H FUNCTION - Afisare caracter
Registre:
AH = 02H;
DL = Codul hexa al
caracterului de afisat.
Exemplul 4:
;Afiseaza caracterul '1'
MOV AH, 02
MOV DL,31h ; Caracterul '1' are codul ASCII 31H
INT 21h
09H FUNCTION - Afisare
sir de caractere
Registre:
AH = 09H;
DS:DX = Adresa de inceput a
sirului de caractere.
Functia afiseaza caracterele unul cite unul pana intilneste caracterul $ care este interpretat ca sfarsit de sir.
In
locul acestei functii se recomanda utilizarea functiei 40H.
40H FUNCTION - Scriere in
dispozitiv sau fisier
Registre:
AH = 40H;
BX = Numarul
dispozitivului ( 1 pentru display);
CX = Numarul de
octeti de scris;
DS:DX = Adresa de inceput a
sirului de scris.
Iesiri in registre:
CF = 0 daca nu au
fost erori;
AX = Numarul de
octeti scrisi;
CF = 1 daca au
aparut erori;
AX = codul de eroare.
4CH FUNCTION - Iesire
catre sistemul de operare
Registre:
AH = 4CH;
Iesiri in registre:
AL = codul de terminare;
Modul de lucru:
Se recomanda ca la programele urmatoare iesirea sa se faca cu functia 4Ch, ca in exemplul 1. Rularea se poate face direct, in care caz revenirea in Windows se face cu Alt+Tab sau cu tasta 'Windows' (cea dintre Ctrl si Alt).
Se poate face rularea si prin TD, eventual pas cu pas.
P 1 Se va scrie un program care afiseaza la ecran caracterele avand codurile ASCII cuprinse intre 30h si 80h.
Indicatii: Se va folosi functia 02.
P 2 Se va scrie un program care sa afiseze un sir de caractere la ecran.
Indicatii: Sirurile de caractere se scriu intre semne apostrof, iar in interiorul unui sir apostroful se dubleaza (de exemplu intr'adevar se va scrie ca sir sub forma 'intr''adevar'). Pentru folosirea functiei 09h sirul trebuie sa se termine cu caracterul $.
P 3 Program care sa afiseze doua siruri de caractere pe doua randuri.
Indicatii: Pentru a putea trece la un nou rand pe ecran, trebuie trimise catre acesta caracterele 0Dh (Carriage Return - aducere la inceputul randului) si 0Ah (Line Feed - avans cu un rand mai jos pe ecran).
P 4 Se va scrie un program care sa citeasca de la tastatura caractere si sa le afiseze cu ecou la ecran. Daca se apasa tasta ENTER (care genereaza caracterul Carriage Return -ODh), se va afisa mesajul 'Citire tastatura incheiata.' (mesajele sunt fara diacritice).
Indicatii: Se va folosi functia 01, care va afisa automat caracterul tastat; programul il va afisa din nou , de exemplu cu functia 02, astfel ca fiecare caracter va aparea pe ecran dublat - cu ecou.
P 5 Se va modifica programul precedent pentru afisare fara ecou.
P 6 Se va scrie un program care sa citeasca de la tastatura caractere si sa le afiseze cu majuscule la ecran. Se va testa varianta cu ecou si cea fara ecou.
Indicatii: Codul ASCII pentru majuscule se obtine scazand 20h din codul curent.
P 7 Se va scrie un program care sa citeasca intr-un buffer un sir de caractere (cu functia 0Ah) si sa le afiseze (cu functia 09h) pe linia urmatoare atunci cand se apasa Enter.
P 8 Se va scrie un program care afiseaza pe ecran textul:
'Care din urmatoarele registre folosite la adresare indirecta, implica segmentul de date?
1. BX
2. BP
3. SI
4. DI'
si asteapta un caracter (1..4) de la tastatura. Daca raspunsul este corect sa se afiseze textul: 'Corect', iar daca este gresit sa afiseze textul: 'Gresit!! Este BX sau SI!'
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2277
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved