4
L 6. ADRESAREA MEMORIEI ŞI STIVEI Adresarea memoriei (RAM): - adresarea imediată, la care, în cadrul instrucţiunii, este specificat chiar codul adresei efective, de exemplu, pentru o instrucţiune 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 instrucţiunii este specificat registrul din care se va lua adresa efectivă. Registrul este unul dintre următoarele: BX, BP,SI, DI. De exemplu, în cazul instrucţiunii: MOV AX, [BX], în zona AL a acumulatorului este încărcat conţinutul locaţiei de memorie a cărei adresă efectivă este conţinută în BX, adresa de segment fiind continută (in mod implicit) în registrul DS. Adresarea Stivei se face mai simplu, informaţiilor de adresă fiind furnizate de registrul SP (Stack Pointer), după regula următoare. La fiecare operaţie de scriere (instrucţiunea PUSH), registrul SP este incrementat (valoarea creşte cu o unitate pentru o operaţie pe cuvânt), iar fiecare operaţie de citire (instrucţiunea POP), registrul SP este decrementat. Astfel, accesul la date se poate face numai secvenţial, după regula LIFO (last input, first out), procedeu care este foarte util în cazul salvării parametrilor programelor la apelul şi la revenirea din subprograme (proceduri). Structura Memoriei Calculatoarele IBM-PC începând cu I 286 lucrează cu memorie virtuală. Conceptul utilizează un spaţiu de adrese extins, mai mare decât memoria adresabilă fizic. Acest lucru este posibil prin maparea (translatarea) adreselor de memorie corespunzătoare fiecărui “task” activ pe spaţiul de memorie disponibil în RAM. În plus sunt folosite o serie de mecanisme specifice de gestionare şi protecţie memoriei. Pe de altă parte se foloseşte memoria paginată, cu pagini de lungime fixă, utilizate la transferul de date şi segmente, în general de lungime variabilă, destinate structurilor de date cu funcţii diferite. Atunci când Asamblorul (sau alt compilator) creează forma executabilă a unui program, acesta generează segmente diferite pentru zona de cod (setul de instrucţiuni), zonele de date, zona de stivă, etc. Codul de adresă a memoriei segmentate este împărţit în două “câmpuri” corespunzătoare “adresei de segment” şi “adresei efective”, din cadrul segmentului. O selecţie a zonei de memorie poate fi vizualizată în partea de jos (spre stânga) a ferestrei programului TD.exe. În acest caz, sunt figurate adresele memoriei (de segment şi efective), corespunzătoare adresei de început a câte unui grup de cuvinte, reprezentate pe fiecare linie. În mod implicit, conţinutul memoriei este reprezentat cu câte 4 cifre Hexa, grupate două câte două, corespunzătoare cuvintelor de 16 biţi. Modul

0Lab_L 6

Embed Size (px)

DESCRIPTION

lab ASC

Citation preview

Page 1: 0Lab_L 6

L 6. ADRESAREA MEMORIEI ŞI STIVEIAdresarea memoriei (RAM):

- adresarea imediată, la care, în cadrul instrucţiunii, este specificat chiar codul adresei efective, de exemplu, pentru o instrucţiune 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 instrucţiunii este specificat

registrul din care se va lua adresa efectivă. Registrul este unul dintre următoarele: BX, BP,SI, DI. De exemplu, în cazul instrucţiunii: MOV AX, [BX], în zona AL a acumulatorului este încărcat conţinutul locaţiei de memorie a cărei adresă efectivă este conţinută în BX, adresa de segment fiind continută (in mod implicit) în registrul DS.

Adresarea Stivei se face mai simplu, informaţiilor de adresă fiind furnizate de registrul SP (Stack Pointer), după regula următoare. La fiecare operaţie de scriere (instrucţiunea PUSH), registrul SP este incrementat (valoarea creşte cu o unitate pentru o operaţie pe cuvânt), iar fiecare operaţie de citire (instrucţiunea POP), registrul SP este decrementat. Astfel, accesul la date se poate face numai secvenţial, după regula LIFO (last input, first out), procedeu care este foarte util în cazul salvării parametrilor programelor la apelul şi la revenirea din subprograme (proceduri).Structura MemorieiCalculatoarele IBM-PC începând cu I 286 lucrează cu memorie virtuală. Conceptul utilizează un spaţiu de adrese extins, mai mare decât memoria adresabilă fizic. Acest lucru este posibil prin maparea (translatarea) adreselor de memorie corespunzătoare fiecărui “task” activ pe spaţiul de memorie disponibil în RAM. În plus sunt folosite o serie de mecanisme specifice de gestionare şi protecţie memoriei. Pe de altă parte se foloseşte memoria paginată, cu pagini de lungime fixă, utilizate la transferul de date şi segmente, în general de lungime variabilă, destinate structurilor de date cu funcţii diferite. Atunci când Asamblorul (sau alt compilator) creează forma executabilă a unui program, acesta generează segmente diferite pentru zona de cod (setul de instrucţiuni), zonele de date, zona de stivă, etc. Codul de adresă a memoriei segmentate este împărţit în două “câmpuri” corespunzătoare “adresei de segment” şi “adresei efective”, din cadrul segmentului. O selecţie a zonei de memorie poate fi vizualizată în partea de jos (spre stânga) a ferestrei programului TD.exe. În acest caz, sunt figurate adresele memoriei (de segment şi efective), corespunzătoare adresei de început a câte unui grup de cuvinte, reprezentate pe fiecare linie. În mod implicit, conţinutul memoriei este reprezentat cu câte 4 cifre Hexa, grupate două câte două, corespunzătoare cuvintelor de 16 biţi. Modul de reprezentare poate fi schimbat, folosind meniul de la baza ferestrei (<Ctrl><D>). Prin comanda “<CTRL><G>” se poate realiza poziţionarea î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ă conţină declaraţia “.data” înaintea începerii zonei de cod. Aceasta va duce la generarea adresei de segment de date, în procesul de asamblare, la o locaţie de memorie stabilită de sistemul de operare, prin mijloacele de gestiune ale memoriei virtuale.În plus, programul trebuie să realizeze iniţializarea registrului DS, conţinând adresa segmentului de date. Aceasta se face prin intermediul unui registru general (AX, de exemplu) prin următoarele instrucţiuni: Mov ax, @data; Mov ds, axCu ajutorul simbolului “@data” este accesibilă adresa segmentului de date, care este generată de Asamblor şi care va fi plasată la în registrul DS. Funcţionarea StiveiStiva este o structură de memorie, generată de obicei în zona RAM (mai rar pe disc) cu un mecanism de adresare special. În momentul generării (declarării) Stivei se stabileşte o “adresă de bază” care va fi conservată pe parcursul activităţii programului. Scrierile în Stivă au loc la adrese succesive, începând cu adresa de bază, în ordine crescătoare sau descrescătoare. Acestea sunt generate prin incrementarea respectiv decrementarea unui numărător special, din cadrul structurii procesorului, numit “contor de stivă” (SP – stack pointer), al cărui conţinut reprezintă adresa vârfului stivei. Conţinutul acestuia poate fi vizualizat cu programul de monitorizare (TD.exe) în colţul din dreapta, jos cu notaţia “ss”. Adresa de stivă conţine un câmp corespunzător segmentului şi unul corespunzător adresei efective. Citirile din stivă se fac tot la adrese succesive, dar parcurse în ordine inversă, prin acţionarea în sens invers a contorului de stivă. Acest mod de adresare este de tip “LIFO” (“last input, first output” – ultimul intrat, primul ieşit) şi este deosebit de eficient în anumite faze de funcţionare a programului, cum ar fi

Page 2: 0Lab_L 6

lucrul cu subprograme (“subrutine”, proceduri, funcţii) sau lucrul “multi-task” (programe paralele). Astfel, atunci când un program este întrerupt de apelul unei proceduri sau chiar de alt program, informaţiile referitoare la starea execuţiei programului sunt păstrate în stivă. Structura de stivă este foarte avantajoasă în cazul apelurilor de proceduri incluse unele în altele, când recuperarea datelor trebuie făcută în ordine inversă, la ieşirea din proceduri.Lucrul cu MemoriaTransferurile “la” şi “din” memorie se pot face prin intermediul instrucţiunilor de transfer de tip “Mov”. Datele transferate vor fi plasate în memorie la o adresă efectivă, în cadrul unui segment de date, având adresa de bază plasată în registrul DS.De exemplu, prin instrucţiunile de mai jos, este încărcată o anumită locaţie de memorie cu o valoare data (10h): Mov ax,10h; Mov bx,0h; Mov [bx+2],axPrima instrucţiune încarcă constanta, în notaţie Hexa, “10h” în registrul AX. Cea de-a doua încarcă registrul BX cu valoarea corespunzătoare unei adrese efective (0h). Ultima instrucţiune încarcă conţinutul registrului AX în locaţia 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 locaţii de memorie. Constanta “2” joacă rolul unui “deplasament”, adică o translaţie (deplasare) relativă la adresa indicată de BX. Pentru valoarea deplasamentului poate fi utilizat registrul SI, aşa cum se arată în exemplu următor: Mov ax,10; Mov bx,1; Mov si,2; Mov [bx+si],axSe poate spune că realizăm o adresare indexată, registrul SI conţinând valoarea indexului, valoarea “bx+si” arătând deplasarea fata de baza segmentului. Trebuie menţionat că folosirea registrului BX este necesară chiar dacă conţine valoarea zero.În cazul procesoarelor din familia Intel 80x86, registrele au, de regulă, şi o funcţie 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 instrucţiuni de tip “Push”, iar citirile de date se fac prin instrucţiuni de tip “Pop” (descrise în TECH.exe). Aceste instrucţiuni pot acţiona asupra unor tipuri de operanzi cu semnificaţii diferite, şi au sintaxa de mai jos (menţionăm că la aceste procesoare adresele scad, pe măsură ce stiva se umple): “PUSH src” – memorează în stivă conţinutul specificat în “src” (reprezentând un registru sau o locaţie de memorie de 16 biţi) realizând operaţiile:

SP - = 2 ; SS:[SP] <- src - se decrementează contorul de stivă (SP - Stack Pointer) cu 2, corespunzător celor 2 octeţi şi se memorează conţinutul 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 cuvânt de 16 biţi şi îl plasează în “dest” (reprezentând un registru, o locaţie de memorie de 16 biţi sau un registru de segment), prin operaţiile:

dest <- SS:[SP]; SP+ =2 - transferă în “dest” conţinutul din stivă, de la adresa (segment + efectivă) SS:[SP] şi incrementează contorul de stivă cu 2.PUSH immed – transferă un cuvânt sau un octet cu semn (specificat de “immed”) în stivă prin operaţiile: SP- = 2; SS:[SP] <- immed16 (immed8).Cu ajutorul stivei pot fi “salvate” şi “restaurate” conţinuturile registrelor generale sau biţilor de stare (flag) prin instrucţiunile (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ă conţinutul 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ă conţinutul registrului de Flag-uri şi incrementează SP cu 2, prin: Reg.Flag <- SS:[SP] ; SP+ = 2

Realizaţi şi verificaţi un program care să efectueze următoarele operaţii: * Scrierea imediată din registrul AX a const = 5 în a treia locaţie a segmentului specificat de registrul DS. * Citirea imediată în registrul BX de la aceeaşi locaţie; * Scrierea imediată prin registrul BX, a datelor din registrul AX; * Citirea imediată prin registrul BX, de la aceeaşi locaţie, în registrul CX.* Iniţializarea registrului AX cu valoarea CCh; * Salvarea în Stivă a lui AX; * Restaurarea din Stivă BX;