Sunteți pe pagina 1din 9

174

12 Adresarea memoriei
Modurile de adresare constituie un instrument principal pentru
reprezentarea n memorie a imaginii datelor, aa cum este aceasta vzut
de programatorul n limbaj de nivel nalt. Ele permit programatorului s
construiasc i s utilizeze structuri complexe de date, n timp ce
echipamentul poate trata doar matrice lineare cu elemente de dimensiune
fix. Pentru accesul la un element al unei structuri complexe de date
trebuie evaluat adresa de memorie ce corespunde nceputului zonei de
memorie n care se pstreaz acel element. De regul, aceast operaie se
efectueaz prin mai multe instruciuni, utiliznd mai multe moduri de
adresare.
Cu ct calculele efectuate n cadrul modului de adresare sunt mai
complexe, cu att numrul mediu de instruciuni, cerut de accesul la un
element al unei structuri complexe de date, este mai mic.

12.1 Elemente de baz privind modurile de adresare


Modurile de adresare utilizate de diferite microprocesoare sunt
foarte variate. Ele prezint ns o caracteristic general: fiecare mod se
obine ca o combinaie ntre un numr relativ mic de obiecte i funcii
(operaii) de baz.
Se consider c un obiect sau funcie sunt fundamentale dac, n
absena acelui obiect sau funcie unitatea de adresare nu este capabil s
genereze nici un mod de adresare.
n consecin, obiectele fundamentale sunt registre i deplasamente
sau offset - uri coninute n instruciune iar funciile fundamentale sunt
adunarea, deplasarea i adresarea indirect. Operaia de deplasare ar putea
fi nlocuit cu adunri sau scderi, ns timpul consumat pentru adresare
ar fi prea mare, aa nct este considerat funcie fundamental. Adunarea
include i operaiile de incrementare i decrementare, cazuri particulare de
adunri.
Registre. Sunt situate n unitatea central de prelucrare, n unitatea
aritmetic i n cea de gestiune a memoriei. Principalele roluri ale
registrelor n ceea ce privete modurile de adresare sunt:
registru operand: coninutul registrului este chiar operandul la care
se face referire;

175
registru adres : coninutul registrului este adresa operandului la care
se face referire (operand n memorie);
registru de baz : registrul conine o adres care, pentru obinerea
adresei complete a operandului, va fi utilizat mpreun cu coninutul
unui alt registru sau cu un deplasament;
Offset -uri. Sunt coninute n instruciune (cmp imediat) i sunt
utilizate mpreun cu coninutul unui registru pentru calculul adresei unui
operand din memorie.
Cmpul imediat este un cmp opional al unei instruciuni i acesta
poate fi:
chiar operandul utilizat de instruciune (operand imediat);
adresa complet a operandului (adres imediat);
un deplasament (offset) care va fi implicat n adresare.
Adunarea. Toate modurile de adresare, cu excepia celor mai
simple, necesit adunarea a dou sau mai multe valori pentru obinerea
adresei; operaiile de incrementare / decrementare sunt considerate cazuri
particulare de adunare.
Adresarea indirect. Este o funcie al crei argument este dat de
rezultatele unor calcule iar valoarea este adresa operandului din memorie.
Modurile complexe de adresare pot folosi de mai multe ori adresarea
indirect pentru generarea adresei finale a operandului.
Deplasarea. Este mutarea cu una, dou sau mai multe poziii binare,
spre stnga, a valorii binare a unui parametru de adresare. Se utilizeaz n
cadrul operaiei de indexare, care la rndul su se folosete n adresarea
tablourilor. Indexarea produce deplasamentul (offset-ul) unui element din
tablou pe baza valorilor indicilor si.
Fie a[i], i = 0, 1, 2, . . . , n, un tablou unidimensional format din
elemente de lungime w (n octei); atunci adresa relativ a elementului a[i]
fa de baza tabloului a[0] va fi offset(a[i]) = i * w . Cum lungimea unui
element este de regul 1, 2, 4 sau 8 octei, deplasarea se face respectiv cu
0, 1, 2 sau 3 poziii binare, ceea ce este echivalent cu nmulirea cu 1, 2, 4
sau 8 a valorii lui i. Operaia de deplasare se face mult mai rapid dect
nmulirea, ceea ce o recomand pentru includerea n funciile de baz
pentru adresare.
12.1.1. Formatul instruciunilor
Instruciunile procesorului Intel 8086 sunt codificate pe un numr de
octei cuprins ntre 1 i 6. Formatul sau structura instruciunii arat rolul
fiecrui octet i al cmpurilor de bii coninute n fiecare octet.

176
Primul octet conine codul operaiei (pe 6 bii), adic tipul
prelucrrilor ce vor fi efectuate la execuia instruciunii ( operaie
aritmetic, logic, transfer de date, salt etc.).
Al doilea octet conine informaii privind adresarea memoriei,
registrele n care se afl operanzii, lungimea acestora, lungimea
deplasamentului.
octet 1

cod

octet 3

deplasament - L

octet 5

data - L

mod

reg

R/M

deplasament - H

data - H

cod

octet 2

octet 4

octet 6

Variante de instruciuni cu:


1, 2, 3, 4, 5, 6 octei
data = operand imediat
deplasament = adres direct

cod

mod r/m

cod

mod r/m

depl / data

cod

mod r/m

depl / data depl / data

cod

mod r/m

depl.L

depl.H

data

cod

mod r/m

depl.L

depl.H

data L

data H

Fig.1 Formatul instruciunilor la Intel 8086

Octeii 3, 4, 5 i 6 pot avea semnificaia de deplasament pe 8 sau 16


bii, date pe 8 sau 16 bii sau deplasament i date, conform figurii 1.
Pe lng formatul propriu-zis, mai poate exista un prefix de segment
sau un prefix de repetare.
La instruciunile cu doi operanzi, un operand este n mod obligatoriu
ntr-un registru, precizat de cmpul REG iar cellalt operand este n
registru sau n memorie, variantele fiind determinate de cmpurile R/M i
MOD.
Semnificaia cmpurilor:
D (destination) = destinaie; codific sensul operaiei:
D = 0 cmpul REG indic operandul destinaie;
D = 1 cmpul REG indic operandul surs.
De exemplu, codurile instruciunilor
add [cx], ax
add ax, [cx]
difer numai prin cmpul D (aceeai operaie, aceiai operanzi dar difer
sensul de transfer).

177
W (word) = cuvnt; codific lungimea operanzilor (octet sau cuvnt):
W = 0 operaie la nivel de octet;
W = 1 operaie la nivel de cuvnt.
REG - indic registrul care conine unul din operanzi. Dimensiunea
registrului specificat depinde de bitul W.
REG

W=0

W=1

000

AL

AX

001

CL

CX

010

DL

DX

011

BL

BX

100

AH

SP

101

CH

BP

110

DH

SI

111

BH

DI

R/M (register / memory) - cmp registru / memorie; d informaii


despre al doilea operand fiind dependent de cmpul MOD. Dac
MOD = 11, atunci R/M indic registrul care conine al doilea operand
iar n celelalte cazuri R/M indic registrul implicat n formarea
adresei efective pentru al doilea operand.
MOD
11
00
01
11
R/M W = 0 W = 1
000

AL

AX

(BX) + (SI)

(BX) + (SI) + d8

(BX) + (SI) + d16

001

CL

CX

(BX) + (DI)

(BX) + (DI) + d8

(BX) + (DI) + d16

010

DL

DX

(BP) + (SI)

(BP) + (SI) + d8

(BP) + (SI) + d16

011

BL

BX

(BP) + (DI)

(BP) + (DI) + d8

(BP) + (DI) + d16

100

AH

SP

(SI)

(SI) + d8

(SI) + d16

101

CH

BP

(DI)

(DI) + d8

(DI) + d16

110

DH

SI

BP

(BP) + d8

(BP) + d16

111

BH

DI

(BX)

(BX) + d8

(BX) + d16

n tabelul de mai sus, d8 i d16 reprezint deplasament pe 8 bii,


respectiv pe 16 bii; acestea sunt specificate explicit n instruciuni.

12.2 Modurile de adresare a memoriei


Instruciunile microprocesorului 8086 pot avea unul sau doi operanzi
care pot fi coninui n registre sau n memorie. Cnd exist doi operanzi,
unul este n mod obligatoriu ntr-un registru (nu pot fi ambii operanzi n
memorie).

178
Dac ambii operanzi sunt n registre, nu este necesar adresarea
memoriei. Modurile de adresare specific modul n care se calculeaz
adresa operandului din memorie. Se utilizeaz denumirea de adres de
segment (AS) pentru adresa de nceput a segmentului de memorie n care
se afl operandul i adres efectiv (AE), pentru deplasamentul (offsetul) operandului n cadrul segmentului. Adresa de segment este furnizat de
unul din cele 4 registre de segment.
BX

BX

SI

BP

BP

DI

SI
DI

8 sau 16 bii
Deplasament

Adres efectiv

19

Adres efectiv

CS

SS

DS

ES

19

0
Adresa fizic

Fig. 2 Schema general a modurilor de adresare la Intel 8086

Adresare imediat
n acest mod de adresare, operandul este coninut n instruciune. Nu
este necesar accesul la memoria extern, deoarece toi octeii instruciunii
sunt ncrcai n procesor la extragerea ei din memorie, din segmentul de
cod. Exemplu:
mov ax, 07FF
add bx, 044C
Adresarea direct

179
Adresa efectiv a operandului se obine din cmpul deplasament al
instruciunii care poate fi pe un octet sau pe doi octei; este un
deplasament n interiorul segmentului curent de date.
.data
DEP dw 1200H
.code
mov bx, DEP ; la asamblare DEP se va nlocui cu offset-ul n
; cadrul segmentului de date; n final bx=1200H.
add cx, [200] ; deplasament explicit n instruciune
Acest mod de adresare utilizeaz implicit registrul segment DS.
Cod instruciune

Mod R/M

Deplasament (8 sau 16 bii)


Adresa efectiv (16 bii)

Fig.3 Adresarea direct: adresa este coninut n instruciune

Adresarea indirect (prin intermediul registrelor)


Adresa efectiv a operandului este dat de coninutul registrelor BX,
BP, SI sau DI. Se utilizeaz ca registru segment implicit SS cu BP i DS
n celelalte cazuri.
Cod instr.

Mod R/M
BX
BP

Adresa efectiv

SI
DI
Fig.4 Adresarea indirect: adresa efectiv este coninut ntr-un registru
de baz sau index

Exemple:
mov cx, [bx]
mov [di], cx
add byte ptr

[si], 7

; pune n cx cuvntul cu adresa n bx


; pune cx n memorie, la adresa din di
; adun 7 la octetul cu adresa n si

n primele dou instruciuni operandul din memorie este considerat


de 16 bii datorit registrului de 16 bii implicat n transfer. n
instruciunea a treia, operandul este octet; dac s-ar fi scris :
add [si], 7

180
asamblorul nu ar ti dac operandul din memorie este pe 8 sau pe 16 bii
i se genereaz un mesaj de eroare la asamblare. Considernd operandul
pe 8 bii se poate obine un rezultat diferit (dect cu operand pe 16 bii),
n cazul n care prin adunarea cu 7 se depete valoarea 255 sau FFH.
Adresarea indirect cu deplasament (bazat sau indexat)
Adresa efectiv se obine prin adunarea la unul din registrele de
baz (BX, BP) sau index (SI, DI), un deplasament constant pe 8 sau 16
bii. Registrul de segment implicit este DS (dac se folosesc BX, SI sau
DI) i SS dac se folosete pentru adresare BP.
Cod instr.

Mod R/M

Deplasament - 8 sau 16 b.
BX
BP
SI
DI

Adresa efectiv

Fig.5 Adresarea indirect cu deplasament

Exemplu:
.data
TAB
.code
mov
mov
mov
mov
mov

dw
bx,
ax,
cx,
dx,
bp,

10

dup (0)

; definire tablou de 10 elem .

5
TAB [bx]
bx [TAB]
[bx +TAB]
[bx].TAB

Se utilizeaz diverse forme de scriere pentru acelai efect; n bx


este, din punct de vedere al mecanismului de adresare, o adres de baz
iar TAB este un deplasament constant. Pentru programul care acceseaz
elementele tabloului, semnificaia este invers: TAB este adresa de
nceput a tabloului (deci adres de baz) iar bx este un indice
(deplasament).
Un alt mod de acces la elementele tabloului este prin ncrcarea n
bx a adresei de baz (folosind operatorul offset) i un indice explicit:
mov bx,

offset TAB

; adresa de baz este adresa de


; nceput a tabloului

mov ax,
mov ax,
mov ax,

5 [bx]
bx [5]
[bx + 5]

181
mov ax, [bx] . 5
Observaie:
n textul surs, toate formele de adresare se scriu cu operatorul de
indexare (paranteze drepte).
mov cx, [bx]
; adresare indirect
mov cx, [200]
; adresare direct
mov cx, [bx + 200]
; adresare bazat
Folosirea registrului BP cu un deplasament nul este o scriere
asemntoare cu adresarea indirect dar care este codificat intern ca
adresare bazat:
mov ax, [bx]
; adresare indirect
mov ax, [bp]
; adresare bazat cu deplasament 0
Adresarea bazat i indexat
Adresa efectiv se obine prin adunarea unui registru de baz (BX
sau BP) cu un registru index (SI sau DI) i cu un deplasament de 8 sau 16
bii.
Cod instr.

Mod R/M

Deplasament - 8 sau 16 b.
BX
BP
SI
DI

Adresa efectiv

Fig.6 Adresarea bazat i indexat

Registrele segment utilizate implicit sunt: DS (n cazul folosirii lui


BX cu SI sau DI) i SS (dac se folosete BP cu SI sau DI);
deplasamentul poate fi nul.
mov
mov
mov
mov

ax,
ax,
ax,
ax,

[bx] [si]
[bx + si + 9]
[bx + si] . 9
[bp] [di] [9]

n descrierea modurilor de adresare a fost precizat de fiecare dat


registrul segment care particip n mod implicit la formarea adresei fizice.
Regula general este urmtoarea: n toate modurile de adresare n care nu

182
particip BP, registrul segment implicit este DS; dac particip BP,
registrul segment implicit este SS.
Regula de mai sus poate fi ignorat dac se utilizeaz prefixele de
segment n textul surs (segment explicit):
mov bx,
mov ax,
mov cx,

ds: [bp + 7]
cs: [si] [bx + 5]
ss: [bx]

; registrul segment explicit DS


; registrul segment explicit CS
; registrul segment explicit SS

n adresarea memoriei (cu un registru segment implicit sau explicit),


controlul asupra datelor ce se afl n memorie n segmentul respectiv cade
n sarcina programatorului, care trebuie s aib n vedere permanent "harta
memoriei", adic modul de organizare a datelor n memorie.