Question de debutant [Résolu]

Signaler
Messages postés
24
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
30 novembre 2008
-
Messages postés
24
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
30 novembre 2008
-
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

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
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++
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
2
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+
Messages postés
24
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
30 novembre 2008

Je te remerci brunews pour ton explication.
Je vais jeter un oeil sur tes sources sur cppfrance

Bonne journée et merci encore
Messages postés
24
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
30 novembre 2008

Merci pour ta réponse cela m'aide a m'éclaircir un peu les idées avant de débuter.