cs_frozon
Messages postés24Date d'inscriptionjeudi 10 mars 2005StatutMembreDernière intervention30 novembre 2008
-
18 janv. 2007 à 19:14
cs_frozon
Messages postés24Date d'inscriptionjeudi 10 mars 2005StatutMembreDernière intervention30 novembre 2008
-
19 janv. 2007 à 08:56
Bonsoir tout le monde je me pose une question
Je n'ai jamais développé en assembler mais pourquoi ne pas tenté l'aventure.
Je ne vien pas demander de la doc mais une precision.
J'ai vu que pour appeler une fonction il fallai passer les parametre a l'envers j'ai compris pourquoi
Mais ce que je ne comprend pas c'est dans la fonction appelé comment recupérer les paramétres?
imaginos un truc tres tres bateau:
push [ma_chaine]
call ma_fonction
Comment je fait ds ma fonction pour récupérer le parametre
Mettons que ma fonction en C serait:
char *ma_fonction(char *une_chaine)
{
return une_chaine;
}
Pour l'appeler je fait comme plus haut
Mais ma fonction "ma_fonction" je la code comment?
Elle ne contient qu'un ret mais je retourne quoi?
En attendant vos lumiere je continue ma cherche.
Merci d'avance et bonne soirée
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 19 janv. 2007 à 02:26
Le param est placé (DOIT l'être) selon le mode d'appel déclaré devant la fonction.
cdecl et stdcall, param sera en [ESP+4] et tu devras dépiler le param par "ret 4" en sortie.
Si est fastcall alors param passe en registre dans ECX et "ret 0" en sortie puisque rien à dépiler.
Si tu veux retourner ce que tu reçois (jamais compris à quoi ça sert), il te faut conserver cette valeur et la mettre dans EAX en sortie (avant le "ret x").
Look mes sources sur cppfrance, c'est rempli de fonctions full asm.
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 19 janv. 2007 à 08:51
Bonjour frozon,
Pour compléter ce que t'a dit BruNews, tu as dans ta pile au moment de l'entrée dans le sous programme.
[esp]: adresse de l'instruction qui suit le call ma_fonction
[esp+4]: dernier paramètre empilé
[esp+8]: avant dernier empilé
etc...
Une fois ta fonction exécutée il te faut remettre les choses en place.
Tu as deux possibilités:
-Faire le ménage dans la fonction appelée, c'est le stdcall
ret n où n correspond au nombre d'octets des paramètres d'appel (4xnb param, 8 pour deux dwords). Cette instruction met la valeur contenue l'adresse pointée par esp dans eip (pointeur programme) puis rajoute n à esp ("écrase les n paramètres").
-Faire le ménage dans la fonction appelante (convention C)
ret (à la fin de la fonction)
et
add esp n (dans la fonction appelante après le call ma_fonction)