Qui est responsable pour le nettoyage?
-
12-09-2019 - |
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?
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.