Question

Je voudrais savoir qui est responsable pour le nettoyage de la pile

Supposons que vous avez une fonction fun permet de dire comme ceci:

var = fun(int x, int y, float z, char x);

quand fun sera appelé il ira dans la pile ainsi que les paramètres puis quand la fonction retourne qui est responsable pour le nettoyage de la pile est-il la fonction elle-même ou le « var » qui contiendra la valeur de retour.

Une autre chose, quelqu'un peut-il expliquer les concepts de conventions d'appel?

Était-ce utile?

La solution

appelant convention fait référence à qui fait le nettoyage de la pile; appelant ou appelé.

  

Conventions d'appel peuvent différer dans:

     
      
  • où les paramètres et les valeurs de retour sont placés (dans des registres, de l'appel   empiler; un mélange des deux)
  •   
  • l'ordre dans lequel les paramètres sont transmis (ou des parties d'un seul   paramètre)
  •   
  • comment la tâche de la mise en place et le nettoyage d'un appel de fonction est divisée   entre l'appelant et l'appelé.
  •   
  • qui enregistre qui peuvent être directement utilisés par le callee peut parfois   être inclus
  •   
     

Architectures ont presque toujours plus   d'une convention d'appel possible.

Autres conseils

Vous avez parlé de la réponse vous. conventions d'appel

Une convention d'appel est similaire à un contrat . Il décide les choses suivantes:

  • Qui est responsable de nettoyage des paramètres.
  • Comment et dans quel ordre les paramètres sont passés à la fonction appelée.
  • Lorsque la valeur de retour est stockée.

Il y a beaucoup de différentes conventions d'appel, en fonction de la plate-forme et l'environnement de programmation. Deux conventions d'appel communes sur les plates-formes x86 sont:

  

stdcall

     

Les paramètres sont transmis sur la pile de droite à gauche. fonction appelée nettoie la pile.

     

cdecl

     

Les paramètres sont transmis sur la pile de droite à gauche. appelant la fonction nettoie la pile.

Dans les deux cas, la valeur de retour est dans le registre de EAX (ou ST0 pour des valeurs à virgule flottante)

De nombreux langages de programmation pour la plate-forme x86 permettent de spécifier la convention d'appel, par exemple:

  

Delphi

function MyFunc(x: Integer): Integer; stdcall;
     

Microsoft C / C ++

int __stdcall myFunc(int x)

Quelques notes d'utilisation:

Lors de la création d'une simple application, il est rarement nécessaire de changer ou de connaître la convention d'appel, mais il y a deux cas typiques où vous devez vous préoccuper des conventions d'appel:

  • Lors de l'appel des bibliothèques externes, API Win32 par exemple: Vous devez utiliser les conventions d'appel compatibles, sinon la pile peut être corrompu
  • .
  • Lors de la création du code assembleur en ligne: Vous devez savoir dans quels registres et où sur la pile, vous trouvez les variables
  • .

Pour plus de détails je vous recommande ces articles de Wikipedia:

Au moment où cette ligne est complète var contiendra la valeur retournée par le plaisir () et toute mémoire sur la pile utilisée par le plaisir sera parti. « Push », tous les « pop » bien rangé

Conventions d'appel: tout ce que le compilateur organise afin que le plaisir peut faire son travail. Tenez compte de ces paramètres x, y, z. Quel ordre ils sont poussés sur la pile (en effet ils sont transmis par la pile)? Peu importe tant que l'appelant et l'appelé d'accord! C'est une convention.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top