Чи означає це, що базовий вказівник або покажчик стека насправді рухаються вниз по пам'яті, а не вгору? Чому так?
Так, push
інструкції зменшують покажчик стека і записують у стек, тоді як pop
роблять зворотний, читають із стека та збільшують покажчик стека.
Це дещо історично, оскільки для машин з обмеженою пам’яттю стек був розміщений високо і зростав вниз, тоді як купа була розміщена низько і виросла вгору. Існує лише один проміжок "вільної пам'яті" - між купою та стеком, і цей проміжок розділяється, або кожен може перерости в проміжок за потреби індивідуально. Таким чином, програма втрачає пам'ять лише тоді, коли стек і купа стикаються, не залишаючи вільної пам'яті.
Якщо і стек, і купа ростуть в одному напрямку, тоді є дві прогалини, і стек не може реально перерости в проміжок купи (навпаки, також проблематично).
Спочатку процесори не мали спеціальних інструкцій з обробки стеків. Однак, оскільки підтримка стека була додана до апаратного забезпечення, вона взяла цю схему зростання вниз, і процесори досі слідують цій схемі і сьогодні.
Можна стверджувати, що на 64-бітній машині є достатній адресний простір для дозволу декількох прогалин - і як доказ, кілька прогалин обов'язково мають місце, коли процес має декілька потоків. Хоча це не є достатньою мотивацією для того, щоб змінити ситуацію навколо, оскільки при кількох системах розриву напрямок зростання, мабуть, довільний, тому традиція / сумісність підказує шкалу.
Ви повинні були б змінити інструкції по обробці стеки CPU для того , щоб змінити напрямок стека, або відмовитися від використання виділеного штовхаючи і вискакують інструкції (наприклад push
, pop
, call
, ret
та інших).
Зауважте, що архітектура набору інструкцій MIPS не має виділених значень push
& pop
, тому практично вирощувати стек в будь-якому напрямку - ви все одно можете мати розклад пам’яті з одним розривом для одного потокового процесу, але може збільшити стек вгору та купу вниз. Якщо ви це зробили, однак, деякий код varargs C може потребувати коригування в джерелі або при проходженні параметра під кришкою.
(Насправді, оскільки на MIPS не існує спеціальної обробки стека, ми можемо використовувати приріст до або після збільшення або попередній чи після публікації для натискання на стек до тих пір, поки ми використовуємо точний зворотній бік для вискочення стека, а також припускаючи, що Операційна система поважає обрану модель використання стека. Дійсно, у деяких вбудованих системах та деяких освітніх системах стек MIPS збільшується вгору.)
-4(%rbp)
базовий вказівник зовсім не переміщується, і це+4(%rbp)
не могло б працювати.