J'ai essayé de mieux comprendre comment les compilateurs génèrent du code machine, et plus précisément comment GCC gère la pile. Ce faisant, j'ai écrit des programmes C simples, les compilant en assemblée et faisant de mon mieux pour comprendre le résultat. Voici un programme simple et la sortie qu'il génère:Allocation de pile, remplissage et alignement
asmtest.c
:
void main() {
char buffer[5];
}
asmtest.s
:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
leave
ret
Ce qui est déconcertant pour moi est la raison pour laquelle 24 octets sont alloués pour la pile. Je sais qu'en raison de la façon dont le processeur adresse la mémoire, la pile doit être allouée par incréments de 4, mais si c'était le cas, nous devrions seulement déplacer le pointeur de pile de 8 octets, pas 24. Pour mémoire, un tampon de 17 octets produit un pointeur de pile déplacé 40 octets et aucun tampon du tout déplace le pointeur de pile 8. Un tampon entre 1 et 16 octets inclus déplace ESP
24 octets. Maintenant que nous supposons que les 8 octets sont une constante nécessaire (que faut-il pour?), Cela signifie que nous allouons en morceaux de 16 octets. Pourquoi le compilateur s'alignerait-il de cette manière? J'utilise un processeur x86_64, mais même un mot 64 bits ne devrait nécessiter qu'un alignement de 8 octets. Pourquoi la divergence?
Pour référence, je compile ceci sur un Mac fonctionnant sous 10.5 avec gcc 4.0.1 et aucune optimisation activée.
fait "push% ebp" fait esp diminué de 8 octets? plus 8 octets de ret, il devrait déjà être aligné avec 16 octets. Pourquoi le compilateur de dose a besoin de 8 octets supplémentaires? –
oh, j'ai compris. C'est un machince 32 bits. Pardon.Il doit être rét 4 octets + ebp 4 octets + alignés 8 octets + tampon 16 –
Les versions actuelles des ABI System V i386 et x86-64 nécessitent un alignement de pile 16B (avant une instruction 'call'), donc les fonctions sont supposées assumer cette. Historiquement, l'i386 ABI ne nécessitait qu'un alignement 4B. (Voir https://stackoverflow.com/tags/x86/info pour les liens vers les documents ABI). GCC maintient également '% esp' aligné même dans les fonctions de feuille (qui n'appellent pas d'autres fonctions), quand il doit réserver de l'espace, et c'est ce qui se passe ici. –