0

Je lisais quelques articles de base sur la manipulation de la mémoire par le processeur, et j'étais confus quant à la façon dont le processeur gère ce qui vient ensuite. Le concept de la pile d'appel est clair, mais je me demandais si la pile de pile/registre d'expression (utilisée pour faire les calculs) est la même pile, ou même si la pile pour les variables locales d'un sous-programme (un fonction) dans un programme est la même pile d'appels.Le processeur utilise-t-il plusieurs piles pour séparer la pile d'appels de la pile d'expression/de registre?

Si quelqu'un pouvait m'expliquer comment le processeur fonctionne en ce qui concerne ses piles, cela m'aiderait beaucoup.

+0

N'est-ce pas plus une décision à prendre par le compilateur (sous réserve des conventions d'appel du système d'exploitation et des bibliothèques)? Le processeur sera bien avec n'importe quel arrangement de mémoire, il court juste les instructions. Je suppose que vous pourriez écrire du code sans utiliser de pile du tout. – Thilo

+1

@Thilo: Il serait stupide de concevoir un ABI qui utiliserait une pile séparée pour l'espace de travail et le passage de paramètres si le processeur ne permettait pas de le faire efficacement. En x86, par exemple, il attacherait un autre registre (ne laissant que 6 des 8 registres comme «usage général» en mode 32 bits), et les petites instructions efficaces «push»/'pop' ne fonctionneraient qu'avec' rsp'. Enregistrer/restaurer des registres dans une pile "manuelle" nécessiterait donc plus d'octets de code (et plus d'instructions, puisque vous auriez à ajouter/ajouter manuellement à 'rbp' (le choix évident pour un deuxième pointeur de pile) –

+0

@PeterCordes: C'est probablement la réponse que Rafael recherchait: Un CPU devrait avoir plusieurs ensembles d'opérations/registres de pile pour supporter efficacement plusieurs piles (et x86 ne le fait pas) – Thilo

Répondre

2

Tous les processeurs sur lesquels j'ai travaillé ont juste utilisé une seule pile pour ceux-ci.

Si vous pensez à ce que fait le processeur, vous n'avez besoin que d'une seule pile. Pendant les calculs, vous pouvez utiliser la même pile que la pile appelante, car lorsque le calcul est terminé, la pile sera de nouveau "propre". Pareil pour les variables locales, juste avant de sortir de la portée des variables locales, votre pile sera propre, permettant à l'appel de retourner correctement.

1

Vous pouvez modifier la pile, il suffit de définir les segments SS: SP et les registres de pointeurs (il suffit de sauvegarder les valeurs actuelles) Les paramètres d'appel de procédure et les variables locales ont lieu dans la pile. Et les objets créés dynamiquement ont lieu dans le tas (DS: DI). La paire de registres SS: SP décalée de la bonne quantité d'octets pour réserver la mémoire nécessaire sur l'appel de procédure. Et au retour, le SS: SP revient à l'état de pré-appel.