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.
Hah, oznaczony jako duplikat prawie trzy lata później. – CatShoes