begin process at 2012 02 13 02:48:00
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

API

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

mercredi 4 mai 2005 à 04:53:52 | problèmes avec le registre ESP (C++ et ASM)

DeadlyPredator

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 ...
mercredi 4 mai 2005 à 07:28:36 | Re : problèmes avec le registre ESP (C++ et ASM)

gnoofy120

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. 
mercredi 4 mai 2005 à 09:08:54 | Re : problèmes avec le registre ESP (C++ et ASM)

ymca2003

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.

mercredi 4 mai 2005 à 09:15:24 | Re : problèmes avec le registre ESP (C++ et ASM)

AlexMAN

Membre Club
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)

mercredi 4 mai 2005 à 09:18:48 | Re : problèmes avec le registre ESP (C++ et ASM)

AlexMAN

Membre Club
Erratum 1ere ligne : Si tu ne 'push' pas les registres, pourquoi les restaures tu ?

+2(p - n)
mercredi 4 mai 2005 à 13:46:31 | Re : problèmes avec le registre ESP (C++ et ASM)

DeAtHCrAsH

Que c'est bien l'ASM ^_^

Shell
mercredi 4 mai 2005 à 21:01:11 | Re : problèmes avec le registre ESP (C++ et ASM)

DeadlyPredator

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


Cette discussion est classée dans : int, pop, mov, eax, ebx


Répondre à ce message

Sujets en rapport avec ce message

pk ca fonctionne pas [ par laulau10 ] int i=1;do printf("coucou");whil(i=1);DLL int RotationX(void){ int SortieBX=0; _asm{ MOV AX,3; INT 0x33; MOV SortieBX,BX; ret; } ret int 21h [ par GEDEON ] Salut, j'aurais besoin d'aide pour appeler une interruption assembleur sousVisual C++......Tout mon code fonctionne sauf la ligne "int 21h"... Là j'ai Debugage assembleur [ par crocejf2000 ] Salut,Qq'un pourrai il peut etre m'aider, j'ai une méchante érreur et jmy connais pas trop en assembleur, Borland c++ 5 me renvoi ceci : Il s'arrete a petit pb de pointer [ par mirlaine ] en fait c tou simpleje cherche l 'équivalen à ca: LPCWSTR user LPBYTE *bufptr mov eax, [bufptr] mov eax, [eax] //LPUSER_INFO_0 mov eax, [e Problème ac du inline asm [ par oceax ] Bonjour,je suis débutant en c++ et n'y connais pas encore énormément gd chose...Sur mon dernier programme (un keygen pr crack me que j'ai créé par mes ASM et C++ [ par sebastienbro ] Bonjour, j'aimerais savoir ce qui ne vas pas dans le code suivant. J'ai une erreur "error C2400: inline assembler syntax error in 'opcode'; found 'con PB avec de l'ASM dans VC++ 6 .... [ par Foub12 ] Bonjour...Je programme sous VC++ 6 et j'ai trouvé sur Internet, la fonction suivante mais elle ne marche pas... Il compile parfaitement mais lors de l optimiser un codes asm [ par sajid_morad ] salut tout le monde , j ai une parti du code en c++, que j ai voulu optimiser , le l ai reécri en asm , mai ça donne pas grand chose, si quelqu un pou Asm ou SM [ par Joky ] Et oui on voit pas trop la différence entre ces 2 choses lol :) Donc je suis entrain de lire un Tuto sur l'asm avec des ptits exemples n'ayant pas de [EXPERTS]optimisation du c/asm [ par MrdJack ] Bonsoir, je suis en train de me renseigner sur le c et l'asm niveau vitesse d'execution. en detail je me demande comment créer un code en c pour que s


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,482 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales