asm6

download asm6

If you can't read please download the document

description

info

Transcript of asm6

Pointeri.Pentru a intelege cum se folosesc tablourile in ASM, trebuie inteles mai intai conceptul de pointer.Pointer-ul reprezinta o variabila ce pastreaza o adresa de memorie a unei date ("pointeaza" spre o adresa de memorie). Un pointer poate fi utilizat pentru referirea a diferite tipuri de date (tablouri de tip int, siruri de caracetere, matrici etc.) sau structuri de date. Schimband adresa memorata in pointer, pot fi manipulate informatii situate la diferite locatii de memorie.Legatura dintre tablouri si pointeriNumele unui tablou este un pointer constant spre primul sau element. Expresiile de mai jos sunt deci echivalente:nume_tablou&nume_tablou&nume_tablou[0]*nume_tablounume_tablou[0]// Ex.1 Interschimbarea a 2 valori#include void swap (int *a, int *b){_asm{mov eax, a; // punem in eax adresa data de pointerul *amov ecx, [eax]; // punem in ecx valoarea efectiva a lui *a (valoarea de la adresa pointerului)mov ebx, b; // analog pt bmov edx, [ebx];mov [eax], edx; // mutam la adresa lui a valoarea lui *bmov [ebx], ecx; // analog invers}}void main(){int a=2, b=3;swap(&a,&b);printf("%d %d", a, b);}// Ex.2 Suma elementelor dintr-un vector#include int suma_vector (int *, int ){_asm{mov eax, 0 // sumamov ebx, [ebp+8] // primul parametru, pointer la vectorul de elementemov ecx, 0 // contorbucla:cmp ecx, [ebp+12] // al 2-lea parametru, lungimea vectorului de elementejae stopadd eax, [ebx+ecx*4] // elementul vectorului de pe pozitia ecxinc ecxjmp buclastop:}}void main(){int v[5]={5,1,2,3,6};int *p=v;int s;_asm{push 5push pcall suma_vectoradd esp, 8mov s, eax}printf("Suma: %d", s);}// Ex.3 Lungimea unui sir de caractere (un sir de numere se termina cu valoarea 0)#include int lungime(char *){_asm{mov eax, 0mov ebx, [ebp+8] // adresa de inceput a sirului de caracterebucla:cmp [ebx+eax], 0 // comparam caracterul curent cu 0je stopinc eaxjmp buclastop:}}void main(){char *sir="zigyzagy";int l;_asm{push sircall lungimeadd esp, 4mov l, eax}printf("Lungime: %d %d\n", l, strlen(sir));}Pentru matrice de a[n][m] (n x m elemente), pentru avea acces la elementul de pe pozitia [i][j] (linia i, coloana j), va trebui sa aflam adresa acestuia."a[i][j]" este echivalent cu: "&a + (i*n+j)*4" (adresa primului element la care adaugam i x nr_linii + j, totul inmultit cu dimensiunea elementelor, in cazul nostru 4 octeti pentru int)// Ex. 4 - Construirea matricii unitate (1 pe diagonala, 0 in rest)#include void matrice_unitate(int *, int ){_asm{mov edi, [ebp+8] // adresa la primul element din matricemov ebx, 0for_i:cmp ebx, [ebp+12] // dimensiunea matriciijae exit1mov ecx, 0for_j:cmp ecx, [ebp+12]jae exit2mov eax, [ebp+12] // construim adresa de pe pozitia [i][j]mul ebxadd eax, ecxcmp ebx, ecxjne not_eqmov dword ptr [edi+eax*4], 1 // i == j, deci vom pune 1jmp insidenot_eq:mov dword ptr [edi+eax*4], 0 // altfel, 0inside:inc ecxjmp for_jexit2:inc ebxjmp for_iexit1:}}void main(){int n=5;int mat[5][5];int *p = mat[0];_asm{push npush pcall matrice_unitateadd esp, 8}for(int i=0; i