Problèmes avec le registre ESP (C++ et ASM)

Signaler
Messages postés
222
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
30 juin 2008
-
Messages postés
222
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
30 juin 2008
-
Bonjour, je voudrais créer une fonction permettant d'appeller des APIs sans avoir besoins de déclarer leur prototype ni en utilisant les .lib. Lorsque j'éxécute mon code, ma msgbox apparait, parfaite. Après que j'appuie sur OK, erreur. Ça serait le registre ESP le problème. j'ai lu qu'il y a des registres qu'il fallait sauver et restaurer mais comme mes connaissances en asm sont très limitées, je ne sais pas comment faire.

int _stdcall StdCallAPI(LPCSTR dllName, LPCSTR APIName,int Params[], int ParamsCount)
{
HMODULE hLib;
FARPROC pProc= 0;
int iFlag=MB_ICONASTERISK+MB_YESNO;
int RetVal;
char* texte="allo";
hLib=LoadLibrary("User32.dll"/*dllName*/);
pProc=GetProcAddress(hLib,"MessageBoxA"/*APIName*/);



__asm
{

//paramètres pour l'api [
mov eax,20
push eax


mov eax,texte
push eax


mov eax,texte
push eax


mov eax,0
push eax
// ]


call pProc //appel de l'api


mov RetVal,eax //envoie de la valeur dans la variable RetVal


// nettoyage [
pop ebx//(nécéssaire?)


pop ebx
pop ebx
pop ebx
pop ebx
// ]


}
FreeLibrary(hLib);
return RetVal;
}

Merci

VIVE LE QUÉBEC!
Essayez ça


Dim l As Long: Do Until l -1: l l + 1: Loop

p.s.Si vous l'avez essayé, vous allez attendre longtemps ...

6 réponses

Messages postés
17
Date d'inscription
mercredi 26 janvier 2005
Statut
Membre
Dernière intervention
14 juin 2006

Salut,
Pour les Api win32 il me semble que c'est la fonction qui nettoie la pile, dans ton cas tu ne dois pas avoir de pop après le call.
D'une manière générale si tu fais ce genre de bricolage utilises ton debugger et surveilles la valeur des registres.
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Pour les fonctions de l'API, il ne faut pas nettoyer la pile après l'appel (__stdcall). C'est la fonction appelée qui s'en charge et donc il faut s'assurer d'empiler le bon nombre de paramètres.
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Si tu ne 'pop' pas les registres, pourquoi les restaures tu ?



__asm
{

//paramètres pour l'api [
mov eax,20
push eax


mov eax,texte
push eax


mov eax,texte
push eax


mov eax,0
push eax
call pProc //appel de l'api


mov RetVal,eax //envoie de la valeur dans la variable RetVal


}

Ca devrait marcher correctement. Comme l'a dit gnoofy, les API sont 'stdcall', cela signifie que les parametres que tu empiles vont etre depilés par la fonction.
En ASM, seuls 3 registres n'ont pas besoin d'etre sauvegardé (uniquement si tu les utilises) : les registres EAX, ECX et EDX. Tous les autres doivent etre empilés au debut de la fonction et depilés en fin.

Voila, si tu veux plus de renseignement, n'hesite pas. Au fait, est ce que tu vois 'texte' dans la MessageBox() ?

+2(p - n)
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Erratum 1ere ligne : Si tu ne 'push' pas les registres, pourquoi les restaures tu ?

+2(p - n)
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Que c'est bien l'ASM ^_^

Shell
Messages postés
222
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
30 juin 2008

Merci, je vais essayer ça. Est-ce que il y aurait moyer de faire genre:

pour chaque paramètre
{
_asm
{
mov eax,paramètre[index]
push eax
}
}

_asm
{
call api
mov retour,eax
}

???
Si oui, quel devrai être le type de données du tableau? void*? int?

VIVE LE QUÉBEC!
Essayez ça

Dim l As Long: Do Until l -1: l l + 1: Loop

p.s.Si vous l'avez essayé, vous allez vraiment attendre longtemps ...