Есть много низкоуровневых микроконтроллеров, которые имеют аппаратные стеки для подпрограммного вызова / возврата и обработки прерываний, но затрудняют, если не делают невозможным хранение данных (переменных) там, и реализация чисто программного стека данных будет ужасно неэффективной. 8051 является одним классическим примером, а PIC низкого уровня (PIC12 / PIC16) - другим. На этих машинах стек данных эмулируется путем назначения статических мест хранения для автоматических переменных, причем количество повторного использования этих мест зависит от сложности компилятора.
Обратите внимание, что если эмуляция стека выполняется таким образом, это означает, что рекурсия - функция, которая вызывает себя, прямо или косвенно - не работает, поскольку каждый экземпляр функции повторно использует одни и те же статические местоположения для своих якобы «частных» переменных. Некоторые компиляторы допускают ограниченное использование рекурсии (обычно реализуемой с помощью #pragma
некоторого вида), что приведет к созданию истинного стека данных независимо от того, насколько он замедляет работу.
Кроме того, существуют архитектуры ЦП, которые вообще не имеют аппаратного стека, даже для подпрограмм / обработки прерываний, включая DEC PDP-8 и IBM System / 360. На этих машинах ПК (обратный адрес) и регистр состояния (для прерываний) были сохранены в регистрах или ячейках памяти, но в каждом случае, который я могу себе представить, машина также имела достаточно гибкие режимы адресации, которые позволяли легко создавать стек с программным обеспечением.