Oppure

Loading
19/01/17 19:34
Per chiarire un po' ...

Supponi di avere questa riga nel main

int v = somma(v1, v2);

che chiama una semplice funzione somma passando due argomenti e che riceve da questa la somma degli argomenti.
Una funzione del genere potrebbe essere questa

int somma(int a, int b)
{
    return a+b;
}

A questo punto, il compilatore traduce la chiamata nel main così
        
00161039 8B 55 FC mov edx,dword ptr [v2]
0016103C 52 push edx
0016103D 8B 45 F8 mov eax,dword ptr [v1]
00161040 50 push eax
00161041 E8 BA FF FF FF call somma (0161000h)
00161046 83 C4 08 add esp,8
00161049 89 45 F4 mov dword ptr [v],eax

passando nello stack, in ordine inverso, gli argomenti.
La funzione viene chiamata dalla call e quando l'esecuzione termina, nel main viene
corretto il puntatore dello stack e copiato eax in memoria all'indirizzo della variabile v
(solo perché nel main il valore restituito dalla funzione viene utilizzato in seguito).

La funzione somma sarà tradotta così

00161000 55 push ebp
00161001 8B EC mov ebp,esp
00161003 8B 45 08 mov eax,dword ptr [ a ]
00161006 03 45 0C add eax,dword ptr [ b ]
00161009 5D pop ebp
0016100A C3 ret

in cui viene preparato il registro ebp per accedere agli argomenti nello stack e si esegue
l'addizione tra loro con risultato in eax (PROPRIO perché la somma da restituire deve stare in eax, dove se l'aspetta il main)
A questo punto, prima di terminare con la ret, viene ripristinato il vecchio valore di ebp, e solo dopo la ret permette di
continuare l'esecuzione del programma dopo la call.

A questo punto è evidente che non ha senso parlare di "ritorno del valore" prima o dopo il "termine della funzione".
Bisogna solo conoscere bene il semplice meccanismo di esecuzione del codice e passaggio dei dati.
Ultima modifica effettuata da 19/01/17 19:52