当前位置:网站首页>C | création et destruction de cadres de pile de fonctions

C | création et destruction de cadres de pile de fonctions

2021-10-14 06:41:52 Ersansui

Préface

Avant que nous commencions à apprendreCQuand la langue,Je crois que les gars sont aussi confus que moi?

Par exemple,:

Comment les variables locales sont - elles créées??
Pourquoi la valeur initiale de la variable locale est - elle aléatoire?
Comment la fonction passe - t - elle les paramètres?
Quel est l'ordre dans lequel la fonction passe les paramètres?
Quelle est la relation entre le paramètre formel et le paramètre réel?
Pourquoi un paramètre est - il une copie temporaire d'un argument?
Comment la procédure d'appel de fonction est implémentée?
Comment revenir après un appel de fonction?

Ne t'inquiète pas.,Aujourd'hui, apprenons à créer et à détruire des cadres de pile de fonctions.

Croyez à travers le contenu d'aujourd'hui,Les petits amis auront la réponse à la confusion ci - dessus.

Mettez les mots importants devant:Parce que ce que j'ai appris n'est pas assez profond,Il y a des choses qu'on ne peut pas dire correctement,S'il y a une erreur,S'il vous plaît, Messieurs, faites remarquer!

Création et destruction de cadres de pile de fonctions

Registres

Tout d'abord,,Nous devons comprendre un concept:Registres.

Les registres courants sont:

eax
ebx
ecx
edx
ebp
esp

Le Registre n'est pas en mémoire,Mais intégré dansCPUMoyenne,La création d'un cadre de pile de fonctions est étroitement liée à la destruction et au registre.

Cadre de pile de fonctions

Le cadre de pile de fonctions est dans la zone de pile de la mémoire,Un espace mémoire ouvert pour les appels de fonctions

EtebpEtesp Ces deux registres sont utilisés pour stocker les adresses , Ces deux adresses sont utilisées pour maintenir les cadres de pile de fonctions .

Schéma d'utilisation de la mémoire

L'utilisation de la mémoire est approximativement comme suit :
Insérer la description de l'image ici

AppelémainFonctions

Encore.CEn cours de programmation,Nous savons quemainEst l'entrée du programme, Un programme ne peut avoir qu'une seule entrée ,Mais,En fait...main La fonction est également appelée par une autre fonction . Mais ces procédures sont encapsulées par le compilateur , On n'est pas faciles à observer .Et, Plus la version est élevée, moins il est facile d'observer le processus .

ParVS2013 Le compilateur, par exemple , Et quand on sera débogués , Vous pouvez faire un clic droit pour désassembler , Puis appuyez et maintenez F10, Voir le processus d'exécution du programme .

Et quand on arrive à main À la dernière ligne de la fonction ,Appuie encore.F10Tu verras.,En fait...mainsLa fonction est_tmainCRTStartup Cette fonction appelle .
Insérer la description de l'image ici

Insérer la description de l'image ici

Insérer la description de l'image ici

Par ici., En fait, nous devons savoir ,main Est également appelé par une autre fonction .EtmainQuand la fonction est appelée, Il ouvre également un cadre de pile de fonctions qui lui appartient .

Insérer la description de l'image ici

Une explication du Code de désassemblage

mov :Instructions de transfert de données, Transmettre les données à l'adresse spécifiée , Transfert de droite à gauche

sub: Directive sur la soustraction , Soustrayez l'adresse

push: Pour réaliser l'opération de pressage (Pile de pression, C'est - à - dire mettre un élément au Sommet de la pile )

pop: Instructions pour réaliser l'opération pop - up (Hors de la pile, C'est - à - dire prendre un élément au Sommet de la pile )

call: Pour enregistrer la prochaine instruction de l'instruction courante et passer à la fonction cible

Analyse des processus

Nous avons le code suivant comme exemple , Pour analyser le processus de création et de destruction des cadres de pile de fonctions .

#include<stdio.h>
int Add(int a, int b)
{
    
	int c = 0;
	c = a + b;
	return c;

}

int main()
{
    
	int a = 15;
	int b = 25;
	int c = Add(a, b);
	printf("%d", c);

	return 0;
}

esp:Registre des pointeurs de pile(extended stack pointer),Il y a un pointeur dans sa mémoire,Ce pointeur pointe toujours vers le Haut de la pile du cadre supérieur de la pile du système. (Pointeur de pile)

bp:Registre des pointeurs d'adresse de base(extended base pointer),Il y a un pointeur dans sa mémoire,Ce pointeur pointe toujours vers le bas du cadre de pile le plus haut de la pile système. (Pointeur de fond de pile)

Parce que chaque fois que vous ouvrez un nouveau cadre de pile, vous utilisez une adresse basse , Et ce processus fait que l'image dans le diagramme de mémoire devient ”Pile de pression“.

Insérer la description de l'image ici

Insérer la description de l'image ici

Insérer la description de l'image ici

Création d'un cadre de pile de fonctions,PrincipalementebpEtesp Ces deux pointeurs sont pressés sur la pile pour former , Quand ces deux pointeurs sortent de la pile , Les cadres de pile de fonctions sont également détruits .

Quand une fonction passe un paramètre , C'est qu'il y a de l'espace pour les arguments avant que la fonction ne soit appelée , Donc le paramètre est une copie temporaire de l'argument .

La valeur de retour de la fonction est retournée par un registre .

Quand une autre fonction est appelée , Le registre enregistre la position actuelle ,Et laissezebpEtesp Pointer vers un nouvel espace .

Et c'est essentiellement le processus de création et de destruction des cadres de pile de fonctions .

Conclusion

En fait, je ne comprends pas vraiment ces connaissances , J'espère aussi écrire un blog pour approfondir ma compréhension de ces connaissances ,S'il y a une erreur, Et j'espère que les grands diront !!

Enfin, Ce n'est pas facile de créer cet article , J'ai aussi cherché beaucoup d'informations

J'espère que tout le monde pourra se concentrer 、 Un bon commentaire. ~

Merci beaucoup pour votre soutien !!

Insérer la description de l'image ici

版权声明
本文为[Ersansui]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/10/20211013211538509f.html

随机推荐