Je pense principalement que vous confondez entre une program's stack
et any old stack
.
A Stack
Est une structure de données abstraite qui consiste en des informations dans un système de type "Last In First Out". Vous placez des objets arbitraires sur la pile et vous les enlevez ensuite, un peu comme un plateau d'entrée/sortie, l'élément du haut est toujours celui qui est enlevé et vous mettez toujours l'élément du haut.
Une pile de programmes
Une pile, c'est une section de la mémoire qui est utilisée pendant l'exécution, elle a généralement une taille statique par programme et est fréquemment utilisée pour stocker les paramètres des fonctions. Vous poussez les paramètres sur la pile lorsque vous appelez une fonction et la fonction adresse directement la pile ou extrait les variables de la pile.
Une pile de programmes n'est généralement pas matérielle (bien qu'elle soit conservée en mémoire et qu'elle puisse donc être considérée comme telle), mais le pointeur de pile qui indique une zone actuelle de la pile est généralement un registre du CPU. Cela la rend un peu plus flexible qu'une pile LIFO car vous pouvez changer le point auquel la pile s'adresse.
Vous devez lire et vous assurer que vous comprenez le wikipedia car il donne une bonne description de la pile matérielle, qui est ce à quoi vous avez affaire.
Il existe également ce tutoriel qui explique la pile en termes d'anciens registres à 16 bits, mais qui pourrait être utile et un autre spécifiquement sur la pile.
De Nils Pipenbrinck :
Il convient de noter que certains processeurs n'implémentent pas toutes les instructions d'accès et de manipulation de la pile (push, pop, pointeur de pile, etc.), mais le x86 le fait en raison de sa fréquence d'utilisation. Dans ces situations, si vous voulez une pile, vous devez l'implémenter vous-même (certains processeurs MIPS et ARM sont créés sans pile).
Par exemple, dans les MIPs, une instruction de poussée serait mise en œuvre comme suit :
addi $sp, $sp, -4 # Decrement stack pointer by 4
sw $t0, ($sp) # Save $t0 to stack
et une instruction Pop ressemblerait à :
lw $t0, ($sp) # Copy from stack to $t0
addi $sp, $sp, 4 # Increment stack pointer by 4
3 votes
La plupart de ces réponses parlent de la pile telle qu'elle est utilisée par les langages, en particulier ils parlent de passer des arguments sur la pile. Dans de nombreux processeurs, cela ne sert qu'à faciliter l'implémentation des langages. Si vous codiez manuellement en assembleur, vous passiez généralement les paramètres aux fonctions dans des registres (du moins avant que le processeur ne soit optimisé pour les opérations sur la pile, car les langages l'utilisaient beaucoup). La pile sert principalement à maintenir l'ordre des appels/retours, de même qu'une interruption (qui doit sauvegarder l'état du processeur) pousse les valeurs existantes dans les registres qu'elle utilisera et les retire avant de revenir.