Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
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.
Copyright © 2024 - Toate drepturile rezervate