Sunteți pe pagina 1din 5

Laborator 8

Laboratorul de fata va cere sa realizati citeva probleme simple, care


au ca motivatie sa va determine sa folositi apelurile sistem "find first"
(4Eh), "find next" (4Fh) precum si familiarizarea cu ceea ce se noteaza
PSP (abreviere de la "Program Segment Prefix"), cu ce contine PSP si
modul in care unele informatii din el pot fi folosite.
Sub sistemul de operare DOS puteti incarca si executa mai multe tipuri
de programe. Va sunt deja familiare fisierele cu extensia ".exe" si ".com".
Desigur, existenta unor extensii diferite pentru executabile marcheaza
oarecum diferentele dintre ele. Pentru laboratorul de astazi ne intereseaza
insa ce au ele in comun.
La lansarea unui program in executie (".exe" sau ".com"), inainte de
incarcarea lui in memorie, sistemul de operare alege o adresa de segment,
anume cea mai mica adresa de memorie disponibila, care va fi adresa de baza
a zonei de memorie la care se incarca programul. Incepind la aceasta adresa,
pe o lungime de 100h octeti, se afla informatii necesare programului, de
exemplu necesarul de memorie, adresa de segment a mediului DOS,
parametrii din linia de comanda (cea cu care a fost lansat programul in
executie), zona de transfer a discului, etc. Aceasta zona se numeste
Prefixul Segmentului Program, abreviat PSP. De asemenea, dupa ce PSP a fost
completat, sistemul incarca registrii DS si ES astfel incit DS:0000 si ES:0000
pointeaza la inceputul PSP-ului curent.
Vom trece, in cele ce urmeaza la descrierea cimpurilor din zona PSP
necesare problemelor mai jos enuntate.
Deplasament
Lungime Descriere
relativ la PSP in octeti
---------------------------------------------------------------------------00h
128 Informatii despre necesarul de memorie,
adresa de segment a mediului sistemului de operare,
vectorii intreruperilor 20h, 21h, 22h, 23h, etc.
80h
1 Lungimea liniei de comanda
81h
127 Linia de comanda + zona de transfer
---------------------------------------------------------------------------Asupra a ce se se afla in primii 128 de octeti nu insistam
(se recomanda consultarea lui "THELP"). Ce inseamna insa, linie de comanda?
Pina acum ati realizat programe pe care le lansati in executie prin
simpla tiparire a numelui executabilului la linia de comanda. Sa luam de

exemplu executabilul "tasm.exe". Efectul lansarii cu


tasm
cauzeaza o anumita manifestare: afisarea unor informatii asupra programului
si asupra modului in care se foloseste. Dar daca tastati
tasm sursa.asm
se zice ca transmiteti programului "tasm.exe" un parametru, anume
"sursa.asm", iar manifestarea programului este alta. Se pune problema: cum
anume realizati un program caruia sa-i puteti transmite parametri si mai
ales de unde puteti lua acesti parametri, functie de care programul dv.
cauzeaza o comportare sau alta.
Numarul de caractere introduse la linia de comanda (dupa ce a fost
introdus numele programului) se afla in PSP, la deplasamentul 80h,
iar caracterele se afla la deplasamentul 81h.
Orice program care isi citeste si isi interpreteaza parametrii din
linia de comanda cuprinde urmatoarele:
- determinarea adresei de segment PSP;
- citirea parametrilor, aflati la PSP:0081h;
- functie de parametri introdusi, se apeleaza diferite proceduri, ori
se fac salturi in program.
Exista doua metode de a afla adresa PSP: fie se foloseste apelul sistem
62h, fie sunt folositi DS sau ES (daca nu este necesara incarcarea lor cu
adresele altor segmente).
------------------Intreruperea 21h,62h - Determina adresa PSP a procesului curent
------------------Asteapta:
AH incarcat cu 62h
Returneaza:
BX - adresa de segment a PSP-ului.
O alta zona in PSP necesara rezolvarii problemelor mai jos enuntate
este zona implicita de transfer a discului (abreviata DTA). Ea este
folosita de apelurile sistem 4eh i 4fh, iar locul n care se gaseste n PSP
este acelasi cu cel folosit de linia de comanda (asadar, inainte de a folosi
aceasta zona, cititi parametrii din linia de comanda si aveti grija
sa-i salvati in memorie). Structura zonei DTA este urmatoarea:
Deplasament Lungime

Descriere

---------------------------------------------------------------------------00h
21
Rezervai pt apeluri ulterioare ale functiei 4fh
15h
1
Atributul fiierului gsit
16h
2
Ora ultimei modificri a fiierului gsit
18h
2
Data ultimei modificri a fiierului gsit
1Ah
4
Dimensiunea fiierului gasit (n octei)
1Eh
13
Numele i extensia fiierului, ca ir ASCIIZ

PROBLEME:
1. Scrieti un program care afiseaza toate numele de fisiere din directorul
curent.
Indicatii:
Acest program este practic un DIR simplificat. Pentru a-l putea scrie,
va sint necesare urmatoarele 2 functii sistem:
- functia 4Eh :gasirea primului fisier potrivit (find first)
- functia 4Fh :gasirea urmatorului fisier potrivit (find next)
------------------Intreruperea 21h,4Eh - Cauta prima intrare in director potrivita cu cea
------------------- specificata
"Intrare specificata" se refera la o specificare de fisier, sub forma
unui sir ASCIIZ ('d:\nume_cale\specif_fisier',0). Daca unitatea de disc
si/sau calea sunt omise, se vor considera cele implicite (mai exact,
unitatea de disc implicit si directorul curent). Numele de fisier poate
contine caracterele "?" si/sau "*" (exact in forma in care le folositi
atunci cind utilizati comanda DIR).
Asteapta:
AH incarcat cu 4eh
DS:DX incarcat cu adresa zonei unde e stocata specificarea de fisier
CX incarcat cu atributele fisierului cautat
Returneaza:
CF = 1, daca a aparut o eroare, si AX contine un cod de eroare:
2 - nu s-a gasit fisierul
3 - nu s-a gasit calea
18- nu mai exista fisiere (pentru numele specificat)
CF = 0, daca se gaseste o intrare potrivita conform numelui specificat,
si functia returneaza la DTA curenta (vezi descrierea PSP de mai sus)

informatii despre fisiere, in urmatorul format:


Deplasament Lungime
Descriere
---------------------------------------------------------------------------00h
21
Rezervati pt apeluri ulterioare ale functiei 4Fh
15h
1
Atributul fisierului gasit
16h
2
Ora ultimei modificari a fisierului gasit
18h
2
Data ultimei modificari a fisierului gasit
1Ah
4
Dimensiunea fisierului gasit (in octeti)
1Eh
13
Numele si extensia fisierului, ca sir ASCIIZ
Observatie: daca CX este 0 atunci functia cauta doar fisierele normale.
Pentru a putea afisa fisierele ascunse si fisierele sistem, CX va trebui
sa contina o combinatie de biti la fel cu cea descrisa la apelul sistem
3Ch, pentru crearea unui fisier.
------------------Intreruperea 21h,4Fh - Cauta urmatoarea intrare potrivita in director
------------------Fisierul trebuie sa fi fost specificat intr-un apel precedent al
functiei 4Eh. Aceasta functie se va utiliza dupa un apel precedent al
functiei 4Eh sau/si 4fh.
Asteapta:
AH incarcat cu 4Fh
Returneaza:
CF = 1, daca a aparut o eroare, si AX contine un cod de eroare:
18- nu mai exista fisiere (pentru numele specificat)
CF = 0, daca se mai gaseste o intrare potrivita conform numelui
specificat si functia returneaza la DTA curenta (vezi descriere PSP)
informatii despre fisierul gasit, cu aceeasi structura ca la 4Eh.

2. Modificati programul de la problema 1 astfel incit el sa accepte ca


parametru "d:\nume_cale\specif_fisier" si sa afiseze toate intrarile.
Indicatii:
Problema va cere sa realizati un program caruia sa-i puteti transmite
ca parametru calea in care doriti sa afisati fisierele existente, intr-o
forma ca
my_dir a:\aso\*.txt

Toate informatiile necesare sunt descrise la inceputul laboratorului.


3. Rescrieti comanda DIR.

S-ar putea să vă placă și