Existem muitos microcontroladores de baixo nível que possuem pilhas de hardware para chamada / retorno de sub-rotina e manipulação de interrupções, mas dificultam, se não impossível, o armazenamento de dados (variáveis) lá, e a implementação de uma pilha de dados puramente de software seria terrivelmente ineficiente. O 8051 é um exemplo clássico e os PICs low-end (PIC12 / PIC16) são outro. Nessas máquinas, a pilha de dados é emulada atribuindo locais de armazenamento estático para variáveis automáticas, com a quantidade de reutilização desses locais dependente da sofisticação do compilador.
Observe que se a emulação de pilha estiver sendo feita dessa maneira, isso significa que a recursão - uma função que se chama direta ou indiretamente - não funciona, pois cada instância da função reutiliza os mesmos locais estáticos para suas variáveis supostamente "privadas". Alguns compiladores permitem o uso limitado de recursão (normalmente implementado por meio de #pragma
algum tipo), o que fará com que ele crie uma pilha de dados verdadeira, não importa o quanto isso lentifique.
Apenas como um aparte, houve arquiteturas de CPU que não tinham uma pilha de hardware, nem mesmo para manipulação de sub-rotina / interrupção, incluindo o DEC PDP-8 e o IBM System / 360. Nessas máquinas, o PC (endereço de retorno) e o registro de status (para interrupções) foram salvos em registradores ou locais de memória, mas em todos os casos em que posso pensar, a máquina também tinha modos de endereço suficientemente flexíveis que facilitavam a criação de uma pilha com software.