INSTRUCTIUNI
DE TRANSFER
1. Scopul lucrarii
Scopul prezentei lucrari este familiarizarea cu operatiile in binar, modurile de adresare, cu instructiunile de transfer de date elementare si structurate specifice microprocesoarelor Intel functionand "in modul real" (particularizand pentru 8086), precum si prezentarea unor directive de asamblare.
Tipuri de reprezentari binare
Intregi cu semn, de 8 sau 16 biti; numerele negative sunt reprezentate in complement fata de 2(c'2); cand se utilizeaza coprocesorul matematic, lor li se adauga intregi cu semn pe 32 sau 64 de biti
Exemplu: valoarea unui intreg reprezentat pe N biti in c'2 este:
(1)
Domeniul in care poate lua valori este: -(2 N-1 ) ÷ 2 N-1 -1
Tabelul L1.1 Conventii de reprezetare binara in complement fata de 2 a numerelor pe 8 biti:
Reprezentare binara |
Valoare |
Observatii |
Cea mai mare valoare reprezentabila |
||
Primul 0 indica numar pozitiv |
||
Cea mai mare valoare negativa |
||
Cea mai mica valoare negativa |
Intregi fara semn de 8 sau 16 biti;
Unde bi - bitul din pozitia i.
Definitii:
Pointer: numere pe 32 de biti indicand o adresa; ele sunt compuse din doua entitati pe 16 biti: un selector care defineste numarul segmentului si un offset indicand deplasamantul in cadrul segmentului;
Siruri: secvente de octeti cu lungimea de la 1 octet la 64Ko;
Octeti ASCII: octeti care contin codul ASCII al unui caracter;
Numere in format BCD
BCD neimpachetat: octeti reprezentand o singura cifra zecimala;
BCD impachetat: octeti in care se memoreaza doua cifre zecimale, fiecare in cate un spatiu de 4 biti.
Exemplu: Reprezentarea numarului 5291 in
BCD neimpachetat | |
BCD impachetat |
2. Memoriu de instructiuni
Conventii:
s: sursa;
d: destinatie;
AL|AX: acumulatorul implicit de 8 sau de 16 biti;
mem: continutul unei locatii de memorie sau continutul a doua locatii de memorie succesive, adresate cu unul dintre modurile de adresare permise pentru memoria de date, cu exceptia adresarii imediate;
mem16: continutul a doua locatii de memorie succesive adresate cu unul dintre modurile de adresare permise pentru memoria de date, cu exceptia adresarii imediate;
mem32: continutul a patru locatii de memorie succesive adresate cu unul dintre modurile de adresare permise pentru memoria de date, cu exceptia adresarii imediate;
r | ri | rj: un registru oarecare de 8 sau de 16 biti, exceptand registrele segment;
r8: un registru de 8 biti;
r16: un registru de 16 biti, exceptand registrele segment;
rs: un registru segment (CS, SS, DS, ES);
data: un operand de 8 sau 16 biti care face parte din formatul instructiunii (adresare imediata);
data8: un operand de 8 biti care face parte din formatul instructiunii (adresare imediata);
data16 un operand de 16 biti care face parte din formatul instructiunii (adresare imediata);
disp8: deplasament pe 8 biti (face parte din formatul instructiunii);
disp16: deplasament pe 16 biti (face parte din formatul instructiunii);
adr: o adresa completa (pe 16 biti);
adr8: o adresa scurta (pe 8 biti);
adr32: o adresa logica exprimata pe patru octeti succesivi;
port adresa (numarul de ordine) unui port de intrare/iesire, pe 8 biti;
AE: adresa efectiva.
Pentru fanioane:
x : fanionul se schimba in conformitate cu rezultatul operatiunii;
1 : fanionul este setat neconditionat;
: fanionul este resetat neconditionat;
? : fanionul este afectat impredictibil;
blanc: fanionul nu este afectat.
Pentru calculul numarului de stari :
cAE - timpul de calcul al adresei efective, si anume
- adresare directa: AE=disp8|disp16 - 6 stari;
- adresare indexata: AE=(SI)|(DI)+ disp8|disp16 - 9 stari;
- adresare indirecta implicita:
AE=(SI)|(DI) - 5 stari;
- adresare relativa la baza directa, fara deplasament:
AE=(BX) - 5 stari;
- adresare relativa la baza directa, cu deplasament:
AE=(BX)+disp8|disp16 - 9 stari;
- adresare relativa la baza indexata:
AE=(BX)+(SI)|(DI)+disp8|disp16 - 12 stari;
- adresare relativa la baza implicita:
AE=(BX)+(SI)|(DI) - 8 stari;
- adresare in stiva directa, fara deplasament:
AE=(BP) - 5 stari;
- adresare in stiva directa, cu deplasament:
AE=(BP)+disp8|disp16 - 9 stari;
- adresare in stiva indexata:
AE=(BP)+(SI)|(DI)+disp8|disp16 - 12 stari;
- adresare in stiva implicita:
AE=(BP)+(SI)|(DI) - 8 stari;
- pentru redirectionarea segmentului se mai adauga 2 stari.
Elemente ale limbajului de asamblare
Programul sursa este format dintr-un numar de linii, care pot fi:
O linie de instructiune a programului sursa are urmatoarea structura:
_Mnemonic__Operand1{,_Operand2}_
Comentariul este optional si trebuie precedat de semnul ";" . Tot ceea ce urmeaza pe o linie dupa acest semn este ignorat de asmblor.
Instructiuni de transfer de date
Instructiunile de transfer realizeaza transferul datelor intre registre, intre registre si memorie, intre registre si stiva. Transferurile se pot executa intre registre de aceeasi lungime, iar la transferul intre registre si memorie lungimea este data de registrul folosit.
Instructiunile de mutare nu modifica indicatorii de conditie. Toate transferurile se pot face pe 1,2,4 sau 8 octeti.
MOV d, s - unde ca argumente putem avea combinatiile:
Copiaza sursa |
OF DF IF TF SF ZF AF PF CF |
|
MOV d,s |
la destinatie | |
Descrierea formala a semanticii, in general: (d) (s)
reg,reg - transfer intre registre pe 1, 2, 4 octeti
reg,const - incarcare imediata constanta intr-un registru
mem, const - incarcare imediata constanta intr-o adresa de memorie
reg,mem - incarcare continut adresa de memorie intr-un registru
mem,reg - memorare continut registru intr-o locatie de memorie
mem,mem - !! este o combinatie interzisa fiindca nu pot fi doua adrese in instructiune
Operanzi |
Exemple |
Descrierea formala a semanticii | |
r, data |
MOV BX,ALFA |
(BX) ALFA |
Transfer imediat a unei date in registru |
mem, data |
MOV [BP+DI],55H |
((SS)0H + (BP) + (DI)) 55H |
Transfer imediat a unei date intr-o adresa de memorie |
AL|AX, mem |
MOV AX,[SI] |
(AL) ((DS) 0H + (SI)) (AH) ((DS) 0H + (SI) + 1) |
Transfer continut adresa de memorie intr-un registru acumulador de 8,16 biti |
mem, AL|AX |
MOV [BX+SI+10H],AL |
((DS) 0H + (BX) + (SI) + 10H) (AL) |
Memorare continut registru acumulator (pe 8 sau 16 biti) intr-o locatie de memorie |
r1, r2 |
MOV AX,SP |
(AX) (SP) |
Transfer intre doua registre |
r, mem |
MOV BH,[BX+1000H] |
(BH) ((DS)0H + (BX) + 1000H) |
Memorare continut adresa de memorie in registru |
mem, r |
MOV [2000H],DL |
((DS)0H + 2000H) (DL) |
Memorare continut registru in memorie |
rs*, r16 |
MOV ES,CX |
(ES) (CX) |
Transfer date intre register pe 2 octeti ti registru segment |
rs*, mem16 |
MOV SS,[DI] |
(SS) ((DS) 0H +(DI)+1) ((DS) 0H + (DI)) |
Transfer continut memorie pe 2 octeti intr-un registru pe 2 octeti |
r16, rs |
MOV CX,CS |
(CX) (CS) |
Transfer continut registru segment intr-un registru pe 2 octeti |
mem16, rs |
MOV [SI],DS |
((DS) 0H +(SI)+1) ((DS) 0H+(SI)) (DS) |
Transfer continut registru segment in memorie pe 2 octeti |
* registrul segment nu poate fi CS
Adresarea stivei (PUSH si POP)
Stiva este o zona de memorie temporara care este adresata prin registrul SP care indica elementul din varful stivei (top). In stiva se ia din varful stivei si apoi se incrementeaza SP iar cand se pune in stiva se decrementeaza SP.
Pentru lucru cu stiva sunt dedicate doua register SP si SS. In SS se indica segmental de memorie unde este definita stiva iar SP pointeaza pe adresa bezei stivei unde a fost depus ultimul octet. Pentru a incarca stiva cu o valoare reprezentata pe doi octeti, cel mai semnificativ octet este salvat la adresa mai mare iar celalalt la cea mai mica. In acest caz SP se va decrementa cu 2 deoarece stiva creste in jos.
Transfera in stiva |
OF DF IF TF SF ZF AF PF CF |
|
PUSH s |
de la sursa | |
Descrierea formala a semanticii, in general: (SP) (SP) - 2
((SS)0H + (SP) + 1) (s)h
((SS)0H + (SP)) (s)l
Exemplu:
Push AX; AX=5674
Push EAX; EAX' 56741EFF
Adresa memorie de date |
Continut stiva |
BP |
0400 |
04000 |
|
03FF |
56 | |
03FE |
74 |
03FE (daca se lucreaza cu AX) |
03FD |
1E | |
03FC |
FF |
03FC (daca se lucreaza cu EAX) |
.... | ||
0000 |
STIVA |
0 | ||
|
PUSH BX SP=SP-2 si BX [SP] |
||
POP BX [SP] BX si SP=SP+2 |
|||
SP |
BX |
Top varful stivei |
|
Alpha | |||
N |
Y |
Operanzi |
Exemple |
Descrierea formala a semanticii | |
r16 |
PUSH BP |
(SP) (SP) - 2 ((SS)0H+(SP)+1) ((SS)0H+(SP)) (BP) |
Salvare continut registru reprezentat pe 2 octeti in stiva |
mem16 |
PUSH [DI+100H] |
(SP) (SP) - 2 ((SS)0H+(SP)+1) ((DS)0H +(DI) +101H) ((SS) 0H + (SP)) ((DS) 0H +(DI) +100H) |
Salvare continut memorie in stiva |
rs |
PUSH SS |
(SP) (SP) - 2 ((SS)0H+(SP)+1) ((SS)0H+(SP)) (SS) |
Salvare continut registu segmet in stiva |
Transfera in stiva |
OF DF IF TF SF ZF AF PF CF |
|
PUSHF |
registrul de | |
fanioane |
Descrierea formala a semanticii: (SP) (SP) - 2
((SS)0H + (SP) + 1) (F)h
((SS)0H + (SP)) (F)l
Instructiunea POP
Realizeaza operatia inversa instructiunii Push. Pentru extragerea datelor din stiva salvate cu ajutorul instructiunii Push, se utilizeaza instructinea Pop in sens invers depunerii lor. Un este posibila adresarea imediata a instructiunii Pop.
Transfera din stiva |
OF DF IF TF SF ZF AF PF CF |
|
POP d |
la destinatie | |
Descrierea formala a semanticii, in general: (d)l ((SS)0H + (SP))
(d)h ((SS)0H + (SP) + 1)
(SP) (SP) + 2
Operanzi |
Exemple |
Descrierea formala a semanticii | ||
r16 |
POP CX |
(CL) ((SS)0H + (SP)) (CH) ((SS)0H + (SP) + 1) (SP) (SP) + 2 |
Salveaza in registru de 2 octeti continutul stivei de la adresa indicata de SP |
|
mem16 |
POP [F0F0H] |
((DS) 0H +F0F0H) ((SS) 0H + (SP)) ((DS) 0H +F0F1H) ((SS) 0H + (SP) + 1) (SP) (SP) + 2 |
Salveaza in memorie continutul stivei (pe 2 octeti) |
|
rs (nu CS) |
POP SS |
(SS)((SS)0H+(SP)+1) ((SS)0H+(SP)) (SP) (SP) + 2 |
Salveaza in registrul segment continutul stivei |
Transfera din stiva |
OF DF IF TF SF ZF AF PF CF |
|
POPF |
registrul de |
x x x x x x x x x |
fanioane |
Descrierea formala a semanticii: (F)l ((SS)0H + (SP))
(F)h ((SS)0H + (SP) + 1)
(SP) (SP) + 2
Instructiuni de transfer speciale
XCHG- se poate schimba continutul unui registru cu al altui registru sau cu o locatie de memorie. Un este posibila schimbari intre doua locatii de meorie si nici utilizarea registrelor segment.
Transfera sursa la |
OF DF IF TF SF ZF AF PF CF |
|
XCHG d,s |
destinatie si | |
destinatia la sursa |
Descrierea formala a semanticii, in general: (d) (s)
Operanzi |
Exemple |
Descrierea formala a semanticii | |
r16 |
XCHG DX XCHG AX este NOP |
(AX) (DX) (AX) (AX) s NOP |
Schimbari intre registre de 2 octeti |
r1, r2 |
XCHG CH,CL |
(CH) (CL) |
Schimbari intre acelasi registru partea high cu partea low |
r, mem |
XCHG BX,[BX+DI] |
(BL) ((DS)0H + (BX) + (DI)) (BH) ((DS)0H + (BX) + (DI) + 1) |
Schimbari intre memorie si registre |
Instructiunea XLAT
Translarea unor coduri hexa in alte coduri hexa.Transalrea se realizeaza utilizando o tabela de coduri.Adresa de inceput a tabelei trebuie depusa in BX iar primul cod in AL. Aceasta instructiune nu are operand si lucreza doar cu registrele AL si BX. Ca aplicatie se poate utiliza instructiunea pentru conversia codului BCD in codul BCD 7 segmente.
OF DF IF TF SF ZF AF PF CF |
||
XLAT |
Translateaza | |
Descrierea formala a semanticii: (AL) ((DS)0H + (BX) + (AL))
Instructiunile LAHF si SAHF
Instructiunile LAHF si SAHF sunt folosite pentru a prelua indicatorii de conditie din coprocesor si ai testa in procesor folosind instructiunile de salt conditionat JZ. In coprocesor nu exista instructiuni de salt.
Incarca(AH)cu octetul |
OF DF IF TF SF ZF AF PF CF |
|
LAHF |
inferior al | |
registrului F |
Descrierea formala a semanticii: (AH) (F)l
Incarca octetul in- |
OF DF IF TF SF ZF AF PF CF |
|
SAHF |
ferior al registru- |
x x x x x |
lui F cu (AH) |
Descrierea formala a semanticii: (F)l (AH)
Instructiunile IN si OUT
Lucreaza cu porturile. Transfera date de la acumulator la port sau invers.
Transferul unui |
OF DF IF TF SF ZF AF PF CF |
|
IN d,s |
octet sau cuvant de | |
la un port in acumulator |
Descrierea formala a semanticii, in general: (AL) | (AX) (s)
Operanzi |
Exemple |
Descrierea formala a semanticii |
AL|AX, port |
IN AL,0FH |
(AL) (0FH) |
AL|AX, DX |
IN AX,DX |
(AX) ((DX) + 1) ((DX)) |
Transferul unui |
OF DF IF TF SF ZF AF PF CF |
|
OUT d,s |
octet sau cuvant | |
din acumulator la un port |
Descrierea formala a semanticii, in general: (d) (AL) | (AX)
Operanzi |
Exemple |
Descrierea formala a semanticii |
port, AL|AX |
OUT 10H,AL |
(10H) (AL) |
DX, AL|AX |
OUT DX,AX |
((DX) + 1) ((DX)) (AX) |
Incarcarea adresei effective si a registrelor de segment
Forma generala:
Lxx reg,mem
xx: reprezinta unul dintre registrele DS, SS, ES
reg: registre generale
mem: o adresare a memoriei
A. Instructiunea LDS
Se incarca registrul DS cu adresa de segment si cel din operand cu offsetul furnizat de al doilea operand. Cu instructiunea LDS se poate accesa o memorie mai mare de 1Mo.
Incarca un registru |
OF DF IF TF SF ZF AF PF CF |
|
LDS d,s |
de 16 biti si reg. | |
segment de date |
Descrierea formala a semanticii, in general: (r16) (mem32)l
(DS) (mem32)h
Operanzi |
Exemple |
Descrierea formala a semanticii |
r16, mem32 |
LDS SI,[10H] |
(SI) ((DS) 0H + 11H) ((DS) 0H + 10H) (DS) ((DS) 0H+13H) ((DS) 0H + 12H) |
B. Instructiunea LES
Este specifica numai procesoarelor pe 32 biti, incarca registrele segment cu date pe 2 octeti, iar cei din instructiune cu date pe 2 sau 4 octeti, functie de tipul registrului.
Incarca un registru |
OF DF IF TF SF ZF AF PF CF |
|
LES d,s |
de 16 biti si | |
registrul ES |
Descrierea formala a semanticii, in general: (r16) (mem32)l
(ES) (mem32)h
Operanzi |
Exemple |
Descrierea formala a semanticii |
r16, mem32 |
LES DI,[DI] |
(DI) ((DS)0H +(DI) +1) ((DS)0H +(DI)) (ES) ((DS)0H+(DI)+3)((DS)0H+(DI)+2) |
C. Instructiunea LEA
Prin aceasta instructiune incarcarea adresei efective se realizeaza prin salvarea intr-un registru de 16 biti a offsetului specificat de operand.
Incarca un registru |
OF DF IF TF SF ZF AF PF CF |
|
LEA d,s |
de 16 biti cu o | |
adresa efectiva |
Descrierea formala a semanticii, in general: (r16) AE a locatiei memoriei
Operanzi |
Exemple |
Descrierea formala a semanticii |
r16, mem16 |
LEA BX,[BX+DI+10H] |
(BX) (BX) + (DI) + 10H adresa fizica: AF = (DS) 0H +(BX) +(DI) +10H adresa efectiva: AE = (BX) +(DI) +10H |
Nota: Singurele instructiuni care afecteaza fanioanele sunt POPF si LAHF.
Ex: LEA AX,[BX+SI+15] - adresa operandului este memorata in AX
Este echivalenta cu: MOV AX,offset adresa offset = adresa relativa calculata
La coprocesor nu exista dispozitiv de calcul al adresei si se poate folosi LEA
LDS reg16,dwpointer - reg16=offset adresa DS= adresa segment
LES reg16,dwpointer
Incarca registrul segment DS sau ES si registrul general de la o adresa de 4 octeti unde se gaseste adresa relativa a operandului si adresa segmentului din care face parte. Se foloseste la comunicarea intre segmente pentru pregatirea registrelor de segment.
dwpointer |
ofsset Adresa |
Adresa segment |
LDS SI,dwpointer |
|
| ||
SI |
DS sauES |
3. Directive de asamblare si cuvinte rezervate in EMU8086
Definitie
Directivele sunt de fapt pseudoinstructiuni care transmit informatii asamblorului privind modalitatile de asamblare.
Forma generala a unei directive:
Nume Directiva Lista date
. ORG "ASSIGN LOCATION COUNTER" DIRECTIVA Sintaxa: ORG adr.
Efect: instructiunea urmatoare va fi plasata la adresa adr.
. DB "DEFINE BYTE" DIRECTIVA
Sintaxa: [simbol] DB data,[data,[data,..]].
Efect: rezerva spatiu, sub forma de byte, in memorie pentru date. Simbol, daca exista, va avea ca valoare adresa la care a fost plasat primul byte.
DW "DEFINE WORD" DIRECTIVA
Sintaxa: [simbol] DW data,[data,[data,.]].
Efect: rezerva spatiu, sub forma de word, in memorie pentru date. Simbol, daca exista, va avea ca valoare adresa la care a fost plasat primul word.
EQU "CREATE SYMBOL" DIRECTIVA
Sintaxa: simbol EQU expresie
Efect: asamblorul atribuie lui simbol valoarea obtinuta prin evaluarea expresiei. Expresie poate fi o data, sau o combinatie de data prin semnele + si -. Odata folosit EQU pentru un simbol, acest simbol nu mai poate fi modificat in cursul programului.
. OFFSET "OFFSET OF EXPRESSION" OPERATOR
Sintaxa: OFFSET simbol.
Efect: obtine adresa pentru simbol.
. BYTE PTR "CHANGE TYPE OF VARIABLE" OPERATOR
Sintaxa: BYTE PTR simbol
Efect: converteste simbol in tip byte.
. WORD PTR "CHANGE TYPE OF VARIABLE " OPERATOR
Sintaxa: WORD PTR simbol
Efect: converteste simbol in tip word.
Tipuri de constante
B binare
H hexazecimale
O octale
D zecimal
Directive pentru definire date. Rezumat
DB Define Byte ; definire a variabilei pe un octet
DW Define Word ; definire a variabilei pe 2octeti
DD Define Double word ; definire a variabilei pe 4 octeti
DQ Define Quadword ; definire a variabilei pe 8 octeti
DT Define Ten Byte ; definire a variabilei pe 4 octeti
EQU constanta ; defineste o constanta
ORG adresa ; indica adresa efectiva unde se va plasa programul
ALIGN n ; unde n=1,2,4,8,16 aliniere contor amplasare la multiplu
INCLUDE fisier.asm ; copiaza in acel loc o secventa de program (subprogram)
Mod de lucru recomandat
I. Utilizarea instructiunii MOV
Copiati programul de mai jos in Emu8086 si compilati-l (F5) si apoi emulati-l.
ORG 100h ; directiva ceruta de un program COM
MOV AX, 0B790h ; incarca in AX valoarea B790h
MOV DS, AX ; copiaza valoarea din AX in DS
MOV CL, 'A' ; salveaza in CL codul ASCII al lui 'A', adica 41h.
MOV CH, 01011111b ; salveaza in CH valoarea binara 01011111
MOV BX, 15Eh ; seteaza BX cu 15Eh.
MOV [BX], CX ; copiaza continutul lui CX in memorie la adresa indicata de DS si BX
MOV SI, 10h; incarca in SI valoarea 10h
MOV [BX+SI+10H],AL; incarca din AL valoarea la adresa indicata de BX+SI+10H
MOV DL, [130H]; incarca la adresa 130h continutul lui DL
MOV DX, 130h ; incarca in DL valoarea 130h
MOV word ptr cuv,3456h;incarca in locatiile de memorie cu adresele "cuv" si "cuv"+1,
octetii 034h si 056h, adresare imediata
MOV AX,var ;din memorie in acumulator
MOV AX,[var] ;adresare directa
MOV bx,offset var ;incarca in BX adresa lui var
RET; revenire la sistemul de operare
cuv db 0
1.a. Observati modificarile care se realizeaza in register si in memoria de date.
1.b. Identificati adresele la care sunt scrise instructiunile si codul fiecarei instructiuni
II. Aplicatii cu instructiunile Push si Pop
2. Copiati in Editorul simulatorului EMU8086 urmatorul program. Compilati-l si apoi cu ajutorul emulatorului executati-l pas cu pas.
ORG 100h
MOV BX,CS ;seteaza segmentul de date
MOV DS,BX ;egal cu segmentul de cod
MOV AX, 5678h
PUSH AX ;saveaza in stiva continutul lui AX
MOV AX, 7876h ;modificati continutul lui AX
POP AX ; refaceti continutul lui AX cu valoarea intiala
CLC ;se actioneaza asupra fanionului CF=0
STC; CF=1
CMC; complementare CF
RET
END
Elemente de observat pentru fiecare dintre urmatoarele instructiuni (in AFD se recomanda fixarea zonei doi de afisare a memoriei la adresa DS:124):
Vezi AX , SP si stiva.
Vezi fanioanele.
III. Aplicatii cu instructiuni de transfer speciale
3. Se copiaza in Emu8086 urmatorul program si se executa pas cu pas.
ORG 100h
MOV BX,CS ;seteaza segmentul de date
MOV DS,BX ;egal cu segmentul de cod
MOV AX, 8089h;
MOV BX, 1234h;
XCHG AX,BX; se interschimba continuturile celor doua registre
XCHG BH,BL
XCHG AX,[BX]
LAHF;incarca in AH fanioanele
SAHF;incarca fanioanele cu continutul lui AH
END
Vezi registrele BX, AX, BH, BL, F.
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 |