[gull] Subtilité de C n° 6 : Tableaux et pointeurs, presque pareils
Daniel Cordey
dc at mjt.ch
Tue Aug 5 12:27:48 CEST 2008
On Tuesday 05 August 2008 11:58:05 Marc Mongenet wrote:
> C'est possible pour les fonctions statiques. Mais pour les autres
> fonctions (visibles du linker) il me semble que la System V ABI
> (System V Application Binary Interface) pour Intel386 que suit Linux
> spécifie que tous les paramètres sont empilés, et seule la valeur de
> retour est passée par le registre %eax.
>
> Mais pour AMD64 je suppose que quelques registres sont utilisés
> pour passer les premiers paramètres.
C'est vrais que cela peut dependre des architectures !
Un certain nombre de CPUs ont ete concus dans l'optique de minimiser l'usage du
stack, d'autres pas. La tendance consistant a avoir beaucoup de registres a ete
popularisee par les premieres generations de processeurs RISCs (sauf les
premieres generations de SPARC qui avait un mechanisme particulier de
"windowing" pour N stacks). Les choses se sont encore complexifiees par
l'arrivee des architectures 64 bits. En effet, on peut souvent stocker 2 entiers
de 32 bits dans un registre 64 bits.
Bref, si passer des arguments en utilisant les registres du CPUs peut paraitre
interessant au niveau performance, cela rend les choses passablement complexe
quand il s'agit de determiner quel argument va dans quel registre. Ceci, compte
tenu du fait que l'on peut avoir des int 32, des int 64, des doubles, des
pointeurs... Cela implique de respecter des conventions, dont les regles sont
programmees dans les differentes options des compilateurs. Cela implique aussi
qu'un code compile pour un certain modele de CPU ne va certainement pas
fonctionner avec un code compile pour un autre modele. C'est d'ailleurs pour
cette raison que l'on a souvent (mais pas seulement) des codes compiles pour
d'assez anciennes architectures; la compatibilite ascendante etant en general
assuree.
Les architectures X86 etant assez peu "orientees" registres (comparees a
d'autres), il est comprehensible que cette maniere de faire soit peu repandue
sur ces architectures.
L'utilisation des registres pour le passage de parametres est aussi intimement
lie a certains niveau d'optimisation de compilation. Dans le cas de "profiling"
il est possible d'optimiser l'utilisation des registres pour le passage de
parametres, en combinaison avec l'utilisation et la frequence d'utilisation des
variables a l'interieur des blocks de code. La... ca devient assez complexe...
Tout depend donc des conventions liees a l'architecture cible et aux niveaux
d'optimisation de compilation.
dc
More information about the gull
mailing list