Probleme asm pe “release”
Problema de fata apare in versiunele 2005+ ale Visual Studio in modul de compilare "Release". Sa luam exemplul urmator:
-
int functie(int)
-
{
-
_asm
-
{
-
mov eax,[ebp+8]
-
}
-
}
-
-
-
int main()
-
{
-
int a=10,b;
-
b=functie(a);
-
printf("%d ",b);
-
return 0;
-
}
In mod normal, functia returneaza valoarea primita ca parametru . Prin urmare, b=functie(a) va lua valoarea lui a, adica 10. Pana acum toate bune si frumoase. Sa compilam acum pe "Release mode" . De data aceasta, b va lua valoarea ...0
. Ciudat ? Nicidecum. Daca vom modifica antetul functiei main in felul urmator:
-
int main(int)
b va lua valoarea ... 1
... acum sa rulam programul cu 5 parametri ... si da, intr-adevar , b va lua valoarea 5 ... hmmm...Situatia nu e atat de hazlie pe cat pare. Sa zicem ca avem o functie care primeste ca parametru adresa unei variabile ... daca in loc de adresa noi primim 0, 1 sau alte tampenii, cu siguranta ca programul nostru va functiona razna iar noi ne vom pune nervii la incercare pentru mult timp, cu debugger-ul etc., negasind eroarea.
Eroarea provine din cauza optimizarilor de cod pe care le efectueaza Visual Studio . Sa luam acelasi caz de mai sus. Ce inseamna optimizare ? Compilatorul "vede" ca functia de mai sus nu mai apeleaza alte functii si este apelata doar din main . Asa ca , literal, ia tot codul functiei si il pune in locul apelului din functia main . Ceea ce echivaleaza perfect cu :
-
int main()
-
{
-
int a=10,b;
-
_asm
-
{
-
mov eax,[ebp+8]
-
mov b,eax
-
}
-
printf("%d ",b);
-
return 0;
-
}
Astfel, nu se mai face saltul la codul functiei, codul e "performant", dar intelesul sau deja se schimba...
In mod logic, problema se rezolva in 2 moduri :
1. Spunem compilatorului sa nu mai optimizeze nimic ( foarte usor : Project Properties -> Configuration Properties -> C/C++ -> Optimization -> Optimization -> Disabled .
2. Spunem compilatorului sa nu optimizeze functia noastra ... va urma
Salut! Nush cum sa incep dar e deja luni dimineatza si cu cearcane la ochi am decis sa-ti cer ajutorul dupa ce mi-am petrecut tot week end ul incercand sa rezolv o problema legata de c++ si ASM. Eu ma impac f bine cu php si VB dar C++ si/sau ASM ul imi dau de furca. Am un .exe caruia ash vrea sa-i dau de cap. Daca vrei macar sa incerci sa ma ajuti raspunde-mi aici forever.mobil3[a.t]yahoo[d.o.t]com. Mer ci.
Ps. Nu posta asta ... ar fi trebuit sa fie cumva personala dar nu am gasit alta modalitate de a te contacta