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

 Delphi Discussion :

difference entre stcall et register


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Par défaut difference entre stcall et register
    Bonjour

    c'est quoi le difference quand je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function CalculerTotal(Somme:double):double;stdcall;
    begin
       Somme := Somme * TPS + Somme;
       Somme := Somme * TVQ + Somme;
       Result := 500;
    end;
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function CalculerTotal(Somme:double):double;register;
    begin
       Somme := Somme * TPS + Somme;
       Somme := Somme * TVQ + Somme;
       Result := 500;
    end;
    Parce que dans les deux cas ca marche...


    Merci

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    stdcall

    Citation Envoyé par Aide delphi
    Conventions d'appel
    Dans la déclaration d'une procédure ou d'une fonction, vous pouvez spécifier une convention d'appel en utilisant l'une des directives register, pascal, cdecl, stdcall et safecall. Par exemple,

    function MyFunction(X, Y: Real): Real; cdecl;
    Les conventions d'appel déterminent l'ordre dans lequel les paramètres sont transmis à la routine. Elles affectent également la suppression des paramètres de la pile, l'utilisation de registres pour transmettre les paramètres, ainsi que la gestion des erreurs et des exceptions. register est la convention d'appel par défaut.

    Les conventions register et pascal transmettent les paramètres de gauche à droite ; c'est-à-dire que le paramètre de gauche est évalué et transmis en premier, le paramètre de droite est évalué et transmis en dernier. Les conventions cdecl, stdcall et safecall transmettent les paramètres de droite à gauche.
    Pour toutes les conventions à l'exception de cdecl, les procédures et fonctions suppriment les paramètres de la pile lors de la sortie. Avec la convention cdecl, c'est à l'appelant de supprimer les paramètres de la pile au retour de l'appel.
    La convention register utilise jusqu'à trois registres de la CPU pour transmettre des paramètres alors que toutes les autres conventions transmettent tous les paramètres dans la pile.
    La convention safecall implémente les 'coupe-feu' d'exceptions. Sous Win32, cela implémente la notification d'erreurs COM interprocessus.
    Le tableau suivant résume les caractéristiques des conventions d'appel.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre éclairé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Par défaut
    j'avoue être un peut perdu , enfin j'ai rien compris

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Jcpan Voir le message
    j'avoue être un peut perdu , enfin j'ai rien compris
    à l'intérieur d'un même programme ça n'a pas d'incidence...(éventuellement sur les performances, mais même pas) car l'appelé et l'appelant seront automatiquement d'accord entre eux.

    par contre entre un EXE et une DLL il faut que les deux utilisent la même convention de passage des paramètres

    en gros les paramètres sont-ils :
    - dans des registres du processeur
    - sur la pile d'appel
    - à dépiler par le programme appelant
    - à dépiler par la procédure appelée
    - de gauche à droite
    - de droite à gauche

    l'EXE et la DLL étant compilés séparément, et pas forcément à partir des mêmes sources (Appli Delphi, DLL C ou inversement) il est nécessaire de spécifier la convention si elle n'est pas au standard Delphi... c'est tout.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    vulgairement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function Test1(A, B: integer): integer; stdcall;
    assembleur :
    A = [EBP+$08] (pile+8 octets)
    B = [EBP+$0C] (pile+12 octets)
    result = EAX

    octets 8 à 11 = A (4)
    octets 12 à 15 = B (4)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function Test2(A, B: integer): integer; register; // pascal ou rien
    assembleur :
    A = result = EAX
    B = EDX

    donc si l'on mets le code suivant dans test1 et test2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    asm
      mov ecx, edx;
      shl eax, cl;
    end;
    test1 renvois un resultat erroné car EAX pointe sur le retour et EDX n'est pas chargé, alors que test2 renvois le bon resultat car EAX pointe sur A et result et EDX pointe sur B et ECX est libre, si l'on veux utiliser EBX il faut le pusher.

    pour rendre Test1 opé il faudrait ecrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    asm
      mov eax, dword ptr [EBP+$08];
      mov ecx, dword ptr [EBP+$0C];
      shl eax, cl;
    end;
    voila, en Delphi les paramêtres sont chargé par défaut, d'abord dans les registres (EAX, EDX, ECX) puis dans la pile.
    avec StdCall ou CdEcl les paramêtres sont chargé dans la pile.
    dans les deux cas Test1 et Test2, on remarque que EAX pointe toujours sur result.
    dans Test2, si l'on mettait seulement ASM END; sans rien d'autre, result serait égal directement à A.
    alors que dans Test1, result prendrait une valeur quelconque (non initialisée, ou valeur du pointeur [EBP]).
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  6. #6
    Membre Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Par défaut
    un point important à noter (noté dans le poste de rayek, mais à souligner), c'est que register est la convention par défaut. donc si tu ne précise pas la convention, c'est register qui sera utilisé

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 941
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 941
    Par défaut
    Je rajouterais encore ceci:

    Tu ne vois pas de différence dans tes deux déclarations pour deux raisons:
    1. Tu n'as qu'un seul paramètre. Si tu en avais deux (ou plus), tu constaterais tout de suite que leurs assignations seraient dans un cas l'inverse de la déclaration. (pour autant qu'ils soient du même type)
    2. Ton paramètre est un double. Dans tous les cas, cette donnée est transmise sur la pile. S'il s'agissait d'un entier, il serait effectivement passé par registre dans le cas de register et ta fonction (si stdcall) lirait une donnée erronnée, puisque absente de la pile.



Discussions similaires

  1. Différences entre Delphi et Visual Basic ?
    Par Anonymous dans le forum Débats sur le développement - Le Best Of
    Réponses: 75
    Dernier message: 30/03/2009, 20h09
  2. La difference entre XSL et XSLT?
    Par pantin dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/06/2003, 15h14
  3. Difference entre fenetre et boite de dialog
    Par billyboy dans le forum Windows
    Réponses: 2
    Dernier message: 02/06/2003, 15h43
  4. [] Difference entre MSHFlexGrid et MSFlexGrid
    Par olivierx dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/04/2003, 08h48
  5. Difference entre types d'Adresse IP
    Par freud dans le forum Développement
    Réponses: 3
    Dernier message: 02/03/2003, 02h06

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