Lors d'un appel de fonction sous Linux (ou OS X d'ailleurs), l'appelé peut-il modifier les valeurs des arguments de la pile? J'étais sous l'hypothèse que puisque l'appelant est celui qui les nettoie, qu'ils devraient contenir les mêmes valeurs après l'appel de la fonction. Cependant, j'ai trouvé que GCC avec -O2 modifiait les paramètres qui lui étaient passés sur la pile. J'ai également cherché de la documentation, y compris les conventions d'appel System V i386, mais n'a pas pu trouver une réponse définitive à cela.C conventions d'appel et arguments passés
Voici un exemple de code que j'ai débogué.
pushl %eax # %eax = 0x28
call _print_any
popl %eax
# %eax is now 0x0a
Je suppose que GCC modifier ce paramètre sur la pile est très bien, mais je veux savoir où il est précisé qu'il peut faire.
"modifier" de quelle façon? Vous vous rendez compte que si vous ne dites pas au compilateur de ne pas le faire, il n'y a aucune raison de s'attendre à ce qu'il ne muck pas avec les valeurs sur la pile afin de compléter ses optimisations? –
Le comportement du code C et le fonctionnement des conventions d'appel peuvent être très différents. Voici les conventions d'appel du System V C pour i386 si vous êtes curieux. Il a tendance à être quelque peu vague sur certaines choses, cependant ... http://www.sco.com/developers/devspecs/abi386-4.pdf –