Appel de fonction (procédure) représentation au niveau de la machine (1)

Présentation des appels de procédure

Lorsque le fichier exécutable est chargé, il est mappé sur l'espace de stockage.
La pile utilisateur grandit de l'adresse haute à l'adresse basse.
1
La position du bas de la pile est déterminée et le haut de la pile est spécialement placé dans un Registre de pointeur de pile de registre ESP.

  • test.c
 int add(int x,int y){
    
    
 	return x+y;
 }
 int caller(){
    
    
 	int ti = 125;
 	int t2 = 80;
 	int sum = add(t1.t2);//
 	return sum;
 }
  • Pas

  1. P mettre des paramètres (paramètres réels) dans la pile
  2. L'instruction d'appel pousse l'adresse de retour sur la pile et la transfère à la procédure appelée pour exécution
  3. Enregistrez le site de P (c'est-à-dire le contenu du registre à usage général utilisé par P) et allouez de l'espace pour ses propres variables locales
  4. Exécutez le corps de la fonction Q et placez la valeur de retour dans un endroit spécial à ce moment
  5. Q restitue le champ de P et libère l'espace des variables locales
  6. Récupérer l'adresse de retour et retourner, transférer le contrôle à P
  • Pourquoi sauvegarder la scène ?
    Parce que la procédure appelante et la procédure appelée utilisent le même ensemble de registres
  • Conventions d'utilisation du registre IA-32

– Registres sauvegardés par l'appelant :
EAX, EDX, ECX
Lorsque la procédure P appelle la procédure Q, Q peut directement utiliser ces trois registres sans sauvegarder leurs valeurs dans la pile.
Si P a encore besoin d'utiliser ces trois registres après son retour de Q, P doit les sauvegarder avant de passer à Q, et restaurer leurs valeurs avant de les utiliser après son retour de Q.

– Registres sauvegardés par l'appelé :
EBX, ESI, EDI
Q doivent d'abord sauvegarder leurs valeurs dans la pile avant de les utiliser, et restaurer leurs valeurs avant de revenir à P.


EBP et ESP sont respectivement le registre de pointeur de trame et le registre de pointeur de pile, qui sont utilisés pour pointer respectivement vers le bas et le haut du cadre de pile actuel.


Question : Quels registres chaque processus doit-il utiliser en premier pour réduire les frais généraux lors des phases de préparation et de finalisation ?
EAX, ECX, EDX !

  • Modifications apportées aux piles et aux cadres de pile

2

  • La représentation au niveau de la machine de la fonction ci-dessus

3

4

  • Étape de préparation : les trois premières
    lignes La première instruction pousse toujours la valeur de l'ancien EBP dans la pile
    À ce moment, ESP pointe ici
    Après la deuxième instruction mov, EBP pointe également ici, et le bas de la pile forme
    la troisième instruction soustraction , ESP-24, le haut de la pile se déplace, laissant suffisamment d'espace
  • Affecter des variables locales : 4, 5 pièces
    125 envoyées à l'adresse de ebp-12
    80 envoyées à l'adresse de ebp-8
  • Préparer les paramètres d'entrée : 6 à 9 éléments
    80 sont envoyés à ESP+4 (c'est-à-dire attribuer une valeur au paramètre t2)
    et 125 sont envoyés à esp (c'est-à-dire attribuer une valeur à t1)

Notez que les affectations de paramètres formels sont dans l'ordre, de droite à gauche

  • call :
    exécute le processus appelé, tournez pour ajouter pour exécuter
    les première et deuxième instructions d'ajout sont également push et mov,
    chaque fonction est la même
  • Ajouter la préparation :
    poussez la valeur de EBP dans l'appelant
    pour former le bas du cadre de la pile d'ajout. Le bas
    de la pile est le processus d'appel de cette fonction. Par exemple, l'appelant est le processus d'appel de l'ajout.
    L'exécution se termine.
  • La valeur de retour est toujours en EAX
  • Après le retour de l'appel, l'adresse de l'instruction suivante est toujours poussée sur la pile.
    L'adresse de retour est en fait l'adresse de mov dans l'avant-dernière ligne.
    Lorsque ret est exécuté, ret récupère l'adresse de retour et l'envoie au registre EIP ( PC)
  • Mettez la valeur de retour dans la somme
  • return sum place la valeur de sum dans le registre EAX
  • Étape de fin : les deux derniers éléments
    restaurent la scène, congé consiste à retourner la pile
    , rendre ESP égal à EBP, et tout le contenu au milieu est perdu,
    puis pop le contenu pointé par ESP à EBP, c'est-à-dire restaurer le bas de la pile de la fonction précédente,
    puis ESP pointe vers l'unité précédente, qui est l'adresse de retour.

Processus général de la fonction C

– étape de préparation
• former le bas du cadre : instruction push et instruction mov
• générer un cadre de pile (si nécessaire) : sous-instruction ou et instruction
• sauvegarder la scène (s'il y a un registre de sauvegarde appelé) : instruction mov
– procédure (fonction ) corps
• Allouer de l'espace aux variables locales et affecter des valeurs
• Logique de traitement spécifique, si un appel de fonction est rencontré
- Préparer les paramètres :
envoyer les paramètres réels aux paramètres d'entrée du cadre de pile
- Instruction CALL :
enregistrer l'adresse de retour et transférer vers le fonction appelée
• Préparer les paramètres de retour dans
l'étape EAX –End
• Désempiler : instruction leave ou pop instruction
• Prendre l'adresse de retour et retour : instruction ret


Référence : Fondamentaux du système informatique NTU (1)

Je suppose que tu aimes

Origine blog.csdn.net/weixin_61631200/article/details/127407334
conseillé
Classement