Sistemul de operare DOS asigura gestiunea si securitatea informatiilor pe disc ca fisiere (inclusiv sistem). Pentru crearea, stergerea, scrierea, citirea si actualizarea fisierelor exista functii DOS care se apeleaza din program prin INT 21H. Parametrii necesari se transmit prin registre sau printr-o zona de memorie pentru dialog atasata fisierului numita FCB (File Control Bloc). Exista 2 modalitati de exploatare a fisierelor, care au concepte diferite si functii specifice, dar aceeasi organizare fizica:
Exploatarea cu FCB presupune declararea unui FCB pentru fiecare fisier utilizat.
Structura FCB cuprinde pe 36 octeti informatii furnizate de program si informatii returnate de sistem dupa executarea unei operatii (functii):
DS:DX
0 |
1 |
9 |
12 |
14 |
16 |
20 |
22 |
24 |
32 |
33 |
Cod disc |
Nume fisier |
Ext |
Nr.bloc |
Lung inreg |
Lung fisier |
Data |
Timp |
rez |
Nr.inreg in bloc |
Nr. inreg. acc direct |
Pentru FCB s-ar putea declara o structura de date de forma:
FCB SRUC
Drive db 0 ; cod disc utilizat
Fnume db 8 dup (20h) ; nume fisier
Fext db 3 dup (20h) ; extensie nume
Lrec dw 80 ; lungime inregistrare
Lfis dd 0 ; lungime fisier
Fdate dw 0 ; data de creare
Ftime dw 0 ; ora de creare
Frez db 8 dup(0) ; rezervat
Fnrc db 0 ; numar articol curent in bloc
Frand dd 0 ; numar inregistrare in acces direct (random)
FCB ENDS
Functii DOS pentru exploatarea fisierelor cu FCB
Orice citire de informatie de pe disc in acces direct necesita o pozitionare pe disc pentru ca FAT este pastrata in memorie. Cand se specifica adresa unui sector ce trebuie citit din fisier (relativ la inceputul fisierului), din FAT se stabileste rapid numarul clusterului care il contine si rezulta numarul sectorului fizic in care se gaseste.
Inaintea apelarii unei functii DOS se va incarca in DS:DX adresa FCB fisier utilizat.
Dupa executarea unei functii DOS A=00 indica operatie reusita.
0EH - Selectare disc a carei adresa este in DL (0-A,1-B, 2-C,..).
Se citeste directorul radacina si FAT in memoria RAM.
0FH - Deschide fisier existent in directorul curent cu numele din FCB dat de DX.
10H - Inchide fisier indicat de FCB-ul indicat de DX.
11H - Cautare primul fisier cu numele generic dat in FCB (ex.*.asm).
12H - Cautare urmatorul fisier cu nume generic indicat in FCB.
13H - Sterge fisier indicat in FCB, chiar si cu nume generic
14H - Citeste secvential o inregistrare din fisierul indicat in FCB, de lungime precizata in octet 14 din FCB. Adresa bufer este zona curenta DTA (Disc Transfer Area). Octetul 32 din FCB (nr.inreg.in bloc) se pune initial pe zero si ulterior se
incrementeaza automat dupa fiecare citire. Se trece automat de la un bloc la altul.
15H - Scrie secvential o inregistrare din DTA in fisier de lungime data de FCB+14 . Extinderea fisierului se face automat daca un cluster s-a umplut.
16H - Deschidere fisier nou cu numele dat in FCB. Scrie o intrare in directorul curent.
Daca nu exista spatiu AL=0FFH.
17H - Redenumeste fisier din FCB cu numele din octetii FCB +17H
19H - Obtine cod disc curent in AL
1AH - Stabileste adresa DTA (Disc Transfer Area) zona tampon curenta data in DX.
La initializare sistem adresa DTA=80H.
21H - Citire in acces direct de pe fisier, de pe sectorul dat in FCB+33.
22H - Scriere in acces direct din DTA cu specificare adresa sector disc in FCB+33.
Scrierea pe ultimul sector din fisier se face pentru rezervare spatiu.
Exemplu de program pentru citire scriere in fisier utilizand FCB
Pentru a simplifica scrierea programului se vor folosi macroinstructiuni pentru apelul functiilor DOS.
; Utilizare fisiere prin fcb DS:DX contine adresa FCB
; Citire text tastatura
; Scrire text pe fisier
; Citire de pe fisier si afisare
; Se utilizeaza macro definiti si control erori
; ** ** ** ** ** ** ****
.model small
.stack 100
.data
b1 db 10,13,10,13 ; CR si LF
buf db 20,80 dup(20h),10,13,'$' ; Buffer I/O
FIS db 0,'fisier txt',0,0,0,20 ; FCB fisier
db 26 dup (?)
er db ' Operatie eronata',10,13,'$'
start db ' Dialog:',10,13,'$'
LFCR db 10,13,'$'
.code
eroare macro coder ; Afisare eroare daca AL # 0
local gata
or al,al ; test eroare
jz gata ; operatie corecta
mov ah,coder
mov er,ah
afis er ; cod eroare pt fiecare macro
gata label near
endm
afis macro msg ; afisare mesaj pe ecran
mov dx,offset lfcr ; rand nou
mov ah,9
int 21h
mov dx,offset msg
mov ah,09h
int 21h
endm
cit macro buf1 ; citire sir de la tastatura
mov dx,offset buf1 ; adr. bufer receptie
mov ah,10
int 21h
endm
open macro fcb1 ; deschidere de fisier existent
mov word ptr FCB1+14,20 ; lungime inregistrare (RCS)
mov dx,offset FCB1 ; adresa FCB
mov ah,0fh ; functie DOS deschidere fisier existent
int 21h
mov FCB1+32,0 ; initializare nr. inregistrare in bloc = 0
eroare 31h ; cod eroare = 1
endm
close macro fcb1 ; inchidere fisier
mov dx,offset FCB1 ; adresa FCB
mov ah,10h
int 21h
eroare 32h ; cod eroare = 2
endm
create macro fcb1 ; creare fisier nou
mov dx,offset FCB1 ; adresa FCB
mov ah,16h ; cod functie DOS
int 21
eroare 33h ; cod eroare = 3
endm
writef macro fcb1,buf ; scrie in fisier o inreg. din zona buf
mov ah,1ah ; functie DOS setare zona DTA(disc transfer area)
mov dx,offset buf+2 ; specificare zona tampon utilizata
int 21h
mov dx,offset FCB1 ; adresa FCB
mov ah,15h ; functie DOS scriere secventiala pe disc
int 21h ; din zona DTA de lungime RCS din FCB+14
eroare 34h ; cod eroare = 4
endm
readf macro fcb1 ; citire inregistrare de pe disc in zona DTA
mov ah,1ah ; setare DTA
mov dx,offset buf+2
int 21h
mov dx,offset FCB1 ; adresa FCB
mov ah,14h
int 21h
endm
; Program principal
pp: mov ax,@data ;
mov ds,ax
mov es,ax
afis buf
open fis ; deschidere fi?ier existent
mov fis+14,30 ;lungime inregistrare RCS
; create fis ; se creaz? la prima rulare
mov fis+32,0 ;nr inreg.=0
mov cx,5 ;contor nr inregistrari
; Citire text de la consol? ?i scriere in fisier
c5: afis start ;afisare dialog
cit buf ;introducere rand text
writef fis,buf ;scriere pe disc
afis buf ;afisare pe disc
loop c5
close fis ;inchidere fisier
; Secventa de citire din fi?ier
mov cx,5 ;contor inregistrari
open fis
mov fis+32,0 ;adresare imediata
mov fis+14,30 ;lungime inreg. RCS
c6: readf fis ;citire inreg. din fisier
afis buf ;afisare inregistrare
loop c6
c1 : nop
mov ah,4ch
int 21h
end pp
In cele mai multe cazuri trebuie transmisi spre subprograme un numar mare de parametrii si numai pot fi folosite registrele care sunt intr-un numar foarte mic. Atunci se foloseste transmisia parametrilor printr-o zona de memorie. Metoda este mai putin performanta decat transmiterea parametrilor prin tabela de adrese, deoarece toti parametrii trebuie grupati in zona de memorie ( nu pot fi dispersati in program).
Zona de memorie pentru parametrii se aloca in programul principal si trebuie sa fie un spatiu continuu in care sa se memoreze toti parametrii. Structura zonei este cea ceruta la definirea procedurii care implementeaza algoritmul de calcul. Daca se utilizeaza mai multe tablouri trebuie stabilite dimensiuni maxime pentru fiecare tablou. Daca se utilizeaza un singur tablou se plaseaza ultimul dintre parametrii si poate fi de dimensiune variabila. La chemarea subprogramului adresa zonei de parametrii, din programul principal se va incarca intr-un registru (ex.BX). In subprogram se descrie structura zonei de memorie ce contine parametrii, care vor fi apelati indirect prin registru (BX).
Pentru exemplificare se considera un subprogram care calculeaza media elementelor unui tablou de N numere intregi cu semn. Parametrii transmisi subprogramului vor fi:
Media elementelor calculata ca parametru de iesire din procedura (S)
Numarul de elemente ale tabloului (N)
Tabloul de X de N elemente pentru care se calculeaza media
BX |
X | |||||
Zona memorie |
S |
N |
X(1) |
X(2) |
X(3) | |
(parametrii) |
In programul prezentat se considera tabloul X cu 5 elemente, dar el poate avea oricate, deoarece el este ultimul parametru. La chemarea procedurii in se incarca in BX adresa zonei de memorie care contine parametrii. In procedura se descrie structura zonei de parametrii prin adresa lor relativa in zona cu directiva EQU. Mnemonicele S1, N1, X1 vor fi folosite in procedura pentru referirea indirecta prin BX a parametrilor. Adresarea lui S pentru initializare se face prin:
mov word ptr [bx+s1],0 ; s = 0
Trebuie folosit word ptr fiindca nu se utilizeaza registru si trebuie precizata lungimea operanzilor folositi. Adresa BX + s1 este echivalenta cu BX +0. Pentru a referi un element de tablou direct in programul principal se foloseste si indexarea cu SI:
c1: mov ax,[bx+x1+si] ; x[i]
; -------- ----- ------ -----Lab7_0
; Calcul medie elemente tablou X
; Parametrii spre subpr. transmisi prin zona de memorie
DOSSEG
.MODEL SMALL
.STACK 256
.286C
.DATA
s dw 0 ; s = media
n dw 5 ; nr. elem. din tabloul x
x dw 1,-92,83,-424,53
.CODE
st1: mov ax,@DATA
mov ds,ax
mov bx,offset s ; adresa zona parametrii
call sp1 ; chemare subprogram
int 3 ; valoarea medie s-a memorat in S de catre procedura
; Procedura calcul medie elemente tablou
; Intrare: BX adresa zona parametri
sp1 PROC near
; Adrese in zona de parametrii
s1 equ 0 ; Suma rezultata
n1 equ 2 ; numar de elemente
x1 equ 4 ; Tabloul de elemente
pusha ; salvare registre
mov si,0 ; i = 1
mov word ptr [bx+s1],0 ; s = 0
mov cx,[bx+n1] ; numar elemente
c1: mov ax,[bx+x1+si] ; x[i]
add [bx+s1],ax ; s=s+x[i]
add si,2 ; i=i+1
loop c1
mov ax,[bx+s1] ; AX = suma elemente
cwd ;extindere pentru impartire
idiv word ptr [bx+n1] ; s = s/n media
mov [bx+s1],ax ; memorare medie
popa ; refacere registre
ret
sp1 endp
end st1
Definirea structurii unei zone de memorie se poate face cu directiva STRUC, care creeaza o macheta si ataseaza fiecarei etichete o adresa relativa la inceputul zonei. Definirea echivalenta pentru zona de parametrii din procedura anterioara se poate face:
Zona STRUC ; definire macheta pentru structura zonei
S1 DW ?
N1 DW ?
X1 DW 50 dup (?) ; definire tablou virtual pentru care nu se aloca spatiu
ENDS ; sfarsit definire structura
Pentru variabilele din structura nu se rezerva spatiu de memorie. Directiva DW este utilizata numai pentru a preciza lungimile operanzilor si a calcula adresele relative atasate etichetelor. Folosind acest mod de definire pentru o structura nu trebuie sa calculam pozitiile parametrilor in zona. Daca adaugam noi parametrii sau le modificam lungimea, nu trebuie sa ne preocupe ce adrese se genereaza, ca in cazul utilizarii directivei EQU.
O structura de date defineste un tip ca o colectie de una sau mai multe variabile, de tipuri diferite, grupate sub un singur nume pentru utilizare.
nume_struc STRUC
-------- ; definitie variabile formale
-------- ; care compun structura
nume_struc ENDS
Variabilele dintr-o structura pot fi declarate cu sau fara valori initiale. Valorile initiale sunt cele implicite care servesc la generarea unei zone cu acea structura.
Putem defini tipul compus data pe 4 octeti format din zi, luna, an;
date STRUC ; definire structura data
zi db 0 ; ziua
luna db 0 ; luna
anul dw 0 ; anul
date ENDS
Putem defini o variabila structurata de tip date si cu valori ale campurilor:
D1 date <15,2,1978> ; 15 februarie 1978
Vom declara structura STUDENT care contine date personale:
Student STRUC
Nume db 15 dup(20H) ; nume student
Adresa db '
Varsta db 18 ; varsta
Datan db 0,0,0 ; zi luna, an
Cods db 5 dup(0) ; cod student fac,sectie,an,grupa,nr
Student ENDS
Pentru a genera datele personale pentru un student vom scrie:
Radu <'Radu','Arad,25,15,9,75,'AC34F'> ; nume,adresa,varsta,datan,Cods
Valorile campurilor dintr-o structura pot fi referite in instructiunile programului:
MOV BX,D1.Anul ; se incarca 1978
MOV AL,Radu.Varsta ; se incarca 25
MOV DX, offset Radu.Adresa ;se incarca ARAD
Toate limbajele de nivel inalt folosesc transmiterea parametrilor prin stiva, care este un caz particular de transmitere a parametrilor printr-o zona de memorie. In procedura trebuie definita structura datelor din stiva.
In stiva procedura va gasi mai multe tipuri de date:
Pentru orice procedura se incepe cu proiectarea structurii stivei si definirea ei printr-o structura de date, care se va folosi la adresarea parametrilor si variabilelor locale.
Vom concepe un program care utilizeaza o procedura de calcul a mediei numerelor pozitive si cele negative dintr-un tablou de numere intregi cu semn.
Cu aceste precizari structura stivei vazuta de procedura va fi:
SP |
-16 |
Stiva procedurii |
||
-14 |
S1 |
Suma pozitive |
||
-12 |
K1 |
Nr.elemente pozitive |
||
-10 |
S2 |
Suma negative |
||
-8 |
|
Nr.elemente negative |
||
-6 |
CX | |||
-4 |
FLAGS |
Registre salvate |
||
-2 |
BX | |||
BP |
+0 |
BP |
BP registru de baza adresare stiva |
|
+2 |
IP |
Adresa instructiunii urmatoare |
||
+4 |
CS |
Adresa segment |
||
+6 |
Adresa tablou |
MP |
Adresa tabel (medie pozitive) |
|
+8 |
N |
MN |
Nr elemente (medie negative) |
In programul principal s-au pus in stiva adresa tabloului X si N numarul de elemente. Se apeleaza subprogramul prin CALL far ptr care pune in stiva CS si IP. La revenirea din procedura se iau din stiva rezultatele MP(medie elemente pozitive) si MN (medie elemente negative).
In procedura se fac secventele de operatii;
Daca la revenirea din procedura mai raman parametrii reziduali in stiva se utilizeaza
RET N unde N este valoarea cu care se incrementeaza SP.
La revenirea in programul principal trebuie ca stiva sa fie goala adica sa aiba aceeasi pozitie ca la apelul procedurii.
; Transmiterea parametrilor prin stiva
; Subprogram calcul medie elemente pozitive
; si negative dintr-un tablou X
NAME MEDIA1
SSTIVA segment 'stack'
dw 100 dup (?)
stiva equ $ ; virful stivei
SSTIVA ends
;segment date
SDATA segment
MP dw 0 ; medie elemente - pozitive
MN dw 0 ; - negative
N dw 10 ; numar elemente tabel X
X dw 15,-12,-6,19,-7,17,18,0,-1,1
SDATA ends
;segment program principal
SPR segment
assume cs:SPR,ds:SDATA,ss:SSTIVA
st1: mov ax,SDATA ; initializare registre segment
mov ds,ax
mov ax,SSTIVA
mov ss,ax
mov sp,offset stiva
; Chemare subprogram
push N ; depune in stiva - nr.elemente
mov ax,offset X ; - adresa tablou
push ax
call far ptr medie ; chemare subprogram
; rezultatele s-au depus in stiva peste parametrii de intrare
pop MP ; extrage medie elem. - pozitive
pop MN ; - negative
int 3
; Subprogram calcul medie elemente pozitive
; si negative dintr-un tablou X
MEDIE proc far
; Pregatire stiva
push bp ; salvare reg BP
mov bp,sp ; reg bp baza in stiva
push bx ; salvare registre
pushf
push cx
sub sp,8 ; alocare spatiu variabile locale
; Corp procedura
; Structura stiva relativ la adr. de baza din BP
; Zona variabile locale
s1 equ -14 ; suma elemente pozitive
k1 equ -12 ; contor elemente pozitive
s2 equ -10 ; suma elemente negative
k2 equ -8 ; contor elemente negative
z struc ; descriere structura parametrii
bpv dw ? ; reg BP vechi
ipv dw ? ; reg IP - adresa de revenire
csv dw ? ; CS - adresa segment prog.principal
atx dw ? ; adresa tabel X
nv dw ? ; nr. de elemente tablou X
z ends
; initializare variabile
mov cx,word ptr [bp+nv] ; contor cicluri
mov bx,word ptr [bp+atx] ; BX adresa tablou X
mov ax,0 ; initializari
mov si,0 ; index adresare in X
mov [bp+s1],ax ; variabile locale
mov [bp+k1],ax
mov [bp+s2],ax
mov [bp+k2],ax
; Ciclu de calcul sume elemente pozitive si negative
c1: mov ax,word ptr [bx+si] ; element X(I)
or ax,ax ; pozitionare indicatori
jl minus ; X(I) < 0
add word ptr [bp+s1],ax ; S1 = S1 + X(I)
inc word ptr [bp+k1] ; K1 = K1 + 1
jmp short c2
minus: add word ptr [bp+s2],ax ; S2 = S2 + X(I)
inc word ptr [bp+k2] ; K2 =
c2: add si,2 ; urmatorul element din tabel
loop c1
; Secventa calcul medii
mov ax,word ptr[bp+s1]
cwd
idiv word ptr [bp+k1] ; S1 = S1/K1
mov [bp+6],ax ; memorare medie in stiva
mov ax,[bp+s2]
cwd
idiv word ptr [bp+k2] ; S2 = S2/K2
mov [bp+8],ax ; memorare medie negative
;secventa iesire
add sp,8 ; eliberare spatiu variabile locale
pop cx ; refacere registre salvate
popf
pop bx
pop bp
ret ; iesire din subprogram
MEDIE endp ; rezultatele MP si MN in stiva
SPR ends
end st1
; -------- ----- ------ --------
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |