Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Informatica


Index » educatie » Informatica
» Notiuni generale despre structura programelor. Utilizarea segmentelor. Modele de memorie


Notiuni generale despre structura programelor. Utilizarea segmentelor. Modele de memorie


Notiuni generale despre structura programelor. Utilizarea segmentelor. Modele de memorie

1. Obiectivele lucrarii

Prezentarea principalelor moduri de segmentare a programelor;
. Descrierea directivelor de segmentare;
. Modul de initializare al registrelor segment;

2. Aparatura si suporturile utilizate

PC in configuratia unitate centrala, monitor, tastatura, mouse;
. Precizarile din prezentul indrumar;

3. Breviar teoretic

Un program realizat in asamblare este alcatuit din unul sau mai multe module. Simbolurile definite (etichete, variabile, proceduri, etc.) intr-un modul si referite in alte module se declara PUBLIC in modulul de definitie si EXTRN in cele in care sunt referite.
Indiferent de modul de dezvoltare al unui program ASM, atat instructiunile, cat si datele trebuie sa se gaseasca in interiorul unui segment. Prin definitie un segment este definit ca o colectie de instructiuni sau date ale caror adrese sunt relative fata de inceputul segmentului ( fata de registrul segment corespunzator ).
Specificarea segmentelor se poate face in doua feluri:
definire simplificata a segmentelor ;
definire completa a segmentelor;
Cele patru registre segment la care procesorul are acces in orice moment sunt:



CS ( Code Segment - segment care contine codul programului );
DS ( Data Segment - segment care contine datele programului );
ES ( Extra Segment )
SS ( Stack Segment - segment in care se realizeaza operatiile cu stiva );

Cu cele patru registre de segment principale se pot referi patru segmente logice; acestea la randul lor pot corespunde la patru segmente fizice distincte, dar pot exista si suprapuneri partiale sau totale ale acestor segmente.
Forma simplificata de definire a segmentelor are avantajul, din punct de vedere al utilizatorului, ca ofera o gestiune mai simpla a segmentelor.
In general, un program are:
un segment de cod
un segment de date
un segment de stiva.
Exceptie de la aceasta regula fac programele cu extensia .COM, care pot fi realizate utilizand definirea simplificata, modelul tiny.
La incarcarea in memorie a unui program pentru executie, sistemul de operare initializeaza registrul de segment CS, cu prima adresa de segment disponibila, iar registrul IP (Instruction Pointer - indica locatia de memorie in care se afla instructiunea curenta ) cu adresa relativa din cadrul segmentului a primei instructiuni ce trebuie executata.
Pe langa instructiunile propriu-zise, un program ASM mai poate cuprinde directive prin intermediul carora se definesc date, etichete si proceduri, se structureaza segmentele, se definesc si se utilizeaza macroinstructiuni, se controleza in general procesul de asamblare.
Directivele nu reprezinta instructiuni, ci sunt comenzi catre asamblor, efectul lor manifestandu-se exclusiv in faza de asamblare ( au un rol similar directivelor catre preprocesor din limbajul C).

3.1. Forma completa de definire a segmentelor

Forma generala a directivei SEGMENT este :

nume_segment SEGMENT [tip_aliniere] [tip_combinare] ['nume_clasa']

.. < corpul segmentului > ; instructiuni si date

nume_segment ENDS

unde nume_segment este numele asociat segmentului, care trebuie sa fie unic si caruia i se asociaza o adresa de segment (de 16 biti), corespunzatoare pozitiei in memorie a segmentului, in faza de executie a programului.
Initializarea unui registru segment (DS, ES sau SS) cu un segment declarat revine utilizatorului, care o va face in mod explicit in cadrul programului, utilizand pentru aceasta numele segmentului respectiv:

mov ax, <nume_segment>
mov ds, ax           ; in mod asemanator pentru ES sau SS

Urmatoarele referiri la memorie care implica registrul DS trebuie sa se refere la date din acest segment (corectitudinea acestor referinte nu este verificata de catre asamblor);

  tip_aliniere este o informatie referitoare la adresa fizica, de inceput, la care este depus segmentul in memorie, si anume, daca este divizibila cu 1, 2, 4 sau 16 acest tip poate fi:

byte - adresa divizibila cu 1;
word - adresa divizibila cu 2;
dword - adresa divizibila cu 4;
para - adresa divizibila cu 16 (paragraf);
page - adresa divizibila cu 256;

  tip_combinare sau tip de segment constituie o informatie pentru editorul de legaturi, care specifica raportul dintre acest segment si alte segmente definite in alte module obiect.
Acest parametru poate fi:
PUBLIC - arata ca acest segment va fi concatenat ( inlantuit ) cu alte segmente cu acelasi nume, din alte module obiect, rezultand un singur modul cu acest nume;
COMMON - precizeaza ca acest segment si alte segmente cu acelasi nume din alte module vor fi suprapuse, deci vor incepe de la aceiasi adresa. Lungimea unui astfel de segment va fi lungimea celui mai mare segment dintre cele suprapuse;
AT <expresie> - specifica faptul ca segmentul va fi plasat la o adresa fizica absoluta de memorie;
STACK - marcheaza segmentul curent ca reprezentand stiva programului; daca sunt mai multe segmente cu tipul STACK, ele vor fi tratate ca PUBLIC. Urmatorul exemplu este o definire si o initializare explicita a unui segment de stiva:

stiva SEGMENT STACK
      db 256 dup ( ? )
      stiva_sp label WORD
   stiva ENDS
   cod SEGMENT
      mov ax, stiva
      mov ss, ax
      mov sp, OFFSET stiva_sp
   cod ENDS

nume_clasa - specifica un nume de clasa pentru segment, extinzand astfel numele segmentului; de exemplu: daca segmentul are si atributul 'nume_clasa', atunci atributele vor actiona numai asupra segmentelor cu acelasi nume de clasa; ca nume de clase, se folosesc de obicei 'code', 'data' si 'stack'.

3.2. Directiva ASSUME

Directiva ASSUME este o pseudoinstructiune pentru care nu se genereaza cod, rolul sau fiind numai de a informa asamblorul care este intentia programatorului. Asamblorul nu are nici un fel de mecanism prin care sa verifice daca intr-adevar continutul registrului segment este cel promis in pseudoinstructiunea ASSUME. In schimb, acesta pseudoinstructiune este utilizata de asamblor pentru a face referire la date si instructiuni. Cand o instructiune face referire la o variabila, fara prefix de segment, asamblorul determina segmentul ce contine variabila si apoi examineaza pseudoinstructiunea ASSUME , pentru a determina registrul segment ce adreseaza acel segment.
Are forma generala:

ASSUME reg_seg : expresie, . . .

reg_seg poate fi:
un nume de segment;
un nume de grup de segmente;
SEG nume segment;
NOTHING;

3.3. Directiva GRUP

Directiva GRUP serveste la gruparea mai multor segmente ( inclusiv cu nume diferite si atribute diferite ), a caror lungime totala nu depaseste 64 Ko, sub acelasi nume. Are forma generala:
nume_grup GRUP nume_seg1, nume_seg2,

Aceasta directiva reprezinta o alta modalitate de combinare a mai multor segmente, pe langa cea oferita de atributul PUBLIC. Numele de grup se poate folosi in directiva ASSUME, la initializarea unor registre de segment sau la calculul unui offset. Sa consideram urmatorul exemplu:

d1 SEGMENT
      y dw 20
d1 ENDS
d2 SEGMENT
      x db 2
d2 ENDS
data GRUP d1, d2

Putem scrie instructiuni de forma :

mov ax, data
mov ds, ax
mov ax, OFFSET x
mov ax, OFFSET data:x

sau directive de forma :

ASSUME ds:data

3.4. Definirea simplificata a segmentelor

Directiva pentru simplificarea modelului de memorie are forma generala:
.model tip
in care tip poate fi:
tiny        - pentru care LP + LD + LS < un segment (64 K)
small      - pentru LP < un segment (64 K), LD + LS < un segment
medium   - pentru LP > un segment (64 K), LD + LS < un segment
compact   - pentru LP < un segment (64 K), LD + LS > un segment
large       - pentru LP > un segment (64 K), LD + LS > un segment
huge       - la fel ca modelul anterior, cu diferenta ca referintele sunt normalizate.
Abrevierile utilizate sunt : LP, LD, LS; ele reprezinta lungimea programului ( codului ), dimensiunea memoriei pentru date si respectiv pentru stiva.
Directiva .model este prima din programul sursa. Folosirea directivelor simplificate prezinta avantajul ca nu mai sunt necesare directive ASSUME : asocierile intre segmentele generale si registrele segment sunt implicite.

.stack[ dimensiune ]
Aceasta directiva aloca o zona de memorie de dimensiune specificata pentru segmentul de stiva. Daca nu se specifica parametrul dimensiune, acesta va fi implicit de 1Koctet.
.code[ nume ]
Acesta directiva precede segmentul de cod( program ). Incarcarea acestui registru segment (CS) se va face automat de catre S.O. , la incarcarea segmentului pentru executie.
.data
Aceasta directiva descrie segmentul de date pentru care utilizatorul trebuie sa initializeze explicit registrul de segment DS, cu adresa segmentului de date, @DATA.
Adresele de inceput ale segmentelor si ale grupurilor de segmente definite cu directivele simplificate sunt disponibile prin simboluri globale:
@data, @data?, @fardata, @fardata?, dgroup.

4. Desfasurarea lucrarii

Dupa citirea cu atentie a breviarului teoretic, se vor realiza urmatoarele programe in TASM.
Aceste programe va familiarizeaza cu cele doua moduri de declarare ale unui segment:
forma completa
forma simplificata.

1. Forma completa de declarare a segmentelor:

date segment word public 'data'
mesaj db 'exemplu program forma completa declarare a segmentelor$'
date ends
cod segment word public 'code'
assume cs : cod, ds : date, ss : stiva
start:
      mov ax , date                   ; initializare registru segment
      mov ds , ax                      ; pentru date DS
      mov dx , offset mesaj        ; initializare adresa mesaj in DX
      mov ah , 9                        ; apel functie 9 - DOS,
                                              ; de tiparire
      int 21h                              ; a unui text, cu adresa
                                              ; data in DX
      mov ax , 4c00h                  ; revenire in DOS
      int 21h
cod ends
stiva segment word stack 'stack'
      dw 10 dup (?)                     ; rezervare memorie pentru stiva
stiva ends
end start

2. Varianta simplificata a programului anterior:

.model small
.stack 10
.data
mesaj db 'exemplu forma simplificata de declarare a segmentelor$'
.code
start:
    mov ax , @data                   ; initializare registru segment
    mov ds , ax                          ; pentru date DS
    mov dx , offset mesaj           ; initializare adresa
                                               ; mesaj in DX
    mov ah , 9                   ; apel functie 9 - DOS,
                                               ; de tiparire
    int 21h                                 ; a unui text, cu adresa in DX
    mov ax , 4c00h                     ; revenire in DOS
    int 21h
end start


Se observa ca forma a doua de declarare a segmentelor este mai usoara iar folosirea ei scuteste programatorul de sarcina specificarii modului de utilizare a registrelor segment
Numele implicite ale segmentelor pot fi obtinute utilizand simbolurile predefinite globale, exemplificate la finalul breviarului teoretic.
Expresia OFFSET X folosita in exemple anterioare furnizeaza deplasamentul in cadrul segmentului de definitie - cel de date in cazul nostru

5. Modul de lucru

1. Se vor asambla si link-edita programele prezentate ca exemplu, obtinandu-se fisiere .EXE;
2. Se vor obtine si se vor analiza fisierele listing si de referinte incrucisate;
3.
Se vor rula sub DEBUG sau TD programele prezentate.





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate