[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