Creeaza.com - informatii profesionale despre


Evidentiem nevoile sociale din educatie - Referate profesionale unice
Acasa » scoala » informatica » calculatoare
Exploatarea fisierelor pe disc prin FCB

Exploatarea fisierelor pe disc prin FCB


Exploatarea fisierelor pe disc prin FCB

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:

  • Utilizare FCB pentru comunicare cu sistemul si se citesc/scriu inregistrari de lungime data. Adresarea se face la nivel de inregistrare.
  • Utilizare indicator logic (handle), care face referire la un FCB din sistem si permite adresarea fisierului la nivel de octet relativ la inceputul fisierului.

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.

  • Scrieti un fisier cu un editor de texte (NotePad, F4 din Windows Commander) si cititi-l cu un program, care foloseste macroinstructiunilele definite.
  • Modificati continutul textului din fisier si afisati-l cu un editor.
  • Modificati lungimea inregistrarilor FCB+14 si afisati fisierul

; 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

Transmiterea parametrilor printr-o zona de memorie

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

6.5. Definire si utilizare structuri de date

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 ' Timisoara ' ; adresa (implicit Timisoara)

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

Transmisia parametrilor spre subprograme prin stiva

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:

  • Parametrii subprogramului transmisi de programul principal
  • Adresa de revenire in programul principal (dupa CALL) - valoare lui IP si CS
  • Registrele salvate de procedura
  • Variabilele locale ale procedurii
  • Stiva procedurii, care poate si ea sa cheme subprograme

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.

  • Parametrii de intrare vor fi adresa tabloului (atx) si numarul de elemente (nv)
  • Parametrii de iesire sunt media elementelor pozitive MP si negative MN
  • Variabile locale suma si numarul elementelor pozitive si negative(S1,K1,S2,K2)
  • Se vor salva in stiva registrele BP, BX, FLAGS si CX.

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

K2

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;

  • Se salveaza registrele si se memoreaza SP in BP, care va deveni referinta pentru adresarea elementelor din stiva.
  • Se aloca spatiu in stiva pentru cele 4 variabile locale (S1,K1,S2,K2) prin decrementarea cu 4*2=8 a lui SP
  • Registrul SP va adresa in continuare stiva procedurii
  • Se defineste structura Z si adresele variabilelor locale fata de BP
  • Se initializeaza variabilele locale
  • Se calculeaza printr-un ciclu suma elementelor pozitiveS1, a celor negative S2 si numarul lor k1 respectiv k2
  • Se calculeaza media elementelor pozitive peste adresa tablou(ATX) si negative peste N
  • Se elibereaza spatiul ocupat de variabilele locale prin incrementarea lui SP cu 8
  • Se refac registrele salvate
  • Se revine in programul principal cu RET care incarca din stiva IP si CS

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 = K2 + 1

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


creeaza logo.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.