Mod de adresare

De la Wikipedia, enciclopedia liberă
Salt la: Navigare, căutare

În arhitectura calculatoarelor, modul de adresare reprezintă felul în care se calculează adresa de memorie a unui operand în momentul execuției unei instrucțiuni de către procesor, folosind în acest scop informația aflată în registrele procesorului sau chiar în codul mașină al instrucțiunii.

Aspecte generale[modificare | modificare sursă]

Codul operației reprezintă doar o parte din dimensiunea totală a unei instrucțiuni, așa cum este ea reprezentată în memorie. Restul spațiului este folosit pentru a preciza operanzii, adică acele date necesare execuției operației, fie că operațiile se efectuează asupra lor, fie că reprezintă o valoare ce controlează fluxul ulterior al programului (ca, de exemplu, în cazul instrucțiunilor de salt).

Multitudinea modurilor de adresare provine din necesitatea de a echilibra dorința de a putea adresa spații mari de memorie și parametri calculați pe parcurs, ale căror valori nu sunt cunoscute în momentul scrierii programului, cu cea de a face codul să se execute într-un timp cât mai scurt.

Operarea procesorului se efectuează cu o viteză controlată mai ales de ceasul procesorului (în majoritatea PC-urilor moderne, acesta este de ordinul gigahertzilor), așa că pentru a executa codul cât mai rapid, este de dorit ca operanzii să nu mai fie încărcați din memorie, ci să fie direct accesibili procesorului, fie efectiv din codul instrucțiunii, fie în registre, dar pentru aceasta este nevoie ca operanzii să fie cunoscuți în momentul scrierii codului sau al compilării. Dacă aceasta nu este posibilă, sau dacă spațiul relativ restrâns de memorare disponibil pe procesor este insuficient pentru volumul de date prelucrat de program, atunci operanzii trebuie să fie încărcați din memorie.

Accesul la memorie este mai lent decât accesul la spațiile de stocare de pe procesor. Deși procesoarele pot dispune de o memorie cache aflată pe procesor, și în care sunt stocate câteva date accesate frecvent din memoria principală, de regulă este de așteptat ca un acces la memorie să fie de cel puțin un ordin de mărime mai lent decât lucrul cu registrele sau decât prelucrarea instrucțiunii. Limitarea vitezei accesului la memorie făcut de procesor provine din magistrala FSB, care de regulă are frecvențe de lucru de ordinul sutelor de megahertzi (deși pe un ciclu de ceas FSB se pot efectua două sau patru transferuri), dar mai ales din latența CAS a memoriei, latență care în anii 1990 și 2000 nu a putut fi scăzută atât de repede cât a fost crescută frecvența ceasului procesorului, rămânând de ordinul nanosecundelor.

Necesitatea de a adresa cantități mari de memorie face ca dimensiunea adresei de memorie să devină prea mare pentru a încăpea integral în codul mașină și astfel, tehnicile de adresare devin mai complexe.

Moduri de adresare[modificare | modificare sursă]

Adresarea imediată[modificare | modificare sursă]

Adresarea imediată este cel mai simplu și mai rapid mod de a transmite operandul. Operandul este transmis direct în corpul instrucțiunii, nemaifiind necesară accesarea memoriei. Dar acest mod de adresare poate fi folosit doar în cazul în care valoarea operandului este cunoscută la momentul scrierii programului sau poate fi determinat la compilare. În plus, valorile transmite nu pot lua valori prea mari din cauza dimensiunii limitate a spațiului disponibil în cadrul instrucțiunii.[1]

Adresarea prin registre[modificare | modificare sursă]

Adresarea prin registre este similară cu cea imediată, prin aceea că nu implică accesarea memoriei, fiind un mod de adresare folosit tot pentru mărirea vitezei de execuție. Avantajul față de adresarea directă sau față de cea imediată îl reprezintă faptul că nu mai este necesar ca valoarea operandului să fie cunoscută la compilare, el fiind preluat dintr-un registru al procesorului, registru precizat în codul instrucțiunii. Compilatoarele cu optimizare caută să folosească la maximum acest mod de adresare, identificând la compilare variabile folosite intens în anumite porțiuni de cod și aducându-le din memorie într-un registru, pentru ca instrucțiunile ulterioare să acceseze valoarea de acolo. Astfel, se economisesc accesări ale memoriei (care se efectuează la viteze mai mici decât viteza de operare a procesorului), variabila fiind adusă din memorie o singură dată pentru a fi folosită ca operand de mai multe instrucțiuni succesive.[2]

Adresarea directă[modificare | modificare sursă]

În cazul adresării directe, în cadrul instrucțiunii se precizează adresa exactă de memorie a operandului. Acest mod de adresare este util în condițiile în care adresa de memorie a operandului este cunoscută în momentul compilării, așa cum este cazul cu variabilele globale, a căror adresă nu se modifică pe timpul rulării unui program.[3]

Note[modificare | modificare sursă]

  1. ^ Tannenbaum, sec. 5.4.2, p. 310
  2. ^ Tannenbaum, sec. 5.4.4, p. 311
  3. ^ Tannenbaum, sec. 5.4.3, p. 311

Bibliografie[modificare | modificare sursă]

  • Tannenbaum, Andrew (1999). Organizarea structurată a calculatoarelor (ed. Ediția a patra). București: Computer Press Agora. ISBN 973-97706-4-9