Quelles sont les ESP et EBP registres?
J'ai trouvé que le registre ESP est le pointeur de pile actuel et EBP est le pointeur de la base de l'actuel cadre de pile. Cependant, je ne comprends pas ces définitions (je commence tout juste à apprendre à coder en assembleur).
Ce que je comprends, c'est que les ESP des points en vue de la pile elle-même et EBP points vers tout ce qui est en haut de la pile. Mais ce ne sont que mes suppositions et ils sont le plus probablement incorrect. Sinon, ce serait un énoncé comme le suivant signifie?
MOV EBP, ESP
EDIT : je pense que la déclaration ci-dessus est une faute de frappe de mon livre. Je pense qu'il devrait être EBX au lieu de EBP
- EBX et EBP sont différents registres.
Vous devez vous connecter pour publier un commentaire.
esp est le pointeur de pile, ebp est/était pour une pile du cadre de sorte que lorsque vous avez entré une fonction ebp pourrait obtenir une copie de l'esp à ce point, tout sur la pile avant que cela arrive, l'adresse de retour, passés en paramètres, etc et les choses qui sont au monde que la fonction (variables locales) va maintenant être statique distance de la pile pointeur de cadre pour la durée de la fonction. l'esp est désormais libre de se promener sur le compilateur désirs et peuvent être utilisés lors de l'imbrication des autres fonctions (chacun doit préserver l'ebp naturellement).
c'est une manière paresseuse pour gérer la pile. fait compilateur de débogage beaucoup plus facile, permet de comprendre le code généré par le compilateur est plus facile, mais brûle un registre qui pourrait en être autrement à des fins générales.
Normalement EBP est utilisé pour la sauvegarde de l'ESP, de sorte que si l'ESP est modifiée par le code dans une fonction, tout ce qu'il faut pour restaurer l'ESP est mov ESP, EBP. Aussi depuis EBP est normalement laissé inchangé par le code dans une fonction, il peut être utilisé pour accéder à transmettre des paramètres ou des variables locales sans avoir à ajuster les décalages.
Pour "stack frame" utilisation, EBP est poussé sur la pile au début de toute fonction, de sorte que la valeur de EBP poussé sur la pile est la valeur de EBP de la fonction qui a appelé la fonction en cours. De ce fait, il possible pour le code ou pour un débogueur de "trace" dans le cas où EBP a été poussé sur la pile, et chaque instance d'un EBP valeur sur la pile, ce qui pourrait être considéré comme le pointeur de la base d'un cadre de pile.
Noter que certains compilateurs ont un "omettre cadre des pointeurs" option, auquel cas EBP n'est pas utilisé pour économiser de l'ESP ou comme une pile pointeur de l'image. Au lieu de cela, le compilateur garde la trace de l'ESP, et à tous les décalages sont les décalages de la valeur actuelle de l'ESP.
EBP et ESP sont des restes de l'époque où les compilateurs n'ont pas par exemple l'analyse statique de détecter le nombre d'octets de la pile est nécessaire dans un appel de fonction. Également de la pile était censé dynamiquement augmenter ou diminuer au cours de l'exécution d'une fonction, d'interruptions aurait permis à la corbeille tout la pile de 0 à la SP, et de code spaghetti a été la norme de facto. En fait les interruptions (et passage de paramètres par le biais de registres seul) ont été conçues méthode pour appeler les fonctions du noyau.
Dans le cadre d'un besoins d'avoir un point fixe de la pile, où l'adresse de retour à l'appelant, les variables locales et les arguments d'une fonction est toujours présent. Ainsi, le
bp
registre a été justifiée. Dans cette architecturebp
a été autorisé à être indexé ([bp - 300h]), maissp
ne l'était pas. Ces opcodes/mode d'encodages qui aurait pu être interprété commemov ax, [sp + 1111h]
ont été réutilisés à d'autres fins.En 386+ et par la mise en place du "E", ESP acquis la propriété de décalage. À ce moment
EBP
a été libéré de l'unique but, commeesp
a été en mesure de gérer deux tâches.Note, que même aujourd'hui
EBP
points à la mémoire par le biais de la pile segment, tout commeESP
. EBX et BX utiliser DS.