J'essaie de comprendre le fonctionnement du registre de liens et du pointeur de cadre dans ARM. Je suis allé sur quelques sites et je voulais confirmer ma compréhension.
Supposons que j'ai le code suivant:
int foo(void)
{
// ..
bar();
// (A)
// ..
}
int bar(void)
{
// (B)
int b1;
// ..
// (C)
baz();
// (D)
}
int baz(void)
{
// (E)
int a;
int b;
// (F)
}
et j'appelle foo (). Le registre de liens contient-il l'adresse du code au point (A) et le pointeur de cadre contient-il l'adresse au code au point (B)? Et le pointeur de pile pourrait être n'importe où dans bar (), après que tous les locaux aient été déclarés?
[edit] Ajout d'un autre appel de fonction baz ()
Disclaimer: Je pense que c'est à peu près juste; veuillez corriger au besoin.
Comme indiqué ailleurs dans le présent Q & R, sachez que le compilateur n'est peut-être pas obligé de générer du code (ABI) utilisant des pointeurs de cadre. Les cadres de la pile d'appels peuvent souvent nécessiter des informations inutiles.
Si les options du compilateur appellent "no frames" (un indicateur de pseudo-option), le compilateur peut générer un code plus petit qui réduit les données de la pile d'appels. La fonction d'appel est compilée pour ne stocker que les informations d'appel nécessaires sur la pile et la fonction appelée est compilée pour extraire uniquement les informations d'appel nécessaires de la pile.
Cela économise du temps d'exécution et de la pile, mais rend extrêmement difficile le suivi du code d'appel (j'ai renoncé à ...).
Les informations sur la taille et la forme des informations d’appel sur la pile sont uniquement connues du compilateur et ces informations ont été supprimées après la compilation.