2010-03-29 2 views
4

:problème Ayant la compréhension standard Entrée séquence

_function: 
    push ebp  ;store the old base pointer 
    mov ebp, esp ;make the base pointer point to the current 
        ;stack location – at the top of the stack is the 
        ;old ebp, followed by the return address and then 
        ;the parameters. 
    sub esp, x  ;x is the size, in bytes, of all 
        ;"automatic variables" in the function 

au sommet de la pile est l'ancien ebp, suivi de l'adresse de retour puis les paramètres.

Le vieux ebp est là parce que push ebp,

mais pourquoi sont l'adresse de retour et les paramètres là aussi?

MISE À JOUR

Séquence standard de sortie

mov esp, ebp ;reset the stack to "clean" away the local variables 
pop ebp  ;restore the original base pointer 
ret   ;return from the function 

Qu'est-ret en réalité? Je pense que l'esp devrait déjà avoir atteint l'adresse de retour à la ligne pop ebp

Répondre

4

En x86 convention d'appel standard, avant qu'une fonction ne soit appelée, les paramètres sont d'abord poussés dans la pile.

Et l'op call signifie "pousser l'adresse suivante vers la pile, puis passer à la fonction", de sorte que l'adresse de retour se trouve également sur la pile.

Cela signifie que, avant la push ebp, la pile ressemble à:

... 
param2 
param1 
param0 
return_address <- esp 

Après avoir appelé push ebp il devient

... 
param2 
param1 
param0 
return_address 
ebp   <- esp 

Enfin, mov ebp, esp stocke cette esp dans ebp, donc vous pouvez vous référer à la adresse de retour et tous les paramètres d'entrée relatifs à ebp, et libérer la pile pour une utilisation locale.

+0

Quelle est la différence entre * les variables automatiques * et * les paramètres *? – Mask

+0

@Mask: les variables automatiques sont les variables locales de la fonction. par exemple. 'int f (int y) {int z = y + 7; return z * z; } 'Ici' y' est un paramètre, et 'z' est une variable automatique (locale). – kennytm

+0

merci! J'ai mis à jour un peu sur la séquence de sortie, pourquoi 'ret' est-il nécessaire là? – Mask

0

Tout cela fait partie de l'ABI. Par convention, l'appelant crée un stack frame qui contient des paramètres, etc., puis appelle la fonction (au cours de laquelle l'adresse de retour est également poussée sur la pile). La fonction appelée allouera de l'espace supplémentaire sur la pile pour les variables locales et peut référencer les paramètres et les variables locales via un pointeur et un décalage communs.

+0

Qu'est-ce que * ABI *? BTW pouvez-vous également élaborer comment référencer les paramètres et les variables locales via un pointeur commun et un décalage? – Mask

+0

@Mask: Application Binary Interface. C'est le troisième lien dans Google. – kennytm

+0

@Mask: comme le dit justement KennyTM, l'ABI est l'interface binaire d'application - elle définit les 'conventions d'appel 'pour une architecture donnée. Comme pour les paramètres + variables locales - ils sont tous sur la pile, donc vous utilisez généralement un registre d'adresse comme pointeur dans cette pile et vous pouvez ensuite charger/stocker des locals et des params en utilisant l'adressage indexé/offset. –

Questions connexes