Documente Academic
Documente Profesional
Documente Cultură
de asamblare
Funcţii DOS
Sistemul de operare DOS (Disk Operating System) pune la dispoziţia aplicaţiilor un set de rutine
(funcţii) pentru gestionarea resurselor sistemului.
Utilizarea acestor rutine uşurează munca programatorului permiţându-i o viziune de nivel înalt
asupra aplicaţiei dezvoltate.
Mecanismul prin care o aplicaţie poate utiliza un servicu pus la dispoziţie de sistemul de operare
este cel al întreruperilor software.
Funcţiile DOS pot fi apelate prin INT 21H atât din limbaj d e asamblare cât şi din limbaje de nivel
înalt, aşa cum este C.
Pentru apelul funcţiilor DOS este rezervată întreruperea 21H.
Numărul funcţiei DOS apelate este transmis ca parametru în registrul AH. Parametrii de intrare şi
ieşire ai funcţiilor DOS sunt transmişi prin registre.
Funcţii DOS
Pentru a apela o funcţie DOS, programul trebuie să realizeze următoarele acţiuni:
• încarcă în registrele corespunzătoare funcţiei parametrii de intrare;
• încarcă în registrul AL codul subfuncţiei (dacă este necesar);
• încarcă în registrul AH codul funcţiei;
• lansează instrucţiunea INT 21H.
La terminarea procedurii, programul trebuie să preia eventualii parametrii de ieşire din
registrele corespunzătoare funcţiei.
Lista principalelor funcţii DOS
Funcţie DOS Denumire Funcţie DOS Denumire
Acest exemplu prezintă un program care primeşte de la tastatură un şir de cuvinte pe care le
afişează pe ecran.
Toate cuvintele vor avea iniţiala majusculă, indiferent de modul în care a fost tastată (majusculă
sau minusculă).
Terminarea programului se va face la apăsarea tastei ESC.
Programul necesită prelucrarea fiecărui caracter primit de la tastatură înainte de a fi afişat pe
ecran.
Soluţia constă în preluarea caracterului cu funcţia DOS 8 (character input without echo),
analizarea şi eventuala prelucrare a acestuia şi, ulterior, afişarea caracterului cu funcţia DOS 2
(character output).
Codul sursă
code SEGMENT
assume cs:code, ds:code cmp al, ’z’
tasta_ESC equ 27 jg scrie_al ; sau mai mare decat ’z’ (in
start:
;afara domeniului minusculelor)
mov ax, cs
mov ds, ax sub al, 20H ; transformă minuscula in
mov bl, 1 ; indicator: BL=1 - converteşte caracterul in majusculă majusculă
; BL=0 - lasă caracterul neschimbat
jmp scrie_al
caracter_in:
mov ah, 8 schimb_maj:
int 21h ; apel funcţie DOS 8 (character input without echo) mov bl, 1
; returnează in AL codul tastei apăsate scrie_al: ; afişează caracterul
cmp al, tasta_ESC
jz final ; s-a tastat ESC mov ah, 2
cmp al, ’ ’ mov dl, al
jz schimb_maj ; s-a tastat ’ ’ (spaţiu=delimitator de cuvinte) int 21h
; următorul caracter este transformat in majusculă
jmp caracter_in
cmp bl, 0 ;
final:
jz scrie_al ; caracterul se lasă neschimbat
mov bl, 0 ; este o iniţială... mov ah, 4ch
cmp al, ’a’ int 21h
jl scrie_al ; cu cod ASCII mai mic decat ’a’... code ends
end start
Exemplul 3: Preluare dată sistem
Acest exemplu prezintă un program care afişează pe ecran data sistemului sub forma:
AALuna
unde:
AA este anul (ultimele două cifre);
Luna este denumirea lunii în limba română.
Denumirea în limba română a lunilor anului a fost specificată sub forma unei definiţii de date de tip byte. Şirul a fost conceput astfel
încât să se aloce fiecărei luni acelaşi număr de caractere (11).
Adresa care trebuie transmisă ca parametru funcţiei DOS 9 este calculată după formula:
Denumire luna + 11 × (luna curentă - 1).
Funcţia DOS 2AH (get system date) se apelează chiar la începutul programului.
Restul programului se ocupă cu prelucrarea şi afişarea parametrilor returnaţi de această funcţie. Anul este preluat în registrul CX şi
este prelucrat pentru a se obţine cele două caractere asociate cifrelor zecilor şi unităţilor. Apoi este afişat un caracter spaţiu. Pe baza
numărului lunii, returnat în registrul DH, se calculează adresa care trebuie transmisă funcţiei DOS 9 (output character string).
Cod sursa
code SEGMENT
mov dl, bh
assume cs:code, ds:code
add dl, ’0’
Denumire_luna db ’Ianuarie$ Februarie$ Martie$ Aprilie$ ’
mov ah, 2
db ’Mai$ Iunie$ Iulie$ August$ ’
int 21h ; scrie cifra unităţilor din reprezentarea anului
db ’Septembrie$ Octombrie$ Noiembrie$ Decembrie$ ’
mov dl, ’ ’
start:
mov ah, 2
mov ax, cs
int 21h ; scrie ’ ’
mov ds, ax
; DH=luna (parametru de ieşire din funcţia DOS 2AH)
mov ah, 2Ah ; preia data sistem, funcţie DOS 2AH
dec dh ; DH=index in tabelul Denumire_luna
int 21h
mov al, 11 ; numărul de octeti alocaţi in tabelul Denumire_luna
; preluare parametrii, prelucrare şi afişare
; pentru o intrare (o denumire de lună)
sub cx, 2000 ; CX=anul (parametru de ieşire din funcţia DOS 2AH)
mul dh ; AL x DH = (AH:AL), index sir
mov ah, 0
mov dx, offset Denumire_luna
mov al, cl
add dx, ax ; DX=pointer la denumirea lunii curente, şir terminat
mov bl, 10
; cu ’$’
div bl ; (AH:AX) / BL => AL=cat, AH = rest
mov ah, 9 ; afişează şir cu funcţia DOS 9
; AL=cifra zecilor, AH=cifra unităţilor (AN)
int 21h
mov bx, ax
mov ah, 4ch
mov dl, bl
int 21h
add dl, ’0’
code ends
mov ah, 2
end start
int 21h ; scrie cifra zecilor din reprezentarea anului