Wednesday, December 13, 2017

Optimizarea alocării de memorie la definirea operanzilor

În limbajul de asamblare operanzii care se definesc folosesc descriptorii care au următoarele lungimi și restricții de aliniere:
dt - operandul are lungime de 10 bytes și adresa trebuie să fie un număr divizibil prin 2;
dq - operandul are lungime de 8 bytes și adresa trebuie să fie un număr divizibil prin 8;
dd - operandul are lungime de 4 bytes și adresa trebuie să fie un număr divizibil prin 4;
dw - operandul are lungime de 2 bytes și adresa trebuie să fie un număr divizibil prin 2;
db- operandul are lungime de 1 byte și adresa trebuie să fie un număr divizibil prin 1.
Dacă într-un program ASM se scriu primii operanzii definiți cu descriptorul dq apoi cei cu descriptorul dd, apoi cei cu descriptorul dt și  dw, iar numai în final toți operanzii cu descriptorul db contotul de locații va efectua amplasări compacte, pentru că sunt respectate cerințele de divizibilitate.
În secvența:

a              dq      15
b              dq      31
c              dq      100
x1            dw     40
x2            dw     110
x3            dw     564
y1            dt       4000
y2            dt       8000
z1            db       11
z2            db       3
z3            db       111
z4            db       1
se alocă 3*8+3*4+2*10+4*1 = 60 de bytes.
Dacă se construiește secvența:
a              dq      15
z1            db       11
b              dq      31
z2            db       3
c              dq      100
x1            dw     40
z3            db       111
x2            dw     110
x3            dw     564
y1            dt       4000
z4            db       1
y2            dt       8000
rezultatul este absolut nefavorabil pentru că necesarul de zonă de memorie va impune alinieri și deci bytes neutilizați. În cazul operanzilor care nu sunt aliniați se vor executa operațiile dar forțarea necesită cicluri suplimentare.
Lungimea se calculează după expresia:
L = 8+1+7+8+1+7+8+2+1+1+2+2+10+10= 75 bytes.
Cei 15 bytes apar pentru a fi respectată cerința de aliniere, adică divizibilitatea cerută de descriptori. În acest caz este vorba de un supliment de memorie care se evită prin regruparea tipurilor de operanzi. dacă însă un operand este definit la o adresă impară, el va fi referit cu un număr mai mare de cicluri mașină, ceea ce scade eficiența prelucrării.
Optimizarea alocării de memorie la definirea operanzilor este un mod de a face economie de memorie și de a reduce numărul de cicluri mașină, știindu-se că în assembler se face orice, cu orice. Totul depinde de programator.






(13 decembrie 2017)

No comments:

Post a Comment