111 votes

Pourquoi les piles généralement pousser vers le bas?

Je sais que dans les architectures personnellement, je suis familier avec (x86, 6502, etc), la pile pousse vers le bas (c'est à dire que chaque élément poussé sur la pile des résultats dans un décrémenté SP, pas un incrémenté).

Je m'interroge sur la justification historique de cette. Je sais que dans un cadre unifié de l'espace d'adresse, il est commode de commencer la pile à l'autre extrémité du segment de données (dire) donc il n'y a qu'un problème si les deux parties entrent en collision dans le milieu. Mais pourquoi la pile traditionnellement obtenir le haut? Surtout compte tenu de la façon dont c'est le contraire de la "conceptuel" modèle?

(Et notez que dans le 6502 de l'architecture, de la pile pousse également à la baisse, même si elle est limitée à un seul de 256 octets de la page, et en ce sens le choix semble arbitraire.)

Merci!

61voto

paxdiablo Points 341644

Quant à l'historique de la justification, je ne peux pas dire pour certains (parce que je n'ai pas de conception). Mes pensées sur le sujet sont que les premiers Processeurs ont obtenu leur programme d'origine du compteur à 0 et c'était un désir naturel pour démarrer la pile à l'autre extrémité et pousser vers le bas, depuis leur code pousse naturellement vers le haut.

Notez que ce paramètre du programme compteur à 0 sur la réinitialisation n'est pas le cas pour tous les premiers Processeurs.

Une des premières choses à un certain historique de la Cpu sera de balayage de mémoire, depuis le haut jusqu'à ce qu'il trouve un endroit qui aurait lu la même valeur écrite, de sorte qu'il serait de connaître la RAM installée (par exemple, un z80 avec 64 KO de l'espace d'adresse n'a pas nécessairement de 64 ko de RAM, en fait 64K aurait été massive dans mes premiers jours). Une fois qu'il a trouvé le top adresse réelle, ce serait le pointeur de pile de façon appropriée et pourrait alors commencer à appeler des sous-programmes.

À l'égard des piles de la croissance ne sont pas tous de pousser vers le bas, voir cette réponse pour plus de détails.

22voto

anq Points 1420

Une bonne explication que j'ai entendue que certaines machines dans le passé, ne pouvaient avoir unsigned des compensations, si vous voulez la pile à pousser vers le bas afin de vous pourrait frapper vos locaux sans avoir à perdre le surplus de l'instruction pour faux un décalage négatif.

6voto

jalf Points 142628

Une explication possible pourrait être que il simplifie l'alignement. Si vous placez une variable locale sur la pile, qui doit être placé sur une limite de 4 octets, vous pouvez simplement soustraire la taille de l'objet à partir du pointeur de pile, puis à zéro, les deux bits de poids faible pour obtenir un bien alignés adresse. Si la pile grandit vers le haut, en veillant à l'alignement devient un peu plus compliqué.

4voto

Christian Vik Points 1555

IIRC la pile grandit vers le bas car le tas pousse vers le haut. Il aurait pu être dans l'autre sens.

2voto

Kaleb Brasee Points 25776

Je crois que c'est purement une décision de conception. Pas tous d'entre eux pousser à la baisse -- voir ce fil pour une bonne discussion sur l'orientation de la croissance de la pile sur des architectures différentes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X