À quoi sert un pointeur de pile utilisé dans les microprocesseurs?
je me prépare pour un examen de microprocesseur. Si l'utilisation d'un compteur de programme doit contenir l'adresse de l'instruction suivante, à quoi sert stack pointer?
9 réponses
une pile est un LIFO (last in, first out - la dernière entrée que vous appuyez sur la pile est la première entrée que vous obtenez lorsque vous pop) structure de données qui est généralement utilisé pour maintenir les cadres de la pile (bits de la pile qui appartiennent à la fonction courante).
comprend, sans s'y limiter:
- l'adresse de retour.
- une place pour une valeur de retour.
- passe les paramètres.
- variables locales.
vous poussez des articles sur la pile et les enlevez. Dans un microprocesseur, la pile peut être utilisée à la fois pour les données utilisateur (telles que les variables locales et les paramètres passés) et données CPU (telles que les adresses de retour lors de l'appel de sous-routines).
la véritable implémentation d'une pile dépend de l'architecture du microprocesseur. Il peut grandir en haut ou en bas dans la mémoire et peut déplacer avant ou après les opérations push/pop.
opération qui affectent typiquement la cheminée sont:
- appels et retours de sous-programmes.
- interrompt les appels et revient.
- code poussant et poussant explicitement les entrées.
- manipulation directe du registre SP.
considérez le programme suivant dans mon langage d'Assemblée (fictif) :
Addr Opcodes Instructions ; Comments
---- -------- -------------- ----------
; 1: pc<-0000, sp<-8000
0000 01 00 07 load r0,7 ; 2: pc<-0003, r0<-7
0003 02 00 push r0 ; 3: pc<-0005, sp<-7ffe, (sp:7ffe)<-0007
0005 03 00 00 call 000b ; 4: pc<-000b, sp<-7ffc, (sp:7ffc)<-0008
0008 04 00 pop r0 ; 7: pc<-000a, r0<-(sp:7ffe[0007]), sp<-8000
000a 05 halt ; 8: pc<-000a
000b 06 01 02 load r1,[sp+2] ; 5: pc<-000e, r1<-(sp+2:7ffe[0007])
000e 07 ret ; 6: pc<-(sp:7ffc[0008]), sp<-7ffe
suivons maintenant l'exécution, en décrivant les étapes indiquées dans les commentaires ci-dessus:
- C'est la condition de départ où le compteur de programme est zéro et le pointeur de pile est 8000 (tous ces nombres sont hexadécimaux).
- cela charge simplement le registre r0 avec la valeur immédiate 7 et passe à l'étape suivante (je suppose que vous comprenez que le comportement par défaut sera de passer à l'étape suivante à moins d'indication contraire).
- cela pousse r0 sur la pile en réduisant le pointeur de pile de deux puis en stockant la valeur du Registre à cet endroit.
- ça s'appelle un sous-programme. Ce que aurait été le compteur de programme est poussé sur la pile de la même manière que r0 à l'étape précédente et ensuite le compteur de programme est réglé à sa nouvelle valeur. Ce n'est pas différent d'une poussée au niveau de l'utilisateur autre que le fait que c'est fait plus qu'un système de niveau de la chose.
- ceci charge r1 à partir d'un emplacement de mémoire calculé à partir du pointeur de pile - il montre un moyen de passer les paramètres aux fonctions.
- la déclaration de retour extrait la valeur d'où le pointeur de pile pointe et la charge dans le compteur de programme, en ajustant le pointeur de pile vers le haut en même temps. C'est comme un pop au niveau du système (voir étape suivante).
- enlever r0 de la pile implique d'extraire la valeur d'où le pointeur de pile pointe puis en ajustant ce pointeur de pile vers le haut.
- L'instruction D'arrêt laisse tout simplement le compteur de programme là où il est, une boucle infinie en quelque sorte.
nous espérons que cette description deviendra claire. En résumé: une pile est utile pour stocker L'état D'une manière LIFO et c'est généralement idéal pour la façon dont la plupart des microprocesseurs font des appels de sous-programmes.
sauf si vous êtes un SPARC bien sûr, dans ce cas vous utilisez un tampon circulaire pour votre pile: -)
mise à jour: juste pour clarifier les étapes prises lors de la poussée et de popping valeurs dans l'exemple ci-dessus (que ce soit explicitement ou par appel / retour), voir les exemples suivants:
LOAD R0,7
PUSH R0
Adjust sp Store val
sp-> +--------+ +--------+ +--------+
| xxxx | sp->| xxxx | sp->| 0007 |
| | | | | |
| | | | | |
| | | | | |
+--------+ +--------+ +--------+
POP R0
Get value Adjust sp
+--------+ +--------+ sp->+--------+
sp-> | 0007 | sp->| 0007 | | 0007 |
| | | | | |
| | | | | |
| | | | | |
+--------+ +--------+ +--------+
Le pointeur de pile stocke l'adresse de l'entrée la plus récente qui a été poussé sur la pile.
pour pousser une valeur sur la pile, le pointeur de pile est incrémenté pour pointer vers la prochaine adresse mémoire physique, et la nouvelle valeur est copiée vers cette adresse en mémoire.
De la pop une valeur de la pile, la valeur est copiée à partir de l'adresse du pointeur de pile, et le pointeur de pile est décrémenté, pointant vers le prochain élément dans pile.
l'utilisation la plus typique d'une pile de matériel est de stocker l'adresse de retour d'un appel de sous-programme. Lorsque la sous-routine est terminée, l'adresse de retour est débitée du haut de la pile et placée dans le Registre du compteur de programmes, ce qui fait que le processeur reprend l'exécution à l'instruction suivante suivant l'appel à la sous-routine.
http://en.wikipedia.org/wiki/Stack_%28data_structure%29#Hardware_stacks
Vous avez obtenu plus de la préparation [pour l'examen] à faire ;-)
Le Pointeur de Pile est un registre qui contient l'adresse de la prochaine place sur la pile.
la pile est une zone en mémoire qui est réservée pour stocker une pile, qui est un type de conteneur LIFO (dernier entré premier sorti), où nous stockons les variables locales et l'adresse de retour, permettant une gestion simple de l'imbrication des appels de fonction dans un programme typique.
Voir ce article de Wikipedia pour une explication de base de la gestion de la pile.
pour 8085: Stack pointer est un enregistreur 16 bits à usage spécial dans le microprocesseur, qui détient l'adresse du sommet de la pile.
le registre de pointeur de pile dans un ordinateur est mis à disposition pour une utilisation générale par des programmes exécutant à des niveaux de privilèges inférieurs à ceux des manipulateurs d'interruption. Un ensemble d'instructions dans de tels programmes, à l'exclusion des opérations de pile, stocke des données autres que le pointeur de pile, telles que les opérandes, et similaires, dans le pointeur de pile inscrire. Lors de la commutation de l'exécution vers un gestionnaire d'interruption sur une interruption, les données d'adresse de retour pour le programme en cours d'exécution sont poussées sur une pile au niveau de privilège du gestionnaire d'interruption. Ainsi, stocker d'autres données dans le registre des pointeurs de la pile n'entraîne pas de corruption de la pile. De plus, ces instructions peuvent stocker des données dans une partie scratch d'un segment de pile au-delà du pointeur de pile actuel.
Lire celui-ci pour plus d'informations.
la pile est une zone de mémoire pour conserver des données temporaires. Stack est utilisé par l'instruction CALL pour conserver l'adresse de retour pour les procédures l'instruction return RET tire cette valeur de la pile et retourne à ce décalage. La même chose se produit quand une instruction INT appelle une interruption. Il stocke dans la pile le registre du drapeau, le segment de code et l'offset. L'instruction IRET est utilisée pour revenir de l'appel d'interruption.
de La Pile est un Last In First Out (LIFO) de la mémoire. Les données sont placées sur la pile avec une instruction PUSH et retirées avec une instruction POP. La mémoire de pile est maintenue par deux registres: le pointeur de pile (SP) et le registre de segment de pile (SS). Lorsqu'un mot de données est poussé sur la pile, le octet 8 bits de haut niveau est placé à L'emplacement SP-1 et le octet 8 bits de bas niveau est placé à L'emplacement SP-2. Le PS est alors décrété par 2. Le SP s'ajoute au registre (SS x 10H), pour former l'adresse mémoire physique de la pile. Inverse la séquence se produit lorsque les données sont extraites de la pile. Lorsqu'un mot de données est sorti de la pile, le octet 8 bits de haut ordre est obtenu à L'emplacement SP-1 et le octet 8 bits de bas niveau est obtenu à l'emplacement SP-2. Le PS est alors incrémenté de 2.
le pointeur de pile tient l'adresse au sommet de la pile. Une pile permet aux fonctions de passer les arguments stockés sur la pile les uns aux autres, et de créer des variables scoped . Scope dans ce contexte signifie que la variable est désactivée de la pile lorsque le cadre de la pile est parti, et/ou lorsque la fonction retourne. Sans pile, vous devez utiliser des adresses de mémoire pour tout. Cela rendrait la conception impossible (ou du moins très difficile) langages de programmation de haut niveau pour l'architecture. De plus, chaque mode CPU a généralement son propre pointeur de pile. Ainsi, lorsque des exceptions se produisent (interruptions par exemple), la routine du gestionnaire d'exceptions peut utiliser sa propre pile sans corrompre le processus utilisateur.
si jamais vous avez envie d'une compréhension plus profonde, je recommande vivement Patterson et Hennessy comme intro et Hennessy et Patterson comme intermédiaire vers un texte avancé. Ils sont chers, mais vraiment pas pareil; je souhaite juste que l'un ou l'autre ou les deux étaient disponibles lorsque j'ai obtenu ma maîtrise et entré dans la main-d'œuvre de concevoir des puces, des systèmes, et des pièces de logiciel de système pour eux (mais, hélas!, qui a été trop longtemps;-). Pile pointeurs sont donc la distinction entre un microprocesseur et tout autre type de CPU si importante dans ce contexte... ou, d'ailleurs, dans un autre contexte, dans les dernières décennies...!-) que je doute de tout, mais un couple de approfondie de-la-terre-up séances de mise à jour peut vous aider!- )
sur certains CPU, il y a un ensemble dédié de registres pour la pile. Lors d'un appel, l'instruction est exécutée, un registre est chargé avec le compteur de programme, en même temps qu'un deuxième registre est chargé avec le contenu de la première, un troisième registre est chargé de la deuxième, et un quatrième à la troisième, etc. Quand une instruction de retour est exécutée, le compteur de programme est verrouillé avec le contenu du premier registre de pile et en même temps que ce registre est verrouillé à partir de le second; ce second registre est chargé à partir d'un troisième, etc. Notez que ces piles de matériel ont tendance à être plutôt petites (beaucoup de micros de série PIC plus petites, par exemple, ont une pile à deux niveaux).
alors qu'une pile de matériel a certains avantages (push et pop n'ajoutent pas de temps à un appel/retour, par exemple) avoir des registres qui peuvent être chargés avec deux sources ajoute du coût. Si la pile devient très grande, il sera moins cher de remplacer les registres push-pull par un de mémoire adressable. Même si une petite mémoire dédiée est utilisée pour cela, il est moins coûteux d'avoir 32 registres adressables et un registre pointeur 5 bits avec une logique incrémentielle/Décroissante, que d'avoir 32 registres chacun avec deux entrées. Si une application peut avoir besoin de plus de pile que celle qui pourrait facilement s'adapter sur le CPU, il est possible d'utiliser un pointeur de pile ainsi qu'une logique pour stocker/récupérer des données de pile depuis la RAM principale.
Un pointeur de pile est un petit registre qui stocke l'adresse du sommet de la pile. Il est utilisé pour pointer l'adresse du sommet de la pile.