Cela signifie-t-il que le pointeur de base ou le pointeur de pile se déplacent réellement vers le bas des adresses de mémoire au lieu de remonter? Pourquoi donc?
Oui, les push
instructions décrémentent le pointeur de pile et écrivent dans la pile, tandis pop
que l’inverse effectue une lecture à partir de la pile et incrémente le pointeur de pile.
Ceci est quelque peu historique dans le sens où pour les machines avec une mémoire limitée, la pile était placée haut et grossie vers le bas, alors que le tas était bas et développé vers le haut. Il n'y a qu'un seul espace de "mémoire libre" - entre le tas et la pile, et cet espace est partagé, l'un ou l'autre peut croître dans l'espace selon les besoins individuels. Ainsi, le programme ne manque de mémoire que lorsque la pile et le tas se rencontrent sans laisser de mémoire libre.
Si la pile et le tas grandissent tous deux dans la même direction, il y a deux lacunes et la pile ne peut pas vraiment se transformer dans l'espace du tas (l'inverse est également problématique).
À l'origine, les processeurs n'avaient pas d'instructions de traitement de pile dédiées. Cependant, avec l’ajout de la pile au matériel, le modèle évoluait à la baisse et les processeurs suivent encore ce modèle.
On pourrait faire valoir que sur un ordinateur 64 bits, il y a suffisamment d'espace d'adressage pour permettre plusieurs espaces vides - et, à preuve, de multiples espaces vides sont nécessairement le cas lorsqu'un processus comporte plusieurs threads. Bien que cela ne soit pas une motivation suffisante pour changer les choses, étant donné que, avec les systèmes à fractures multiples, la direction de la croissance est sans doute arbitraire. C'est pourquoi tradition / compatibilité fait pencher la balance en avant.
Il faudrait modifier les instructions de manipulation de la pile CPU afin de changer la direction de la pile, ou bien renoncer à l' utilisation des instructions pousser et popping dédiés (par exemple push
, pop
, call
, ret
, autres).
Notez que l’architecture du jeu d’instructions MIPS n’est pas dédiée push
& pop
, il est donc pratique de faire croître la pile dans un sens ou dans l’autre - vous pouvez toujours souhaiter une disposition mémoire un espace pour un processus à un seul thread, mais vous pouvez augmenter la pile et le tas vers le bas. Cependant, si vous agissiez de la sorte , certains codes C varargs pourraient nécessiter un ajustement de la source ou du passage des paramètres sous le capot.
(En fait, étant donné qu’il n’existe pas de traitement de pile dédié sur MIPS, nous pourrions utiliser pré ou post incrémentation ou pré ou post décrémentation pour la mise en place de la pile tant que nous utilisons l’inverse exact pour le vidage de la pile et en supposant que Le système d’exploitation respecte le modèle d’utilisation de pile choisi. En effet, dans certains systèmes embarqués et certains systèmes éducatifs, la pile MIPS est agrandie.
-4(%rbp)
cela ne déplace pas le pointeur de base et que+4(%rbp)
cela ne pourrait pas fonctionner.