Sunteți pe pagina 1din 3

L 6.

ADRESAREA MEMORIEI I STIVEI


Adresarea memoriei (RAM):
- adresarea imediat, la care, n cadrul instruciunii, este specificat chiar codul adresei
efective, de exemplu, pentru o instruciune de transfer: MOV AX, DS:[54], codul 54
specific adresa efectiv din cadrul segmentului de date, indicat de registrul DS;
- adresarea direct;
- adresarea indirect la memorie prin registru, unde n cadrul instruciunii este specificat
registrul din care se va lua adresa efectiv. Registrul este unul dintre urmtoarele: BX,
BP,SI, DI. De exemplu, n cazul instruciunii: MOV AX, [BX], n zona AL a
acumulatorului este ncrcat coninutul locaiei de memorie a crei adres efectiv este
coninut n BX, adresa de segment fiind continut (in mod implicit) n registrul DS.
Adresarea Stivei se face mai simplu, informaiilor de adres fiind furnizate de registrul SP
(Stack Pointer), dup regula urmtoare. La fiecare operaie de scriere (instruciunea PUSH),
registrul SP este incrementat (valoarea crete cu o unitate pentru o operaie pe cuvnt), iar
fiecare operaie de citire (instruciunea POP), registrul SP este decrementat. Astfel, accesul la
date se poate face numai secvenial, dup regula LIFO (last input, first out), procedeu care
este foarte util n cazul salvrii parametrilor programelor la apelul i la revenirea din
subprograme (proceduri).
Structura Memoriei
Calculatoarele IBM-PC ncepnd cu I 286 lucreaz cu memorie virtual. Conceptul utilizeaz
un spaiu de adrese extins, mai mare dect memoria adresabil fizic. Acest lucru este posibil
prin maparea (translatarea) adreselor de memorie corespunztoare fiecrui task activ pe
spaiul de memorie disponibil n RAM. n plus sunt folosite o serie de mecanisme specifice de
gestionare i protecie memoriei.
Pe de alt parte se folosete memoria paginat, cu pagini de lungime fix, utilizate la
transferul de date i segmente, n general de lungime variabil, destinate structurilor de date
cu funcii diferite. Atunci cnd Asamblorul (sau alt compilator) creeaz forma executabil a
unui program, acesta genereaz segmente diferite pentru zona de cod (setul de instruciuni),
zonele de date, zona de stiv, etc.
Codul de adres a memoriei segmentate este mprit n dou cmpuri corespunztoare
adresei de segment i adresei efective, din cadrul segmentului. O selecie a zonei de
memorie poate fi vizualizat n partea de jos (spre stnga) a ferestrei programului TD.exe. n
acest caz, sunt figurate adresele memoriei (de segment i efective), corespunztoare adresei de
nceput a cte unui grup de cuvinte, reprezentate pe fiecare linie. n mod implicit, coninutul
memoriei este reprezentat cu cte 4 cifre Hexa, grupate dou cte dou, corespunztoare
cuvintelor de 16 bii. Modul de reprezentare poate fi schimbat, folosind meniul de la baza
ferestrei (<Ctrl><D>). Prin comanda <CTRL><G> se poate realiza poziionarea ntr-o
anumit zon de memorie, cu adresa de start specificat.
Pentru a lucra corect cu zonele de adres ale segmentului de date, programul n limbaj de
asamblare trebuie s conin declaraia .data naintea nceperii zonei de cod. Aceasta va
duce la generarea adresei de segment de date, n procesul de asamblare, la o locaie de
memorie stabilit de sistemul de operare, prin mijloacele de gestiune ale memoriei virtuale.
n plus, programul trebuie s realizeze iniializarea registrului DS, coninnd adresa
segmentului de date. Aceasta se face prin intermediul unui registru general (AX, de exemplu)
prin urmtoarele instruciuni:
Mov ax, @data
Mov ds, ax

Cu ajutorul simbolului @data este accesibil adresa segmentului de date, care este generat
de Asamblor i care va fi plasat la n registrul DS.
Funcionarea Stivei
Stiva este o structur de memorie, generat de obicei n zona RAM (mai rar pe disc) cu un
mecanism de adresare special. n momentul generrii (declarrii) Stivei se stabilete o adres
de baz care va fi conservat pe parcursul activitii programului. Scrierile n Stiv au loc la
adrese succesive, ncepnd cu adresa de baz, n ordine cresctoare sau descresctoare.
Acestea sunt generate prin incrementarea respectiv decrementarea unui numrtor special, din
cadrul structurii procesorului, numit contor de stiv (SP stack pointer), al crui coninut
reprezint adresa vrfului stivei. Coninutul acestuia poate fi vizualizat cu programul de
monitorizare (TD.exe) n colul din dreapta, jos cu notaia ss. Adresa de stiv conine un
cmp corespunztor segmentului i unul corespunztor adresei efective. Citirile din stiv se
fac tot la adrese succesive, dar parcurse n ordine invers, prin acionarea n sens invers a
contorului de stiv. Acest mod de adresare este de tip LIFO (last input, first output
ultimul intrat, primul ieit) i este deosebit de eficient n anumite faze de funcionare a
programului, cum ar fi lucrul cu subprograme (subrutine, proceduri, funcii) sau lucrul
multi-task (programe paralele). Astfel, atunci cnd un program este ntrerupt de apelul unei
proceduri sau chiar de alt program, informaiile referitoare la starea execuiei programului
sunt pstrate n stiv. Structura de stiv este foarte avantajoas n cazul apelurilor de proceduri
incluse unele n altele, cnd recuperarea datelor trebuie fcut n ordine invers, la ieirea din
proceduri.
Lucrul cu Memoria
Transferurile la i din memorie se pot face prin intermediul instruciunilor de transfer de
tip Mov. Datele transferate vor fi plasate n memorie la o adres efectiv, n cadrul unui
segment de date, avnd adresa de baz plasat n registrul DS.
De exemplu, prin instruciunile de mai jos, este ncrcat o anumit locaie de memorie cu o
valoare data (10h):
Mov ax,10h
Mov bx,0h
Mov [bx+2],ax
Prima instruciune ncarc constanta, n notaie Hexa, 10h n registrul AX. Cea de-a doua
ncarc registrul BX cu valoarea corespunztoare unei adrese efective (0h). Ultima
instruciune ncarc coninutul registrului AX n locaia cu adresa de segment dat de DS i cu
adresa efectiv, dat de BX+2 (raportat la baza segmentului). Parantezele drepte arat c
este vorba de o adres a unei locaii de memorie. Constanta 2 joac rolul unui
deplasament, adic o translaie (deplasare) relativ la adresa indicat de BX.
Pentru valoarea deplasamentului poate fi utilizat registrul SI, aa cum se arat n exemplu
urmtor:
Mov ax,10
Mov bx,1
Mov si,2
Mov [bx+si],ax
Se poate spune c realizm o adresare indexat, registrul SI coninnd valoarea indexului,
valoarea bx+si artnd deplasarea fata de baza segmentului. Trebuie menionat c folosirea
registrului BX este necesar chiar dac conine valoarea zero.
n cazul procesoarelor din familia Intel 80x86, registrele au, de regul, i o funcie dedicat,
ca de exemplu:
AX registrul acumulator;

BX registrul cu adresa de baza;


SI registrul index.
Lucrul cu Stiva
Scrierile de date n stiv se fac prin instruciuni de tip Push, iar citirile de date se fac prin
instruciuni de tip Pop (descrise n TECH.exe). Aceste instruciuni pot aciona asupra unor
tipuri de operanzi cu semnificaii diferite, i au sintaxa de mai jos (menionm c la aceste
procesoare adresele scad, pe msur ce stiva se umple):
PUSH src memoreaz n stiv coninutul specificat n src (reprezentnd un registru sau
o locaie de memorie de 16 bii) realiznd operaiile:
SP - = 2 ; SS:[SP] <- src - se decrementeaz contorul de stiv (SP - Stack Pointer) cu
2, corespunztor celor 2 octei i se memoreaz coninutul din src n stiv la adresa efectiv
dat de SP cu adresa de segment dat de SS (Stack Segment).
POP dest extrage din stiv un cuvnt de 16 bii i l plaseaz n dest (reprezentnd un
registru, o locaie de memorie de 16 bii sau un registru de segment), prin operaiile:
dest <- SS:[SP]; SP+ =2 - transfer n dest coninutul din stiv, de la adresa
(segment + efectiv) SS:[SP] i incrementeaz contorul de stiv cu 2.
PUSH immed transfer un cuvnt sau un octet cu semn (specificat de immed) n stiv prin
operaiile: SP- = 2; SS:[SP] <- immed16 (immed8).
Cu ajutorul stivei pot fi salvate i restaurate coninuturile registrelor generale sau biilor
de stare (flag) prin instruciunile (far operanzi):
PUSHA PUSH ALL copiaz registrele generale (AX, BX, CX, DX, SI, DI, BP, SP) i
decrementeaz SP cu 10H (16 zecimal).
POPA POP ALL restaureaz coninutul registrelor generale (AX, BX, CX, DX, SI, DI,
BP, SP) cu datele din stiv i incrementeaz SP cu 10H.
PUSHF PUSH FLAGS decrementaz SP cu 2 i transfer registrul de stare (Flag-uri) la
adresa SS:[SP] din stiv, prin: SP- = 2 ; SS:[SP] <- Reg.Flag.
POPF POP FLAGS - restaureaz coninutul registrului de Flag-uri i incrementeaz SP cu
2, prin: Reg.Flag <- SS:[SP] ; SP+ = 2
Realizai i verificai un program care s efectueze urmtoarele operaii:
* Scrierea imediat din registrul AX a const = 5 n a treia locaie a segmentului specificat de
registrul DS.
* Citirea imediat n registrul BX de la aceeai locaie;
* Scrierea imediat prin registrul BX, a datelor din registrul AX;
* Citirea imediat prin registrul BX, de la aceeai locaie, n registrul CX.
* Iniializarea registrului AX cu valoarea CCh;
* Salvarea n Stiv a lui AX;
* Restaurarea din Stiv BX;

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