CATEGORII DOCUMENTE |
Functiile DOS sunt un caz particular de subprograme existente in sistemul de operare DOS, care se apeleaza prin intreruperi. Apelul functiilor DOS este independent de Versiunea sistemului de operare. Transmiterea parametrilor se face prin registre sau prin zona de memorie.
Oricare comanda DOS are o functie corespondenta care poate fi apelata din programe scrise in limbaj de asamblare. Se pot construi aplicatii care utilizeaza comenzile DOS in programe. Din aceasta categorie face parte si Norton Commander, sau Windows Commander.
Apelarea unei functii DOS de intrarea iesire se face printr-o secventa de forma:
MOV AH,cod_functie ; codul functiei DOS se incarca in registrul AH
MOV reg1,par1 ; pregatire parametrii in registre
MOV reg2,par2
INT 21H ; apel functie (subprogram) prin intrerupere 21H
Intreruperea 21H serveste la apelarea a zeci de functii indicate prin codul functiei ce se incarca in registrul AH. Fiecare functie necesita un numar de parametrii care se incarca in registre.
Oprire program cu revenire in DOS se realizeaza cu functia care are codul 4CH
MOV AH,4CH ; cod functie revenire in DOS
INT 21H
Functiile de intrare iesire referitoare la dialogul cu operatorul sunt:
01H Citire de la tastatura un caracter ASCII cu ecou in registrul AL.
Ecou inseamna afisare caracter tastat si pe pe ecran.
02H Afisare un caracter ASCII din registru DL pe monitor.
03H Citire in AL un caracter de la intrarea AUX, care este in mod normal portul de
comunicatii seriale COM1 (2400 bauds, fara paritate ,1bit de Stop, 8 biti de date).
04H Trimite din DL un caracter ASCII spre portul serial AUX.
05H Tipareste din DL un caracter ASCII la imprimanta.
06H Intrare iesire directa fara ecou serveste la transmiterea caracterelor functionale(CTRL+)
Daca DL=FFH asteapta un caracter in AL de la tastatura
Z=1 daca nu s-a tastat caracter si se asteapta
Z=0 daca s-a apasat o tasta caracterul se gaseste in AL
AL=0 indica receptia unui caracter functional a carui cod se citeste prin urmatoarea c-da
Daca DL#FFH se afiseaza caracterul din DL
07H Citire directa in AL de la tastatura fara ecou (nu verifica CTR/BRK)
09H Afisare la consola sirul de caractere terminat cu $ indicat in registrul DX
0AH Citire de la tastatura un sir de caractere cu ecou terminat cu ENTER, la adresa din DX.
DX | |||
NA |
NR |
Text |
NA - numar de caractere maxim asteptate (daca se introduc mai multe de NA-1 se ignora)
NR - numar de caractere receptionate pana la ENTER
2AH Obtinerea datei curente AL - ziua in saptamana (0 duminica, 1 luni,)
CX - anul ( 1980-2098)
DH - luna (112)
DL - ziua (1.31)
2BH Setare data in calculator CX- anul, DH - luna, DL - ziua
2CH Obtinere ora curenta CH - ora (0..23), CL - minutul, DH secunda, DL - Sutime secunda
2DH Setare ora in calculator CH - ora, CL - minutul, DH secunda, DL - Sutime secunda
In aplicatiile actuale ( editoare de texte, programe de baze de date, programe de grafica,..) se folosesc foarte des caractere functionale( Extended ASCII- Coded Keyboard Data) , care sunt filtrate de catre functiile DOS de citire si afisare sir de carctere (09H, 0AH, 01H, 02H). Codurile acestor caractere se suprapun peste codurile caracterelor ASCII uzuale. Din aceasta categorie fac parte tastele functionale F1..F12, sagetile, PageUp, PageDown,End, Home, Del, Shift +Fi, ESC si caracterele insotite de CTRL (Controle) si ALT (Alternate). Numarul acestor coduri este foarte mare si pentru citirea lor in registrul AL fara a fi filtrate se utilizeaza functia 06H din DOS si se seteaza DL=0FFH. La receptia unui caracter functional AL=00 si trebuie apelata inca odata functia DOS (INT 21H) cand se primeste codul caracterului ce se va interpreta prin program ca un caracter functional. Pentru functia 06H nu se asteapta apasarea unei taste. Prin program trebuie testat daca s-a apasat o tasta lucru indicat prin Z=0. Cat timp Z=1 se asteapta prin ciclu de apel.
Prezentam mai jos o procedura care poate citi de la tastatura si caractere functionale. Pentru caractere functionale se pozitioneaza C=1, pentru a putea sa fie tratat caracterul ca functional in programul care a apelat procedura
ReadF PROC far
C1: MOV AH,6 ; cod functie citire afisare fara ecou
MOV DL,0FFH ; functie citire tasta in AL
INT 21H ; apel DOS
JZ C1 ; Z=1 ciclu de asteptare nu s-a apasat tasta
OR AL,AL ; test daca AL =00H si C=0
JNZ C2 ; nu este caracter functional
INT 21H ; apel 2 care da codul caracterului in AL
STC ; pozitionare C=1 pentru a indica programului caracter functional
C2: RET
CARF ENDP
CALL ReadF ; chemare procedura citeste un caracter (inclusiv functional)
JC Funct ; eticheta secventa analiza caracter functional
MOV Text1[SI],AL ; caracter ASCII uzual memorat intr-o zona de text
; continuare program
Macroinstructiunile sunt secvente de instructiuni definite ca macheta pe baza unor parametrii formali prin directiva MACRO. Utilizarea unei macroinstructiuni se face ca si pentru o instructiune cablata. Macroinstructiunile permit o programare modulara simpla prin:
Extinderea setului de instructiuni recunoscute de Asamblor
Simplificarea scrierii secventelor de cod utilizate repetat, prin inlocuirea lor cu macroinstructiuni.
Simplificarea apelului functiilor sistem prin definirea lor ca macroinstructiuni
Apelul simplu al subprogramelor, prin inlocuirea secventelor de apel si pregatirea parametrilor cu macroinstructiuni.
Definirea unei macroinstructiuni se face ca pentru un subprogram din limbajele de programare de nivel inalt specificand:
numele macroinstructiunii prin eticheta directivei MACRO
lista de parametrii formali utilizati
secventa de instructiuni care definesc algoritmul pe baza parametrilor formali, ai variabilelor si constantelor din program
sfarsitul unei macroinstructiuni se specifica prin directiva ENDM
etichetele din secventa de instructiuni cu directiva LOCAL
nume_macro MACRO param1,param2 ; lista de parametrii formali
LOCAL etich1,etich2, ; lista de etichete locale
..
; Secventa de program care utilizeaza parametrii formali
..
ENDM ; sfarsit secventa de program de definitie
Utilizarea unei macroinstructiuni definite se face ca pentru o instructiune, specificand parametrii efectivi care vor inlocui in secventa de program generata parametrii formali. Definirea macroinstructiunii trebuie facuta inainte de utilizare, in cadrul programului.
Nume_macro par1,par2,.
Exemplul 1. Afisare sir de caractere prin apel functie DOS definita ca macroinstructiune.
AFIS MACRO mesaj ; definire macroinstructiune AFIS
MOV DX,offset mesaj ; adresa text de afisat terminat cu '$'
MOV AH,9 ; cod functie DOS
INT 21H ; apel functia de afisare
ENDM ; sfarsit secventa de definitie
Utilizare macroinstructiune AFIS in program pentru afisare text :
AFIS text1 ; afisare sir de la adresa text1
In program unde s-a utilizat macroinstructiune se va genera secventa:
MOV DX,offset text1
MOV AH,9
INT 21H
Exemplul 2. Medie aritmetica a doua numere definita ca macroinstructiune:
MED MACRO X,Y,Z ; definire medie Z= (X+Y)/2
MOV AX,X
ADD AX ,Y ; AX=X+Y
SHR AX,1 ;AX=(X+Y)/2
MOV Z,AX ; Z=AX memorare rezultat
ENDM
Media C intre doua numere A si B se va calcula prin:
MED A,B,C
Exemplul 3. Conversia zecimal-binara a unui numar definita ca macroinstructiune, care apeleaza procedura de conversie CZB definita anterior.
C_ZB MACRO zec,n,bin ; conversie nr. zecimal de la adresa zec in binar la adresa bin
MOV BX,offset zec ; adresa numar zecimal ASCII
MOV CX,n ; numar de cifre zecimale
CALL CZB ; apel procedura conversiecare returneaza numar binar in AX
MOV bin,AX ; memorare numar binar la adresa bin
ENDM
Pentru conversia unui numar Xzec din zecimal in binar la adresa X se va scrie:
C_ZB Xzec,5,X ; este similara unei instructiuni cablate
Etichetele locale din MACRO se definesc prin directiva LOCAL.
Daca avem etichete in definirea MACRO acestea nu pot fi folosite direct, deoarece secventa de program se genereaza de mai multe ori si etichetele se duplica. Etichetele definite cu directiva LOCAL vor fi modificate la fiecare utilizare a MACRO, folosind elemente de timp din momentul generarii si vor fi unice in program.
MAC1 MACRO X,Y
LOCAL E1,E2 ; definire etichete locale
CMP X,Y
JZ E2 ; iesire din secventa de calcul
E1: MOV AX,X
DEC word ptr X
JNZ E1 ; salt la eticheta locala care va fi modificata la compilare
E2 LABEL near ; eticheta dupa ultima instructiune din MACRO
ENDM
Macroinstructiunile se folosesc pentru algoritmi care se realizeaza prin secvente scurte de cateva instructiuni. La fiecare utilizare se genereaza secventa de program din definirea MACRO. Nu se vor defini macroinstructiuni pentru algoritmi care se realizeaza cu un numar mai mare de instructiuni (conversii, inmultire de matrici, etc.).
Pentru cazul unei aplicatii cu algoritmi mai complecsi se va folosi programarea modulara:
Se vor analiza functiile ce trebuie realizate, pentru care se vor definii proceduri.
Se va defini fiecare procedura pentru a specifica algoritmul folosit si se vor stabili conventiile de transmitere a parametrilor spre procedura.
Se va defini o macroinstructiune pentru fiecare procedura, care va defini secventa ce pregateste parametrii, apeleaza procedura si memoreaza rezultatele.
Se va scrie un program principal care va utiliza macroinstructiuni pentru a realiza functiile dorite. Apelul subprogramelor devine transparent la acest nivel si programarea se simplifica
Exemplul 4. Program complex care utilizeaza proceduri si macroinstructiuni care pregatesc parametrii pentru apelul procedurilor. In cadrul programului se realizeaza functiile:
Se citesc 10 numere zecimale de la tastatura de 15 cifre ( numarul de cifre in octet buf+1)
Se converteste in binar pe 2 octeti fiecare numar citit si se memoreaza intr-un tabel
La conversia zecimal binara se verifica fiecare caracter introdus daca este cifra( 09)
Se afiseaza tabelul nesortat
Se sorteaza tabelul in ordine crescatoare
Se afiseaza tabelul sortat convertind in zecimal fiecare numar binar in buffer
Programul are urmatoarea structura:
Definire date intr-un segment de date
Definire macroinstructiuni ce pregatesc parametrii si apeleaza subprogramele definite sau functii DOS si se folosesc in programul principal sau proceduri.
Definire subprograme necesare, care se apeleaza prin macroinstructiunile definite
Programul principal care utilizeaza numai macroinstructiuni prin care se apeleaza procedurile.
In cadrul programului s-au definit procedurile:
CBZ si PRINTR realizeaza conversie binar zecimala si afiseaza numarul zecimal
DECTOBIN conversie zecimal binara , verificare ca avem numai cifre si + sau - .
SELSORT sortare tabel de N numere binare pe 2 octeti
Macroinstructiunile sunt definite la inceputul programului si sunt folosite in programul principal si in proceduri:
PRINT afisare text terminat cu '$' (apelare functie 09H dinDOS).
GET citire sir de caractere de la tastatura (functia 0AH din DOS) si trecere la rand nou.
PUTC Afisare un caracter pe monitor din DL (functia 02H din DOS)
CONVBIN conversie numar zecimal( lung. pe primul octet din sir) in binar, care apeleaza procedura DECTOBIN si ii transmite adresa numarului zecimal in SI si lungimea in CX.
SORT sortare tabel de n numere binare pe 2 octeti
SCRIE afisare tabel de n numere binare pe 2 octeti dupa ce sunt convertite in zecimal
; Program care utilizeaza macroinstructii pentru chemare subprograme
; - Citire un sir de numere ; Conversie zecimal binar ; Memorare in tabel
; - Sortare tabel ; Conversie binar zecimala ; Afisare elemente tabel sortat
dosseg
.model small
.data
buf db 7,8 dup(?) ; buffer primire 7 cifre
table dw 10 dup(?) ; tabel numere binare receptionate
mes db 'Introduceti 10 nr. intregi cite unul pe linie',13,10,'$'
smsg db 'Nr. sortate sunt:',13,10,'$'
bufs db 10 dup (20h),13,10,'$'
inval db 'Nr. invalid',13,10,'$' ; mesaj pentru numar invalid (litera semn,)
zece dw 10 ;
cr db 13,10,'$ ; cr si lf
.stack 256 ; segment stiva
.code ; segment de cod program
PRINT MACRO msg ; afisare mesaj terminat cu
mov dx,offset msg
mov ah,09h
int 21h
endm
GET MACRO buff ; citire sir
mov dx,offset buff ; adr. buf. receptie
mov ah,10
int 21h
print cr ; rind nou
endm
PUTC MACRO ; afisare caracter din DL
push ax
mov ah,2
int 21h
pop ax
endm
CONVBIN MACRO buff ; conversie zecimal binara sir
mov si,offset buff
inc si
mov cl,[si] ; contor nr. cifre
inc si ; prima cifra
xor ch,ch
call dectobin ; chemare subprogram
endm
SORT MACRO tab,cnt ; sortare tabel de n elem
mov si,offset tab ; adresa tabel intregi
mov cx,cnt ; nr elemente tabel
call selsort ; subpr. sortare tabel
endm
SCRIE MACRO tab,cnt ; afisare tabel n elemente intregi
Local s1
mov cx,cnt ; nr. elemente
mov di,0 ; index in tabel
s1: mov ax,tab[di] ; T(I)=>AX
mov bx,offset bufs ; adresa bufer conversie
mov si,7
call cbz ; subpr. conv. bin-zec si afisare
add di,2
loop s1
endm
; include bindec.inc ; se pot copia subprogramele de conversie bin-zec si zec-bin
CBZ PROC near
; Afiseaza un numar binar din ax dupa ce il
; converteste in zecimal cu + sau - in fata
or ax,ax ; pozitionare indicatori
jns pos ; numar pozitiv
neg ax ; val absoluta
mov dl,'-'
putc ; afisare un caracter din dl
pos: call printr ; procedura recursiva conv bin-zec
print cr ; rind nou
ret
CBZ ENDP
PRINTR PROC near
; In AX nr pozitiv binar, resturile MOD 10
; afisate in ordinea inversa obtinerii
cwd ; pregatire impartire DX=0
idiv zece ; N/10 restul in dx, citul in AX
or ax,ax ; cit=0 ?
jz gata1 ; da
push dx ; memorare rest
call printr ; apel recursiv
pop dx ; reface restul
gata1: or dl,30h ; cifra ASCII
PUTC ; afisare cifra din dl
ret
PRINTR ENDP
SELSORT PROC near
; Procedura sortare tabel elemente binare
; SI - adresa primul element; CX - nr. de elemente
mov bx,si
c1: dec cx
jz gata
push cx
mov si,0
mov dh,0
c2: mov ax,[bx+si]
cmp ax,[bx+si+2]
jl c3
xchg ax,[bx+si+2]
mov [bx+si],ax
inc dh
c3: add si,2
loop c2
or dh,dh
pop cx
jz gata
jmp c1
gata: ret
SELSORT ENDP
SELS PROC near ; Subprogram sortare prin selectie
; SI - adresa primul element ; CX - nr elemente
cld ; directie stg-dr
dec cx
nextp: push cx ; n-1 cicuri
lodsw ; primul element [SI]
mov di,si ; cautare in sir nesortat
nexte: scasw; ; compara ax cu[DI]
jle ismin ; ax<=[DI]
xchg ax,[DI-2] ; noul minim
ismin: loop nexte
mov [si-2],ax ; memorare minim
pop cx
loop nextp ; cauta urmatorul minim
ret
SELS ENDP
DECTOBIN PROC near
; Procedura conversie zec-binara cu semn
; SI - adresa prima cifra
; CX - numar cifre
dec cx ; ciclu semn
cld ; df=0
lodsb ; primul caracter
cmp al,'-' ; semn minus
stc ; cf=1
jz minus
cmp al,'+' ; semn plus
jz plus
inc cx ; fara semn, corectie contoare
dec si
plus: clc ; cf=0
minus: pushf ; salvare indicatori
xor bh,bh
xor ax,ax ; N=0
cwd
next: mov bl,[si] ; o cifra zecimala
cmp bl,'0' ; verificare numeric
jl nodigit ;err.
cmp bl,'9'
jg nodigit ;nu-i cifra
sub bl,30h
mul zece ; N=N*10
add ax,bx ; N=N*10+cifra
inc si
loop next ; urmatoarea cifra
popf ; reface indicatori
jnc pozitiv
neg ax ; numar negativ
clc
pozitiv: ret
nodigit: print inval ; mesaj numar invalid
popf
xor ax,ax
stc ; setare CF=1 nr.invalid
ret
dectobin endp
; Program principal
pp: mov ax,@data ;initializare reg segment
mov ds,ax
mov es,ax
print mes ; mesaj dialog
mov cx,10 ; numere de introdus
mov di,0 ; prima pozitie in tabel
cit label near
push cx
push di
get buf ; asteapta un numar
convbin buf ; AX nr. binar rezultat
pop di
pop cx
jc cont ;daca c=1 atunci nr citit este invalid
mov table[di],ax ; memorare numar binar in tabel
inc di
inc di
cont: adc cx,0 ; neglijare numar eronat
loop cit
scrie table,10 ; afis. tabel nesortat
sort table,10 ; sortare tabel
scrie table,10 ; afisare tabel sortat
mov ah,4ch ; stop
int 21h
end pp
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2865
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved