Czy to oznacza, że wskaźnik podstawowy lub wskaźnik stosu przesuwają się w dół po adresach pamięci zamiast w górę? Dlaczego?
Tak, push
instrukcje zmniejszają wskaźnik stosu i zapisują na stosie, podczas gdy pop
czynność odwrotna odczytuje ze stosu i zwiększa wskaźnik stosu.
Jest to nieco historyczne, ponieważ dla maszyn z ograniczoną pamięcią stos został umieszczony wysoko i wyrósł w dół, podczas gdy stos został umieszczony nisko i wyrósł w górę. Jest tylko jedna luka „wolnej pamięci” - pomiędzy stertą i stosem, i ta luka jest wspólna, każda z nich może urosnąć do luki według indywidualnych potrzeb. W ten sposób programowi zabraknie pamięci tylko wtedy, gdy stos i sterty zderzą się, nie pozostawiając wolnej pamięci.
Jeśli zarówno stos, jak i sterty rosną w tym samym kierunku, wówczas istnieją dwie luki, a stos nie może tak naprawdę wyrosnąć w szczelinę sterty (na odwrót również problematyczne).
Początkowo procesory nie miały dedykowanych instrukcji obsługi stosu. Ponieważ jednak obsługa sprzętu została dodana do sprzętu, wzrósł on w dół, a procesory nadal podążają za tym wzorem.
Można argumentować, że na 64-bitowej maszynie jest wystarczająca przestrzeń adresowa, aby pozwolić na wiele luk - i jako dowód, wiele luk koniecznie ma miejsce, gdy proces ma wiele wątków. Chociaż nie jest to wystarczająca motywacja do zmiany sytuacji, ponieważ w przypadku systemów z wieloma przerwami kierunek wzrostu jest prawdopodobnie arbitralny, więc tradycja / zgodność przechyla skalę.
Trzeba by zmienić CPU instrukcje obsługi stosu w celu zmiany kierunku stosu, albo zrezygnować z wykorzystaniem dedykowanych popychanie i popping instrukcje (np push
, pop
, call
, ret
, inne).
Zauważ, że architektura zestawu instrukcji MIPS nie ma dedykowanego push
& pop
, więc praktyczne jest powiększanie stosu w dowolnym kierunku - nadal możesz chcieć mieć układ pamięci o pojedynczej przerwie dla procesu z jednym wątkiem, ale możesz zwiększyć stos i górę stosu ku dołowi. Jednak jeśli to zrobisz, niektóre kody C varargs mogą wymagać dostosowania w źródle lub w przekazywaniu parametrów pod maską.
(W rzeczywistości, ponieważ nie ma dedykowanej obsługi stosu w MIPS, możemy użyć przyrostu wstępnego lub końcowego lub zmniejszenia wstępnego lub końcowego w celu wypychania na stos, pod warunkiem, że użyjemy dokładnej odwrotności do zrzucenia stosu, a także zakładając, że system operacyjny przestrzega wybranego modelu wykorzystania stosu. Rzeczywiście, w niektórych systemach wbudowanych i niektórych systemach edukacyjnych stos MIPS jest zwiększany).
-4(%rbp)
ogóle nie przesuwa on wskaźnika bazowego i że+4(%rbp)
to nie mogło działać.