Question de debutant

Résolu
cs_frozon Messages postés 24 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 30 novembre 2008 - 18 janv. 2007 à 19:14
cs_frozon Messages postés 24 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 30 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

4 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

ciao...
BruNews, MVP VC++
3
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
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)

A+
3
cs_frozon Messages postés 24 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 30 novembre 2008
19 janv. 2007 à 07:12
Je te remerci brunews pour ton explication.
Je vais jeter un oeil sur tes sources sur cppfrance

Bonne journée et merci encore
0
cs_frozon Messages postés 24 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 30 novembre 2008
19 janv. 2007 à 08:56
Merci pour ta réponse cela m'aide a m'éclaircir un peu les idées avant de débuter.
0
Rejoignez-nous