Appunti laboratorio
Transcript
Appunti laboratorio
1: #include<stdio.h> 2: 3: int funzione(void); 4: 5: void main(){ push ebp mov ebp,esp 6: funzione; 7: printf("%d\n", funzione()); call funzione (221020h) push eax push offset ___decimal_point_length+10h (22BDC0h) call printf (221039h) add esp,8 8: } xor eax,eax pop ebp ret --- No source file ------------------------------------------------------------int 3 int 3 int 3 int 3 int 3 int 3 --- c:\users\quidamortalisdeus\documents\visual studio 2010\projects\eserciziolab\eserciziolab\main.c 9: 10: int funzione(void){ push ebp mov ebp,esp 11: return 42; mov eax,2Ah 12: } pop ebp ret ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------1: #include<stdio.h> 2: 3: int funzione(int); 4: 5: void main(){ push ebp mov ebp,esp push ecx 6: int x; 7: funzione; 8: printf("%d\n", funzione(x)); mov eax,dword ptr [x] push eax call funzione (1031030h) add esp,4 push eax push offset ___decimal_point_length+10h (103BDC0h) call printf (103104Ah) add esp,8 9: } xor eax,eax mov esp,ebp pop ebp ret --- No source file ------------------------------------------------------------int 3 int 3 int 3 int 3 int 3 int 3 int 3 int 3 int 3 int 3 int 3 int 3 --- c:\users\quidamortalisdeus\documents\visual studio 2010\projects\eserciziolab\eserciziolab\main.c 10: 11: int funzione(int x){ push ebp ; base pointer mov ebp,esp ; copia dello stack nel base pointer 12: return x+1; mov eax,dword ptr [x] ;il valore del parametro viene estratto add eax,1 13: } pop ebp ret Viene caricata la variabile 5 nello stack, poi l'indirizzo di ritorno, dpo la call ci punta lo stack pointer, viene fatto il push di ebp e lo stack pointer si abbassa. In ebp viene messo esp. Il parametro lo troviamo rispetto al base pointer più su di 4+4, quindi 8. Viene caricato in eax il parametro che si trova in ebp+8 (qui è solo [x]); in questo modo si possono estrarre tute le variabili locali eventualmente caricae, sempre con "ebp - qualcosa", i valori con "ebp+qualcosa". ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#include<stdio.h> int funzione(int, int); void main(){ int x; funzione; printf("%d\n", funzione(5, 3)); } int funzione(int x, int y){ return x+y; } 1: #include<stdio.h> 2: 3: int funzione(int, int); 4: 5: void main(){ push ebp ; solita procedura nota mov ebp,esp push ecx 6: int x; 7: funzione; 8: printf("%d\n", funzione(5, 3)); push 3 ; i valori vengono caricati in modo inverso da quelli messi push 5 call funzione (0C51030h) add esp,8 push eax push offset ___decimal_point_length+10h (0C5BDC0h) call printf (0C5104Ah) add esp,8 9: } xor eax,eax mov esp,ebp pop ebp ret --- No source file ------------------------------------------------------------int 3 int 3 int 3 int 3 int 3 int 3 int 3 int 3 int 3 int 3 int 3 int 3 --- c:\users\quidamortalisdeus\documents\visual studio 2010\projects\eserciziolab\eserciziolab\main.c 10: 11: int funzione(int x, int y){ push ebp mov ebp,esp 12: return x+y; mov eax,dword ptr [ebp+8] ; possono comparire come [x] e [y] in quanto non eranos tati tolti i symbol names add eax,dword ptr [ebp+0Ch] 13: } pop ebp ret ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- #include<stdio.h> void stampa_array(int *dati); int num[] = {19, 9, 5, 20, -3}; char format[] = "%d\n"; void main(){ stampa_array(num); } void stampa_array(int *dati){ //_eax, ebx, _ecx, _edx, esi, edi, bp, esp in quelli _ sono sporcati dalla funzione, potrebbe cambiare il contenuto __asm{ mov ebx, [ebp+8] //si prende l'indirizzo di inizio dell'array (dati) mov esi, 0 //si azzera l'indice dell'array i lea edi, format //apposita istruzione lea e non mov, sarebbe andata a leggere la memoria all'indirizzo format, //con il lea va a leggere il risultato (load effective address), l'effettivo indirizzamento ripeti_stampa: push [ebx+esi*4] push edi call printf add esp, 8 inc esi //aggiorno il contatore per vedere se l'arrau è finito cmp esi, 5 // 5 è la dimensione dell'array jl ripeti_stampa } } -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------