Pourquoi les piles poussent-elles typiquement vers le bas?

je sais que dans les architectures que je connais personnellement (x86, 6502, etc), la pile pousse typiquement vers le bas (c'est-à-dire que chaque élément poussé sur la pile résulte en un SP décrémenté, pas un SP incrémenté).

je me demande Quelle en est la raison historique. Je sais que dans un espace d'adresse unifié, il est commode de démarrer la pile à l'extrémité opposée du segment de données (disons) donc il n'y a qu'un problème si les deux côtés entrent en collision au milieu. Mais pourquoi la pile traditionnellement obtenir le haut? D'autant plus que c'est le contraire du modèle "conceptuel"?

(et notez que dans l'architecture 6502, la pile croît aussi vers le bas, même si elle est limitée à une seule page de 256 octets, et ce choix de direction semble arbitraire.)

81

6 réponses

quant à la raison d'être historique, Je ne peux pas en être certain (parce que je ne les ai pas conçues). Mes pensées sur la question sont que les CPU de début ont obtenu leur programme original compteur réglé à 0 et il était un désir naturel de commencer la pile à l'autre extrémité et de croître vers le bas, puisque leur code augmente naturellement vers le haut.

comme mise à part, notez que ce réglage du programme à 0 lors de la remise à zéro n'est pas le cas pour tous premiers CPU. Par exemple, le Motorola 6809 récupérerait le compteur de programmes à partir des adresses 0xfffe/f de sorte que vous pourriez commencer à courir à un endroit arbitraire, en fonction de ce qui a été fourni à cette adresse (habituellement, mais en aucun cas limité à, ROM).

une des premières choses que certains systèmes historiques feraient serait de scanner la mémoire du haut jusqu'à ce qu'il trouve un endroit qui relirait la même valeur écrite, de sorte qu'il connaîtrait la véritable RAM installé (par exemple, un z80 avec un espace D'adresse 64K n'avait pas nécessairement 64K ou RAM, en fait 64K aurait été massive dans Mes premiers jours). Une fois qu'il a trouvé l'adresse réelle supérieure, il réglerait le pointeur de pile de manière appropriée et pourrait alors commencer à appeler des sous-routines. Cette numérisation est généralement effectuée par le code CPU dans la ROM dans le cadre du démarrage.

en ce qui concerne la croissance des piles, toutes ne poussent pas vers le bas, voir cette réponse pour plus de détails.

41
répondu paxdiablo 2017-05-23 11:47:12

une bonne explication que j'ai entendu était que certaines machines dans le passé ne pouvaient avoir que des offsets non signés, donc vous voudriez à la pile de se développer vers le bas afin que vous puissiez frapper vos locaux sans avoir à perdre l'instruction supplémentaire de simuler un offset négatif.

19
répondu anq 2010-01-10 00:45:06

une raison possible pourrait être qu'il simplifie l'alignement. Si vous placez une variable locale sur la pile qui doit être placée sur une limite de 4 octets, vous pouvez simplement soustraire la taille de l'objet du pointeur de pile, et ensuite zéro sur les deux bits inférieurs pour obtenir une adresse correctement alignée. Si la pile augmente vers le haut, assurer l'alignement devient un peu plus délicat.

6
répondu jalf 2010-01-10 00:45:21

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

4
répondu Christian V 2010-01-10 00:42:27

je crois que c'est purement une décision de conception. Tous n'évoluent pas à la baisse -- voir ce fil de SO pour une bonne discussion sur la direction de la croissance de la pile sur différentes architectures.

2
répondu Kaleb Brasee 2017-05-23 12:34:19

je crois que la convention a commencé avec L'IBM 704 et son tristement célèbre "registre décrément". Le discours moderne l'appellerait un champ offset de l'instruction, mais le point est qu'ils sont allés vers le bas , pas vers le haut .

1
répondu luser droog 2011-09-23 10:21:54