2017-09-03 2 views
0

J'ai une fonction principale qui appelle une autre fonction. J'ai lu dans de nombreux endroits que les éléments suivants se produit lorsqu'un appel de fonction a lieu:esp et ebp enregistre le comportement dans l'appel de fonction

push %ebp 
movl %esp, %ebp 

Mon but est de trouver le haut de la pile avant et après l'appel de fonction. Ce qui suit est mon principal:

#include <stdio.h> 
long *ebp; 
int main(){ 
    asm("movl %ebp,ebp"); 
    printf("Top of stack before calling function 0x%08x",ebp); 
    func(); 
    return 0; 
} 
long *ebp; 
long *ebp; 
void func(){ 
    asm("movl %esp,esp"); 
    asm("movl %ebp,ebp"); 
    printf("\n\n Top of stack after entering function 0x%08x",ebp); 
    printf("\n\n Top of stack before entering function 0x%08x",ebp+2); 
} 

Ma question est, si la déclaration d'impression principale donne la même valeur que la deuxième instruction d'impression Func, comme les deux donnent le haut de la pile avant d'entrer dans la fonction ?

+0

Ce code écrit deux fois dans la variable esp mais ne l'imprime pas. Il écrit à ebp une fois et imprime ebp et ebp plus 2. Je ne pense pas que le code illustre réellement votre question. Si vous pouvez résoudre ce problème, je peux peut-être y répondre. – prl

+0

Ouais désolé !! Je l'ai changé maintenant. – Ajayv

+0

Vous faites quelque chose de mal, mais de toute façon, la valeur de esp différera d'au moins 4 en raison de l'adresse de retour placée sur la pile. Si vous êtes intéressé par les valeurs de registre, vous devriez probablement utiliser un débogueur et ne pas essayer de jouer avec inline asm. – Jester

Répondre

0

Si vous avez raison sur le prologue de la fonction,

push %ebp 
movl %esp, %ebp 

alors la différence entre esp avant d'appeler la fonction et esp dans la fonction devrait être de 8 octets, pas 2: 4 octets pour l'adresse de retour et 4 octets pour la valeur sauvegardée de ebp.