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
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------