registre du processeur central d'un ordinateur dont le rôle est de gérer la pile d'appels . Sur une machine à architecture à accumulateur , il peut s'agir d'un registre dédié. Sur une machine disposant de plusieurs registres à usage général , il peut s'agir d'un registre réservé par convention, comme sur les architectures IBM System/360 à z/Architecture et les architectures RISC , ou d'un registre utilisé par les instructions d'appel et de retour de procédure, comme sur les architectures PDP-11 , VAX et Intel x86 . Certaines conceptions, comme le Data General Eclipse, ne disposaient pas de registre dédié, mais utilisaient une adresse mémoire matérielle réservée pour cette fonction.
Les machines antérieures à la fin des années 1960 , telles que le PDP-8 et le HP 2100 , ne disposaient pas de compilateurs prenant en charge la récursivité . Leurs instructions de sous-programme sauvegardaient généralement l'adresse courante dans l'adresse de saut, puis incrémentaient le compteur de programme à l' adresse suivante . Bien que cette méthode soit plus simple que la gestion d'une pile, puisqu'il n'y a qu'une seule adresse de retour par section de code de sous-programme, la récursivité exige un effort considérable de la part du programmeur.
Une machine à pile peut avoir 2 registres de pile ou plus — l'un d'eux garde la trace d'une pile d'appels , l'autre (ou les autres) garde la trace d'une ou plusieurs autres piles .
Moteur de pile
Les processeurs plus simples stockent le pointeur de pile dans un registre matériel classique et utilisent l' unité arithmétique et logique (UAL) pour manipuler sa valeur. Dans les processeurs dotés d'instructions permettant d'empiler et de dépiler des éléments, ces instructions sont soit exécutées par plusieurs cycles d'horloge câblés ( micro -instructions) , soit traduites en plusieurs micro-opérations , afin d'ajouter/soustraire séparément le pointeur de pile et d'effectuer le chargement/stockage en mémoire.
Les processeurs plus récents de ce type intègrent un moteur de pile dédié afin d'optimiser les opérations de pile. Le Pentium M a été le premier processeur x86 à introduire un tel moteur. Dans son implémentation, le pointeur de pile est réparti entre deux registres : ESP<sub> O </sub>, un registre 32 bits, et ESP <sub>d</sub> , une valeur delta 8 bits mise à jour directement par les opérations de pile. Les opcodes PUSH, POP, CALL et RET agissent directement sur le registre ESP<sub> d </sub>. Si ESP <sub>d</sub> est proche d'un dépassement de capacité ou si le registre ESP est référencé par d'autres instructions (lorsque ESP<sub> d</sub> ≠ 0), une micro-opération de synchronisation est insérée. Cette micro-opération met à jour ESP<sub> O</sub> à l'aide de l'UAL et réinitialise ESP <sub>d</sub> à 0. Cette conception est restée globalement inchangée dans les processeurs Intel ultérieurs, bien que la taille d'ESP<sub> O</sub> ait été étendue à 64 bits.
Un moteur de pile similaire à celui d'Intel a également été adopté dans la microarchitecture AMD K8 . Dans Bulldozer , le besoin de micro-opérations de synchronisation a été supprimé, mais la conception interne du moteur de pile reste inconnue.