Quelle est la différence entre un pointeur de pile et un pointeur de trame?


Réponse 1:

Voici un extrait de code de Visual Studio qui montre les deux. C'est le tout début d'une fonction.

013D16F0 push ebp 013D16F1 mov ebp, esp 013D16F3 sub esp, 0C4h  

ebp est le pointeur de trame. Les variables locales, ainsi que les variables qui ont été transmises sur la pile peuvent être des références provenant d'ebp, et il est garanti qu'elles ne changeront pas pendant toute la fonction. Notez que le "Frame" est alloué sur la pile. Pour accéder à une variable locale sur le cadre de la pile, cela ressemblerait à quelque chose,

MOV EAX, [EBP-C4h]

esp est la pile du processeur. Et le pointeur de pile. Lorsque vous poussez ou faites éclater quelque chose dans cette pile, esp change. Vous ne pouvez donc pas vraiment y référencer de variables, car il est toujours en mouvement. Et si vous appelez une autre fonction depuis la vôtre, vous devez POUSSER le pointeur de trame sur la pile et le restaurer après l'appel.


Réponse 2:

La principale différence est que, pendant la durée de vie d'une fonction, le pointeur de pile peut changer (par exemple, dans les arguments x86, les fonctions sont passées sur la pile via des instructions push qui mettent à jour le pointeur de pile) tandis que le pointeur de trame ne change pas pendant la durée de vie d'une fonction. Par exemple, dans x86, les variables locales sont accessibles en utilisant ebp (pointeur de trame) comme adresse de base et un décalage qui est déterminé au moment de la compilation. Étant donné que le pointeur de trame est fixe pour la durée de vie d'une fonction, il peut être utilisé pour accéder à des variables locales à tout moment de la durée de vie de la fonction.


Réponse 3:

La principale différence est que, pendant la durée de vie d'une fonction, le pointeur de pile peut changer (par exemple, dans les arguments x86, les fonctions sont passées sur la pile via des instructions push qui mettent à jour le pointeur de pile) tandis que le pointeur de trame ne change pas pendant la durée de vie d'une fonction. Par exemple, dans x86, les variables locales sont accessibles en utilisant ebp (pointeur de trame) comme adresse de base et un décalage qui est déterminé au moment de la compilation. Étant donné que le pointeur de trame est fixe pour la durée de vie d'une fonction, il peut être utilisé pour accéder à des variables locales à tout moment de la durée de vie de la fonction.