Accueil > Forum > > > > appel fonction en asm
appel fonction en asm
lundi 23 février 2009 à 11:24:56 |
appel fonction en asm

LlufRuS
|
Bonjour à tous, je souhaite appeler une fonction provenant d'une librairie dynamique en lui passant directement mes arguments sur la pile (malheureusement, cela ne fonctionne pas). Si je définie mon pointeur de fonction comme ceci : typedef void (__stdcall * CBGL_TYPE_3D)(GLdouble,GLdouble,GLdouble); et mon code asm de cette façon : __asm { push c push b push a call glVertex3D } ou glVertex3D est récupérer ainsi : glVertex3D=(CBGL_TYPE_3D)GetProcAddress(instanceDLL, "glVertex3d"); je fais n'importe quoi ? (désolé du sens de ma question, mais je ne vois pas comment la tourner autrement. Il me semblait que la convention stdcall me permet de ne pas avoir à nettoyer la pile or j'obtiens une erreur "The value of ESP was not properly saved across a function call." Je n'empile pas directement sur esp en faisant un "push variable"?
|
|
lundi 23 février 2009 à 12:24:04 |
Re : appel fonction en asm

BruNews
|
GLdouble, c'est 4 ou 8 octets à mettre sur la pile ???
C'est quoi ce petit bout d'asm, toute la fonction ? Si oui il manque le retour chez l'appelant (RET xxx).
Si c'est un peu d'ASM au milieu d'un code C, alors à bannir absolument, ça empêche toute optimisation du compilo et tu n'as aucune maitrise de ce que tu PUSHes. Une fonction se fait FULL ASM ou FULL C, mais pas de mixage.
ciao... BruNews, MVP VC++
|
|
mardi 24 février 2009 à 14:35:23 |
Re : appel fonction en asm

SebLinck
|
Salut,
Ou alors faut coder en langage D ...
Cordialement, Sébastien.
|
|
jeudi 26 février 2009 à 18:45:44 |
Re : appel fonction en asm

LlufRuS
|
Bonsoir à tous,
en premier lieu, désolé du temps de réponse : recherche de logement etc etc qui me prennent pas mal de temps ces derniers temps.
En fait, je cherche à appeller des fonctions provenant d'une librairie ( openGl et extensions... ), au moment de l'appel, je me retrouve avec sur les bras le pointeur de la fonction à appeller, un pointeur vers le début d'une zone mémoire contenant les paramètres mis les uns à la suite des autres et la taille total de ces paramètres. Reste à savoir comment effectuer l'appel de ma fonction ( je souhaite le faire en assembleur pour une raison d'optimisation de performances ) J'avoue ne pas savoir trop comment faire : je décremente ebp de la taille des paramètre , recopie comme un sauvage ma zone mémoire dans la pile et effectue un call vers la fonction ? Si je ne m'abuse ce qui suit le @ pour un stdcall va indiquer au compilo la taille de chaque paramètre et donc en gros je ne me soucis plus de rien ?
|
|
jeudi 26 février 2009 à 19:55:02 |
Re : appel fonction en asm

BruNews
|
JE REPETE: si c'est juste l'appel en ASM alors NIET, c'est une dégradation des perfs et non une optimisation que tu auras.
Si vraiment tu y tiens: Non, tu ne peux pas présupposer que la fonction utilise EBP comme pointeur temporaire de pile, ce registre peut très bien avoir autre chose de crucial dedans à ce moment. Tu dois absolument connaitre le mode d'appel de la fonction (stdcall, fastcall ou cdecl) car tu es responsable dans tes instructions ASM du correct replacement du pointeur de pile (ESP ou EBP si stackframe chez l'appelant). Puisque c'est toi qui PUSH les arguments en ASM, le compilo n'entre pour rien dans l'affaire. Il ne touche pas aux instructions ASM, tu dois donc passer correctement les params de la fonction appelée en te SOUCIANT DE TOUT.
ciao... BruNews, MVP VC++
|
|
jeudi 26 février 2009 à 20:42:17 |
Re : appel fonction en asm

LlufRuS
|
Hum, en fait je m'exprime mal. Je bosse sur une histoire de "command buffer". En gros les appels aux différentes fonctions OpenGl+extensions sont stockées puis chaque commande est executée par la suite. Je parle d'optimisation de perf car les différents attributs n'ayant jamais la même taille, ils sont stockés en "oubliant" leurs types. Je peux caster le tout en redefinissaant chaques fonctions openGl, c'est cette fonction qui est alors appellée lors de l'execution de mon command buffer, ce qui me permet de connaître la signature exacte de la fonction et donc de caster mes arguments.. etc. Cependant cela me force à faire un appel de fonction en plus. Bref en gros, je préfererais écrire sur la pile et ne plus me soucier des types mais seulement de la taille de chaque attribut et donc appeler mes fonctions qui ont la convention __stadcall. Le stdcall me dit juste que c'est l'appellé qui va nétoyer ma pile et que je dois passer mes attributs de droite à gauche. Je ne compte pas faire de push ( contrairement à ce que j'avais dit dans mon premier post ) car mes attributs n'auront jamais la même taille. Mais il doit bien y avoir une façon de faire cela en décrémentant correctement mon pointeur de pile et en placant le tout dans un registre particulier. Désolé, le problème est clair dans mon esprit mais il est plutôt difficile de restituer le tout par écrit.
Quoi qu'il en soit, merci des différentes réponses et du petit intérêt au problème. ++, A.
|
|
Cette discussion est classée dans : fonction, asm, push, glvertex3d, gldouble
Répondre à ce message
Sujets en rapport avec ce message
[Linker] Lier .obj asm pour Dll [ par Sel3astien ]
Bonjour, Aprés avoir effectué de nombreuses recherche, je ne trouve pas reponse a mon probléme. Je souhaite créer une dll a partir d'une fonction ecri
Comment executer un .exe avec dev-c++ en C? [ par Slown ]
Tout d'abord, bonjour a vous et merci de m'accorder un peut de temps. Je voulais savoir a l'aide de quelle fonction je pourrais executer un fichier .e
socket et fonction send [ par blueburry ]
Bonjour, je suis en train de manipuler des sockets et g besoin d'envoyer une chaine de caracteres stockee ds une variable de type string a partir de l
C++ : Copie d'une structure [ par garslouche ]
Bonjour à tous. J'ai quelques questions existentielles sur le C++.... 1) Si j'ai une structure par exemple: struct <font
ocx en vc++ [ par aabdoos ]
salut les gas , g cree une OCX avec visual basic et g'y ai integre des fonctions je l'est inserer dans un form vc mais comment je peux appeler ces fon
Fonction pow buguée ?? [ par Gendal67 ]
Bonsoir,Je dévellope actuellement des fonctions mathématiques et je crois que j'ai une fonction qui calcule mal...! Je m'explique :(ULONG)((pow(65, 5)
Fonction de dialogue [ par shootrz ]
Bonjour,Je fais un programme qui va chercher des données sur le net. Ce que je voudrais faire, c'est comme la fenetre d'update de microsoft antispywar
ASM et C [ par Dark Angel ]
Je voudrais savoir ou l'on peu trouver des tutoriels, assez complets, pour 'mixer' de l'Assembleur avec du C.De préférence très bas niveau en Français
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
Uptime [ par winwarrior ]
Bonjour, Je pose ma question ici car c'est mon dernier recours, j'ai cherché sur google et apres une semaine j'ai toujours pas trouvé de solution. Voi
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|