2012-06-28 8 views
15

Uczenie się zestawu x86 i wskaźnika ramki trochę dmucha w moim umyśle. Dowiedziałem się z tego SO question, że EBP czyni życie niesamowitym do debugowania. To świetnie, ale byłem ciekawy: "Do czego jeszcze służy EBP?" Patrząc na artykuł z Wikipedii call stack, EBP jest niezbędny do dynamicznego przydzielania stosów.Czy rejestr EBP (wskaźnik ramki podstawowej) służy tylko do debugowania w x86?

Jak zawsze byłem przy założeniu, że alokacja dynamiczna idzie na kupę. Dlaczego więc chciałbym używać alokacji dynamicznej - dlaczego nie jest wystarczająco dobry? A w jaki sposób EBP jest przydatny?

+2

Hah, oznaczony jako duplikat prawie trzy lata później. – CatShoes

Odpowiedz

9

Przydzielanie niewielkiej ilości pamięci ze stosu jest niezwykle szybkie w porównaniu do przydzielania sterty. Kiedy przydzielamy pamięć ze sterty, musimy zadzwonić do API lub menedżera pamięci.

TAK można użyć rejestru EBP również do innych celów, takich jak innych rejestrów 32-bitowych, ale najpierw musi przechowywać swoją zawartość, a potem przywrócić przed zamknięciem swoją procedurę.

Możesz użyć PUSH EBP do przechowywania zawartości EBP do stosu i do odtworzenia POP EBP.

+0

Czy EBU PUSH EBP/POP EBP wspomina o tym samym, który jest generowany przez kompilator dla wywołań funkcji? – CatShoes

+0

@CatShoes: Zwykle kompilator używa rejestru EBP do uzyskiwania dostępu do dynamicznych zmiennych przydzielonych do stosu jako wskaźnika pamięci stosu, więc jeśli twoja procedura asm jest w środku kodu programu, musisz zachować zawartość EBP. –

+0

Okay, więc jest to dodatek do generowanego przez kompilator użycia EBP. Dzięki! – CatShoes

19

Zakłada się błędnie, że ebp jest konieczne do przydzielenia ramki stosu. Nie jest to prawdą, można użyć bezpośrednio: esp. Używanie ebp jako wskaźnika ramki stosu w dzisiejszych czasach nie jest w żaden sposób konieczne. Istnieje kilka punktów, w których jest to przydatne:

  • w 16-bitowy kod, stosowanie sp (wskaźnik stosu) Odnosząc się poważnie ograniczone w stosunku adresowania nie był bezpośrednio w ogóle możliwe w x86 gdzie bp może być używany w każdym dostępnym trybie adresowania.

  • Powodem tej ograniczonej obsługi były prawdopodobnie dostępne w tym czasie kompilatory, znacznie łatwiej jest wygenerować kod ze wskaźnikami ramek, aby śledzić stale zmieniającą się wersję sp. Istnieje wiele więcej procesorów, które przeszły specjalne wsparcie dla instrukcji ramki stosu, jak leave lub enter, ale AFAIK nikt inny, ale Intel poszedł tak daleko, aby sparaliżować prawdziwe sp w tym procesie :-)

  • debugowania. Znacznie łatwiej jest rozwijać stos, gdy wskaźniki klatek są dostępne, ale nowoczesne debuggery mogą nawet bez niego.

Jeśli chcesz przeznaczyć przestrzeń 100 bajtów na stosie, po prostu zrób sub esp, #100, dostęp do przestrzeni z move [esp + x] gdzie x jest między 0 i 99 i oczyścić z add esp, #100 i gotowe. Powiedziałbym nawet, że używanie wskaźników ramki stosu w ręcznie pisanym złożeniu jest jak kopiowanie zachowania trzydziestoletniego kompilatora, kiedy kompilatory były naprawdę głupie i nie mogły obejść się bez niego. Jest to niezbę dne i przydatne, jeś li piszesz o złożeniu.

+0

Proszę wybacz mi, jestem trochę gęsty. Czy mówisz, że używanie EBP do wskaźników ramki stosu jest mniej lub bardziej bezcelowe, a zamiast tego użycie ESP do tego i EBP jako rejestru ogólnego przeznaczenia? – CatShoes

+0

Tak, mówię, że używanie wskaźnika ramki jest zwykle przestarzałe. Jest to rzecz z przeszłości, która wciąż ma tendencję do pozostawania w pobliżu :-) – hirschhornsalz

+0

Świetnie. Doceniam pomocne informacje. Już wybrałem inną odpowiedź, ale uważam, że twoja jest równie przydatna. Rewizja! – CatShoes

Powiązane problemy