Bedeutet dies, dass der Basiszeiger oder der Stapelzeiger die Speicheradressen tatsächlich nach unten verschieben, anstatt nach oben zu gehen? Warum ist das so?
Ja, die push
Anweisungen dekrementieren den Stapelzeiger und schreiben in den Stapel, während pop
umgekehrt vom Stapel gelesen und der Stapelzeiger inkrementiert wird.
Dies ist insofern etwas historisch, als bei Maschinen mit begrenztem Speicher der Stapel hoch und nach unten gewachsen war, während der Haufen niedrig und nach oben gewachsen war. Es gibt nur eine Lücke des "freien Speichers" - zwischen dem Heap & Stack, und diese Lücke wird gemeinsam genutzt, entweder kann man nach Bedarf in die Lücke hineinwachsen. Das Programm hat nur dann nicht genügend Arbeitsspeicher, wenn Stapel und Heap zusammenstoßen und kein freier Arbeitsspeicher mehr vorhanden ist.
Wenn der Stapel und der Haufen beide in die gleiche Richtung wachsen, gibt es zwei Lücken, und der Stapel kann nicht wirklich in die Lücke des Haufens hineinwachsen (das Gegenteil ist ebenfalls problematisch).
Ursprünglich hatten Prozessoren keine speziellen Anweisungen zur Stapelverarbeitung. Als jedoch die Hardware um Stapelunterstützung erweitert wurde, entwickelte sich dieses Muster nach unten, und Prozessoren folgen diesem Muster auch heute noch.
Man könnte argumentieren, dass auf einem 64-Bit-Computer genügend Adressraum vorhanden ist, um mehrere Lücken zuzulassen - und als Beweis sind mehrere Lücken zwangsläufig der Fall, wenn ein Prozess mehrere Threads hat. Dies ist zwar keine ausreichende Motivation, um Dinge zu ändern, da bei Systemen mit mehreren Lücken die Wachstumsrichtung wohl willkürlich ist, sodass Tradition / Kompatibilität den Ausschlag geben.
Sie müßten die CPU - Stack Handhabungsanweisungen ändern , um die Richtung des Stapels zu ändern, oder auch auf der Verwendung der gewidmet gibt nach oben drücken und knallend Anweisungen (zB push
, pop
, call
, ret
, andere).
Beachten Sie, dass die MIPS-Befehlssatzarchitektur kein dediziertes push
& pop
hat. Daher ist es praktisch, den Stapel in beide Richtungen zu vergrößern. Möglicherweise möchten Sie dennoch ein Speicherlayout mit einer Lücke für einen einzelnen Thread-Prozess, aber möglicherweise vergrößern Sie den Stapel nach oben und den Heap abwärts. In diesem Fall ist für einige C- Varg- Codes möglicherweise eine Anpassung der Übergabe der Quell- oder Unter-der-Haube-Parameter erforderlich.
(Da es in MIPS kein dediziertes Stack - Handling gibt, können wir Pre - oder Post - Increment oder Pre - oder Post - Decrement verwenden, um auf den Stack zu drücken, sofern wir die genaue Umkehrung zum Abspringen des Stacks verwenden und auch annehmen, dass Das Betriebssystem respektiert das gewählte Stack-Nutzungsmodell. In der Tat ist der MIPS-Stack in einigen eingebetteten Systemen und einigen Bildungssystemen aufwärts gewachsen.)
-4(%rbp)
überhaupt nicht bewegt wird und+4(%rbp)
möglicherweise nicht funktioniert hat.