Vous êtes sur la page 1sur 39

Practic hardware

I. Structuri

Practic hardware

Tipul struct
colec ie de variabile (membri)
accesate printr-un nume comun

ar putea fi i variabile independente atunci de ce le grup m?


logica aplica iei impune tratarea lor comun mai u or de gestionat variabilele respective
2

Practic hardware

Reprezentare intern
membrii sunt plasa i n memorie unul dup altul la adrese consecutive
adresa de nceput a primului membru = adresa de nceput a structurii adresa de nceput a fiec rui membru = suma dimensiunilor membrilor preceden i

sau nu?
3

Practic hardware

Exemplu
struct S { char a,b; int c; double d; char e; short f; };
4

Practic hardware

Exemplu (cont.)
S s; printf("Dimensiune structura: %d\n",sizeof(s)); printf("start:\t%p\n",&s); printf("a:\t%p\t%2d\n",&s.a,(int)&s.a-(int)&s); printf("b:\t%p\t%2d\n",&s.b,(int)&s.b-(int)&s); printf("c:\t%p\t%2d\n",&s.c,(int)&s.c-(int)&s); printf("d:\t%p\t%2d\n",&s.d,(int)&s.d-(int)&s); printf("e:\t%p\t%2d\n",&s.e,(int)&s.e-(int)&s); printf("f:\t%p\t%2d\n",&s.f,(int)&s.f-(int)&s);
5

Practic hardware

Rezultat - exemplu de afi are


Dimensiune structura: 24 start: 0012FF4C a: 0012FF4C 0 b: 0012FF4D 1 c: 0012FF50 4 d: 0012FF54 8 e: 0012FF5C 16 f: 0012FF5E 18
6

Practic hardware

Interpretare
variabila c ncepe la deplasament 4
n loc de 2

variabila f ncepe la deplasament 18


n loc de 17

dimensiunea structurii - 24
ar fi trebuit s fie 17 sau 20, dac inem cont de cele de mai sus
7

Practic hardware

Alinierea adreselor (1)


deplasamentul fiec rui membru este multiplu de dimensiunea sa motiva ie
transferurile cu memoria sunt mai simple ocuparea memoriei este mai u or de gestionat

efect - ntre membrii structurii pot ap rea spa ii nefolosite


8

Practic hardware

Alinierea adreselor (2)


dezavantaj
consum de memorie m rit n principiu, ne putem permite

alinierea poate fi dezactivat Project p Properties p C/C++ p Code Generation p Struct Member Alignment: 1 Byte (n loc de Default)
9

Practic hardware

Dimensiunea structurii (1)


de multe ori este mai mare dect suma dimensiunilor membrilor
consecin a alinierii adreselor pot fi spa ii neutilizate ntre unii membri poate fi un spa iu neutilizat la finalul structurii

10

Practic hardware

Dimensiunea structurii (2)


exemplu S t[2]; printf("\nt[0]: %p\nt[1]: %p\n",&t[0],&t[1]); rezultat afi are t[0]: 0012FF14 t[1]: 0012FF2C
11

Practic hardware

De ce ne intereseaz ?
calculul adreselor elementelor din tablourile de structuri
vezi anterior

sunt i alte situa ii n care informa ia este important


exemplu - citirea unei imagini dintr-un fi ier n format BMP
12

Practic hardware

Structur header BMP


typedef struct { unsigned char magic[2]; unsigned long filesz; unsigned short creator1; unsigned short creator2; unsigned long bmp_offset; } bmpfile_header_t;
13

Practic hardware

Citire header
bmpfile_header_t bh; FILE *fBMP=fopen("f.bmp","r"); // citire header fisier fread(&bh,sizeof(bh),1,fBMP); // ... fclose(fBMP);
14

Practic hardware

Probleme
sizeof(bh)=16 n fi ier nu exist aliniere trebuie citi i 14 octe i deplasamentele cmpurilor sunt la rndul lor incorecte e mai sigur s citim membrii unul cte unul
15

Practic hardware

Func ii cu parametri structuri


limbajul C nu permite transmiterea structurilor ca parametri
doar pointeri la structuri limbajul C++ o permite, dar cazul s u l vom discuta mai trziu

accesarea membrilor
pe stiv avem doar un pointer, nu toat structura aten ie la aliniere
16

Practic hardware

Returnarea valorilor din func ii


unde trebuie pus rezultatul pentru a fi returnat? n mod uzual - registrul eax
sau al/ax pentru dimensiuni mai mici

dar dac vrem s return m un tip mai mare de 4 octe i?


17

Practic hardware

Unde apare problema


tipurile elementare nu dep esc 4 octe i tipul double este returnat prin unitatea de virgul mobil
nu ne intereseaz aici

structuri
nu pot fi returnate n limbajul C
doar pointeri la structuri

dar n C++ este posibil


18

Practic hardware

Solu ii (1)
depinde de compilator
aici discut m despre Visual Studio

structur cu dimensiune pn n 8 octe i


regi trii edx (partea mai semnificativ ) i eax

ce nseamn parte mai semnificativ ?


Intel - adresare little-endian partea mai semnificativ dintr-un operand - cea aflat la o adres mai mare n memorie
19

Practic hardware

Solu ii (2)
structur cu dimensiune mai mare de 8 octe i
se mai transmite un parametru ascuns (nu apare n lista de parametri) adresa structurii care trebuie completat cu rezultatul acest parametru este plasat la adresa [ebp+8] deci primul parametru "real" se g se te acum la [ebp+12]
20

Practic hardware

II. Referin e i pointeri

Practic hardware

Ce este o referin

nu apare n limbajul C introdus n C++ reprezint un alt nume (alias) pentru o variabil deja existent

22

Practic hardware

Declarare
int a; int &b=a; b este o referin pentru a a nu se confunda cu operatorul adres moduri incorecte de declarare: int &b; int &b=20;
23

Practic hardware

Utilizare
int a; int &b=a; a=3; b=5; printf("%d\n",a); rezultat afi at: 5 deci a fost modificat chiar variabila a
24

Practic hardware

Reprezentare intern (1)


ne putem gndi la dou posibilit i a) compilatorul folose te dou nume diferite pentru aceea i loca ie de memorie b) b este de fapt un pointer c tre adresa variabilei a

25

Practic hardware

Reprezentare intern (2)


a=3; _asm { mov b,5 } printf("%d\n",a); rezultat afi at: 3 dac erau dou nume pentru aceea i loca ie, s-ar fi afi at 5
26

Practic hardware

Reprezentare intern (3)


a=3; _asm { mov eax,b mov dword ptr [eax],5 } printf("%d\n",a); rezultat afi at: 5
27

Practic hardware

Reprezentare intern (4)


deci b este de fapt o variabil separat
pointer - con ine adresa variabilei a

compilatorul ascunde aceste detalii se dore te s privim b ca pe un alt nume pentru a putem verifica prin afi area adreselor variabilelor a i b
28

Practic hardware

Preluare adrese din C++


int a; int &b=a; int *p1,*p2; p1=&a; p2=&b; printf("%p\n%p\n",p1,p2);

rezultat afi are 0012FF60 0012FF60 deci C++ raporteaz aceea i adres

29

Practic hardware

Preluare adrese din ASM


int a; int &b=a; int *p1,*p2; _asm { lea eax,a mov p1,eax lea eax,b mov p2,eax } printf("%p\n%p\n",p1,p2);

rezultat afi are 0012FF60 0012FF54 adresele sunt de fapt diferite

30

Practic hardware

Utilitate (1)
referin ele sunt deci pointeri avantaj - mai u or de lucrat dect cu pointerii
nu mai trebuie s folosim operatorii & (adres ) i * (dereferen iere) p mai pu ine gre eli

dezevantaj - mai pu in flexibile


o referin este legat de o singur variabil pe toat durata existen ei sale
31

Practic hardware

Utilitate (2)
referin ele nu pot deci nlocui pointerii n toate situa iile
exemplu - parcurgerea elementelor unui tablou

char s[]="abcd",*p; for(p=s;*p!='\0';p++) // ... unde sunt totu i utile? cel mai des folosite - parametri pentru func ii
32

Practic hardware

Referin e ca parametri (1)


void f(int &m) {//...} int x; f(x); parametrul m este o referin pentru variabila x orice modificare asupra lui m se reflect asupra lui x p transfer prin referin
33

Practic hardware

Referin e ca parametri (2)


aten ie la ce nseamn referin void f(int &m) {//...} f(5); eroare la compilare - referin a este o adres la fel ca n cazul pointerilor
34

Practic hardware

Referin e vs. pointeri (1)


care este de preferat? unde le putem folosi pe ambele - referin e
sintax mai simpl

n unele situa ii putem folosi doar pointeri cum stau lucrurile la nivelul limbajului de asamblare?
nici o diferen ntre referin e i pointeri
35

Practic hardware

Referin e vs. pointeri (2)


void add_3(int *x) { _asm { mov eax,x add dword ptr [eax],3 } } void add_3(int &x) { _asm { mov eax,x add dword ptr [eax],3 } }
36

Practic hardware

Pointeri dubli
un pointer con ine adresa unei variabile aceast variabil poate fi la rndul s u un pointer
.a.m.d. (foarte rar)

trebuie mult aten ie la tratarea lor


37

Practic hardware

Exemplu
o func ie pentru inserarea unui element ntro list nl n uit parametru - capul listei ce tip are?
pointer dar dac elementul trebuie inserat nainte de primul din list ? modific m capul listei - ne trebuie adresa sa
38

Practic hardware

Mai des dect credem


n limbajul de asamblare, pointerii dubli apar frecvent void f(int *x) mov eax,[ebp+8] // [ebp+8] - pointer dublu mov dword ptr [eax],5 // *x=5; eroare comun mov dword ptr [ebp+8],5
39

Vous aimerez peut-être aussi