Що означає для процесора підтримка стека?


11

Як CPU не може підтримувати стек? Чи не будь-яка архітектура, яка використовує підпрограми (я впевнений, що це все архітектури), не повинна підштовхувати зворотну адресу на стек, щоб вона могла повернутися туди, звідки вона викликала підпрограму? Стек просто означає ділянку пам'яті з покажчиком, який росте в певному напрямку і виступає як структура даних стека ні? Я просто не розумію, як архітектура не може підтримувати стек.

Якою мірою компілятор порівняно з архітектурою обладнання визначає автоматичне зберігання пам'яті (автоматичні змінні порівняно зі статичними змінними)?

Відповіді:


8

Існує багато мікроконтролерів низького рівня, які мають стеки апаратних засобів для підпрограми виклику / повернення та обробки переривань, але ускладнюють, якщо не неможливо, зберігати дані (змінні) там, а реалізація суто програмного стеку даних буде дуже неефективною. 8051 - один класичний приклад, а PIC12 низького класу (PIC12 / PIC16) - інший. На цих машинах стек даних імітується шляхом призначення статичних місць зберігання для автоматичних змінних, при цьому кількість повторного використання цих розташувань залежить від складності компілятора.

Зауважте, що якщо емуляція стека робиться таким чином, це означає, що рекурсія - функція, яка викликує себе прямо чи опосередковано - не працює, оскільки кожен екземпляр функції повторно використовує однакові статичні місця для своїх нібито "приватних" змінних. Деякі компілятори дозволяють обмежено використовувати рекурсію (як правило, реалізовану за допомогою #pragmaпевного типу), що призведе до створення справжнього стека даних, незалежно від того, наскільки це сповільнює роботу.

Як і осторонь, існували архітектури процесора, які взагалі не мали апаратного стеку, навіть не для підпрограми / обробки перерв, включаючи DEC PDP-8 та IBM System / 360. На цих машинах ПК (зворотна адреса) та реєстр статусу (для перерв) зберігалися в регістрах або місцях пам'яті, але в усіх випадках, про які я думаю, машина також мала досить гнучкі режими адреси, що полегшувало створення стека з програмним забезпеченням.


1
Деякі попередні комп’ютери записують інструкцію про стрибок у код, щоб викликати повернення - не маючи непрямих стрибків - роблячи функції рецентанта непрактичними (теоретично можна було розгалужувати скачок, але це додає складності, в деяких випадках, особливо коли адреси даних повністю закодовані в інструкціях).
Пол А. Клейтон

4

"підтримка стека" означає

  1. що мають явний регістр вказівника стека, і
  2. наявність примітивних інструкцій машинного коду для маніпулювання / використання реєстру вказівника стека (наприклад, reti, який змінює лічильник програми на основі покажчика стека з метою повернення з виклику функції).

Ви можете емуляцію цього без апаратної підтримки за допомогою емуляції, який є згенерованим компілятором кодом, що такі ж речі в ОЗУ, використовуючи змінні. Рідко / рідко не існує прямої підтримки стека в будь-якій сучасній архітектурі комп'ютера.

Семантика змінних мов програмування майже не має нічого спільного з цільовою апаратною архітектурою для будь-якої мови, вищої за пряму збірку. Завдання компіляторів полягає в генерації машинного коду, який відповідає семантичному контракту мови програмування.


1
Більшість ISA RISC (наприклад, MIPS [за винятком MIPS16 та microMIPS], Alpha, SPARC, PA-RISC, Power, SuperH) не мають явного реєстру покажчиків стека, визначаючи їх замість ABI. ARM - виняток (частково тому, що він затінює SP для декількох режимів роботи), як MIP16 та microMIPS (для щільності коду).
Пол А. Клейтон

2

Деякі архітектури (наприклад, PIC) мають апаратний стек з обмеженими можливостями (може використовуватися лише для зворотних адрес, а не змінних). У деяких надзвичайно малих архітектурах немає інструкцій щодо зберігання та збільшення або PUSH, тому складніше робити стек.

'змінні' авто в C завжди повинні бути складені до чогось із поведінкою "авто" ініціалізації та "статичного" зі статичною поведінкою; у деяких архітектурах вам заборонено робити рекурсію, і тоді компілятор може статично розподілити всі змінні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.