IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

[C] Récupérer un résultat de fonction de type double


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    je voudrais savoir comment on récupere le resultat d'un call sur une fonction quand le resultat est un double car je sais que par defaut le retour se place dans EAX et que si c'est trop long (+32 bits) ca va dans EDX aussi mais je fais quoi avec mon EDX et mon EAX lol sachant que je recupere mon resultat dans du C

    merci d'avance

  2. #2
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 337
    Points
    2 337
    Par défaut
    Boarf !
    A priori, tu balances le résultat dans la pile où le programme appelant ira le chercher.
    Non ?
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 13
    Points
    13
    Par défaut
    Bein le probleme c'est que je passe un tableau générique avec tous les parametres dans eax et je parcours le tableau pour empiler les arguments de la fonction

    mais comme au debut je faisais pas ca avec le type Double j'avais le tableau mis à jour apres l'appel mais maintenant j'ai le probleme d'avoir n'importe quel donnée donc ces ***** de doubles

    Sinon merci pour la reponse et pourquoi pas je vais essayer d'isoler les données de type double et les mettres sur la pile, l'instruction c'est bien FSTP et pour le retour dans le C de declarer une variable du type de retour et de faire :

    variable ret = maFonctionAsm(...);

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 941
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 941
    Points : 5 652
    Points
    5 652
    Par défaut
    Hoa,

    Ça dépend de l'implémentation C que tu utilises, il faut en lire la doc pour savoir comment il attend le retour de telles valeurs.

    Alternative si tu n'as pas la doc (?) : tu écris en C une fonction qui retourne un double, tu l'appelles, et tu déassembles pour aller voir le code généré.
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 13
    Points
    13
    Par défaut
    Pas bete effectivement,

    pour le passage des valeurs c'est en cdecl mais à part ca non j'ai rien de plus

    j'ai eu le meme probleme pour les entrées de la fonction car c'est le meme tableau generique et en connaissant le rang du double j'arrive à le traiter pour bien l'empiler mais y a pas moyen de trouver des explications plus claires sur le retour d'un call à part que ca va dans EAX lol

  6. #6
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Le retour des flottants est parfois problématique pour l'interaction assembleur et C.

    Dans ton cas particulier, si j'ai bien suivi on a :

    C (1) ---> Asm ---> C (2) => [traitement en C (2)] => C (2) ---> Asm ---> C (1)
    Où l'assembleur joue un rôle de pont (passage d'argument et récupération des résultats) entre deux parties en C.

    Il est possible qu'en fait, dans ton cas concernant les flottants, tu n'ai rien à faire. Le résultat d'opération sur les flottants est souvent laissé sur la pile FPU (registre ST(x)) par le C.
    Dans ce cas là, ta fonction assembleur n'a pas à essayer de passer le résultat au C, qui se chargera tout seul d'aller piocher sur le FPU, en ST(0).

    Comme le suggérait Droggo, la seule façon de s'en convaincre c'est de débugger directement en assembleur (ou faire une analyse statique) sur ton code et suivre ce qu'il se passe, en se focalisant sur :

    1) La manière dont l'appelant [C (1)] veut récupérer le résultat (directement sur le FPU, par pointeur, par valeur ?)

    2) Comment l'appelé [C (2)] retourne les résultats (valeur, référence, sur registre ALU ou FPU ?)

    A ce moment là tu saura la manière dont doit procéder ta fonction assembleur, ce qui t'obligera peut être à créer un nouveau type de "pont assembleur" pour gérer les fonctions flottantes.

    En fait il est difficile de te répondre concrètement sans avoir les détails des implémentations de l'appelant et de l'appelé en assembleur.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 13
    Points
    13
    Par défaut
    Merci à tous,

    pour expliciter mieux je charge dans un tableau de pointeur sur type générique en C les arguments d'une fonction, les arguments sont placés dans le tableau selon la signature (si un pointeur sur long en sorti je met un pointeur sur un long initialisé à 0 etc...).

    j'appelle le prog assembleur comme ceci:
    AppelDLL(tabgen,nbE+nbS,ptrFunct);

    Je passe en assembleur le tableau de void** tabgen et l'assembleur appelle le pointeur sur la fonction de la DLL avec tous les parametres (correctemnt empilé) et apres le call le tableau est mis à jour automatiquement.

    et je retourne dans le C ou mon tableau est correctement remplis normalement (comme un mise à jour dans un programme en C il est en entrée et en sortie) mais avec les double j'arrive à bien empiler les 64bits pour le call mais je ne sais pas du tout le comportement du retour et de la mise a jour du tableau et j'obtiens donc toujours ma valeur initiale du tableau (pas de màj de la sortie) càd 0.00000

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 13
    Points
    13
    Par défaut
    En fait je ne récupere pas la valeur pas défauts mais quelque soit la valeur apres l'appel je recupere 0.00000 alors ca vient soit du retour entre la DLL et l'assembleur soit du retour Assembleur programme principale.

    encore plus bizarre si dans la signature de la dll la sortie n'est plus un pointeur sur double mais un double je recupere une la valeur par défaut de la sortie

  9. #9
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    On peut difficilement t'apporter une solution adéquate à partir du moment où nous n'avons pas tout les clés en main.

    A première vue ta fonction en asm est bonne, c'est plutôt ta fonction appelée en C qui semble avoir un comportement "étrange". A partir de là, on ne peut pas dire grand chose de plus...

    Généralement, à ce moment là, il faut sortir un débuggeur et tracer les fonctions pour voir où ça bloque exactement.

    Tu poses un point d'arrêt (breakpoint) sur le CALL de ta fonction asm et tu vérifie ton cadre de pile (stack frame) avant le CALL pour voir si tes paramètres ont été poussés correctement. en comparant avec ton prototype de fonction.

    S'ils le sont, il faut tracer en pas à pas dans la fonction C (step-in) ou passer sur le CALL sans y entrer (step over) et regarder tes registres (voir même la pile), aussi bien sur l'ALU que sur le FPU, afin de savoir où est exactement le retour de fonction.

    Sans savoir où ce situe le retour de la fonction en C, tu ne peux que travailler en aveugle et faire des suppositions. A mon avis, l'utilisation d'un débuggeur lèverait immédiatement le doute.

    Peut être que quelqu'un aura une meilleur idée que moi...

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 13
    Points
    13
    Par défaut
    Okje vais debugger comme il faut enfin essayer d'habitude je debugge via les test ou le pas a pas sans regarder la memoire, la pile etc...

    merci de votre aide

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 13
    Points
    13
    Par défaut Appel fonction C dans asm
    Bon j'ai identifié le problème ca vient du C et le seul moyen pour moi de le contourner serait de creer un nouveau pont vers le C avant de repartir dans l'assembleur pour appeler ma DLL

    Merci encore de votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 13/09/2011, 18h24
  2. Réponses: 1
    Dernier message: 04/11/2008, 23h12
  3. Récupérer le résultat d'une fonction dans une balise html
    Par Hayato dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/06/2006, 18h04
  4. Réponses: 6
    Dernier message: 08/06/2006, 11h07
  5. Fonction : récupérer le résultat
    Par cristolb dans le forum ASP
    Réponses: 8
    Dernier message: 30/08/2005, 12h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo