Sophie

Sophie

distrib > Mandriva > 9.0 > i586 > by-pkgid > 0d5cd12c82d627a82c59047e1ba7b8a9 > files > 93

howto-html-fr-9.0-0.2mdk.noarch.rpm

<HTML>
<HEAD>
<TITLE>Conventions d'appel</TITLE>
</HEAD>
<BODY>
<H1>5. <A NAME="s5"></A>Conventions d'appel</H1>
<P>
<A HREF="Assembly-HOWTO.html#toc5">Contenu de cette section</A></P>

<P></P>
<P></P>
<P></P>
<H2>5.1 <A NAME="ss5.1"></A> Linux</H2>

<P></P>
<P></P>
<H3>Edition de liens avec GCC</H3>

<P></P>
<P>C'est la solution la plus pratique.
Consultez la documentation de gcc
et prenez exemple sur les sources du noyau Linux
(fichiers <CODE>.S</CODE> qui sont utilis&eacute;s avec gas, non pas as86).</P>
<P>Les arguments 32 bits sont empil&eacute;s dans la pile vers le bas dans
l'ordre inverse de l'ordre syntaxique
(c'est-&agrave;-dire qu'on acc&egrave;de aux arguments ou les d&eacute;pile
dans l'ordre syntaxique), au-dessus de l'adresse de retour 32 bits.
<CODE>%ebp</CODE>, <CODE>%esi</CODE>, <CODE>%edi</CODE>,
<CODE>%ebx</CODE> doivent &ecirc;tre conserv&eacute;s par l'appel&eacute;,
les autres registres peuvent &ecirc;tre d&eacute;truits;
<CODE>%eax</CODE> doit contenir le r&eacute;sultat,
ou <CODE>%edx:%eax</CODE> pour des r&eacute;sultats sur 64 bits.</P>
<P>Pile virgule flottante: je ne suis pas s&ucirc;r,
mais je pense que le r&eacute;sultat se trouve dans <CODE>st(0)</CODE>,
la pile &eacute;tant &agrave; la discr&eacute;tion de l'appel&eacute;.</P>
<P>Notez que GCC poss&egrave;de certaines options pour modifier les conventions
d'appel en r&eacute;servant certains registres, en mettant les arguments dans des
registres, en supposant que l'on ne poss&egrave;de pas de FPU, etc.
Consultez les pages .info concernant le i386.</P>
<P>Il faut prendre garde &agrave; d&eacute;clarer l'attribut <CODE>cdecl</CODE> pour une
fonction qui suit la convention standard GCC (je ne sais pas exactement 
ce que cela produit avec des conventions modifi&eacute;es). Consultez la 
documentation GCC dans la section: <CODE>C Extensions::Extended Asm::</CODE></P>
<P></P>
<P></P>
<H3>Probl&egrave;mes ELF et a.out</H3>

<P></P>
<P>Certains compilateurs C ajoutent un underscore avant tout symbole,
alors que d'autres ne le font pas.</P>
<P>En particulier, la version GCC a.out effectue ce genre d'ajouts, alors
que la version ELF ne le fait pas.</P>
<P>Si vous &ecirc;tes confront&eacute; &agrave; ce probl&egrave;me, regardez comment des paquetages 
existants traitent le probl&egrave;mes. Par exemple, r&eacute;cup&eacute;rer une ancienne
arborescence des sources de Linux, Elk, les
qthreads ou OCAML...</P>
<P>Vous pouvez &eacute;galement red&eacute;finir le renommage implicite de C en assembleur
en ajoutant les instructions suivantes:
<HR>
<PRE>
        void truc asm(&amp;quot;machin&amp;quot;) (void);
</PRE>
<HR>

pour s'assurer que la fonction C truc sera r&eacute;ellement appel&eacute;e 
machin en assembleur.</P>
<P>Remarquez que l'outil <CODE>objcopy</CODE>, du paquetage <CODE>binutils</CODE>,
devrait vous permettre de transformer vos fichiers objets a.out
en objets ELF et peut-&ecirc;tre inversement dans certains cas.
D'une mani&egrave;re plus g&eacute;n&eacute;rale, il vous permet d'effectuer 
de nombreuses conversions de formats de fichiers.</P>
<P></P>
<P></P>
<H3>Appels syst&egrave;mes directs</H3>

<P></P>
<P>Il n'est absolument pas recommand&eacute; d'effectuer de tels appels
par ce que leurs conventions peuvent changer de temps en temps,
ou d'un type de noyau &agrave; un autre (cf L4Linux),
de plus, ce n'est pas portable, difficile &agrave; &eacute;crire,
redondant avec l'effort entrepris par libc,
et enfin, cela emp&ecirc;che les corrections et les extensions effectu&eacute;es
&agrave; travers la libc, comme par exemple avec le programme <CODE>zlibc</CODE>
qui r&eacute;alise une d&eacute;compression &agrave; la vol&eacute;e de fichiers compress&eacute;s avec gzip.
La mani&egrave;re standard et recommend&eacute;e d'effectuer des appels syst&egrave;mes
est et restera de passer par la libc.</P>
<P>Les objets partag&eacute;s devraient r&eacute;duire l'occupation m&eacute;moire des programmes,
et si vous souhaitez absolument avoir de petits ex&eacute;cutables, utilisez
<CODE>#!</CODE> avec un interpr&eacute;teur qui contiendra tout ce que 
vous ne voulez pas mettre dans vos binaires.</P>
<P>Maintenant, si pour certaines raisons, vous ne souhaitez pas effectuer
une &eacute;dition des liens avec la libc, r&eacute;cup&eacute;rez-la et essayez de comprendre
comment elle fonctionne! Apr&egrave;s tout, vous pr&eacute;tendez bien la remplacer
non? </P>
<P>Vous pouvez aussi regarder comment 
<A HREF="ftp://ftp.forth.org/pub/Forth/Linux/linux-eforth-1.0c.tgz">eforth 1.0c</A>
 le fait.</P>
<P>Les sources de Linux sont fort utiles, en particulier le fichier
d'en-t&ecirc;te asm/unistd.h qui d&eacute;crit comment sont effectu&eacute;s les appels 
syst&egrave;me...</P>
<P>Le principe g&eacute;n&eacute;ral est d'utiliser l'instruction
<CODE>int $0x80</CODE> avec le num&eacute;ro de l'appel syst&egrave;me
<CODE>__NR_</CODE>machin (regarder dans <CODE>asm/unistd.h</CODE>)
dans <CODE>%eax</CODE>,
et les param&egrave;tres (jusqu'&agrave; cinq) dans
<CODE>%ebx</CODE>, <CODE>%ecx</CODE>, <CODE>%edx</CODE>,
<CODE>%esi</CODE>, <CODE>%edi</CODE>. Le r&eacute;sultat est renvoy&eacute; dans 
<CODE>%eax</CODE> avec un r&eacute;sultat n&eacute;gatif &eacute;tant l'erreur
dont l'oppos&eacute; est tranf&eacute;r&eacute; par la libc dans errno. La pile utilisateur
n'est pas modific&eacute;e donc n'avez pas besoin d'en avoir une correcte
lors de l'appel.</P>
<P></P>
<P></P>
<H3>Entr&eacute;es/sorties sous Linux</H3>

<P></P>
<P>Si vous souhaitez effectuer des entr&eacute;es/sorties directement sous Linux,
soit il s'agit de quelque chose de tr&egrave;s simple qui n'a pas besoin
de sp&eacute;cificit&eacute;s du syst&egrave;me et dans ce cas l&agrave;, consultez le mini-HOWTO
<CODE>IO-Port-Programming</CODE>, ou alors vous devez cr&eacute;er un nouveau gestionnaire
de p&eacute;riph&eacute;rique et vous devriez alors lire quelques documents
sur les m&eacute;andres du noyau, le d&eacute;veloppement de gestionnaires de
p&eacute;riph&eacute;riques, les modules du noyau, etc. Vous trouverez d'excellents
HOWTO ou autres documents du projet LDP.</P>
<P>Plus particuli&egrave;rement, si vous souhaitez r&eacute;aliser des programmes
graphiques, rejoignez le projet GGI:
<A HREF="http://synergy.caltech.edu/~ggi/">http://synergy.caltech.edu/~ggi/</A>

<A HREF="http://sunserver1.rz.uni-duesseldorf.de/~becka/doc/scrdrv.html">http://sunserver1.rz.uni-duesseldorf.de/~becka/doc/scrdrv.html</A>
</P>
<P>Dans tous les cas, vous devriez plut&ocirc;t utiliser l'assembleur en ligne de GCC
avec les macros provenant des fichiers linux/asm/*.h que d'&eacute;crire des 
sources en assembleur pur.</P>
<P></P>
<P></P>
<H3>Acc&eacute;der aux gestionnaires 16 bits avec Linux/i386</H3>

<P></P>
<P>De telles choses sont th&eacute;oriquement possibles (preuve: voir
comment DOSEMU permet &agrave; des programmes d'acc&eacute;der au port s&eacute;rie), et j'ai
entendu des rumeurs que certaines personnes le font (avec le gestionnaire
PCI? Acc&egrave;s aux cartes VESA? PnP ISA? Je ne sais pas). Si vous avez de
plus amples pr&eacute;cisions &agrave; ce sujet, soyez les bienvenus.
Le bon endroit &agrave; regarder est les sources du noyau, les sources de
DOSEMU (et des autres programmes se trouvant dans
<A HREF="ftp://tsx-11.mit.edu/pub/linux/ALPHA/dosemu/">le r&eacute;pertoire DOSEMU</A>
), ainsi que les sources d'autres
programmes bas niveaux (peut-&ecirc;tre GGI s'il g&egrave;re les cartes VESA).</P>
<P>En fait, vous devez utiliser soit le mode prot&eacute;g&eacute; 16 bits, soit le 
mode vm86.</P>
<P>Le premier est plus simple &agrave; configurer mais il ne fonctionne
qu'avec du code ayant un comportement propre qui n'effectue pas
d'arithm&eacute;tique de segments ou d'adressage absolu de segment (en particulier
pour l'adressage du segment 0), &agrave; moins que par chance tous les 
segments utilis&eacute;s peuvent &ecirc;tre configur&eacute; &agrave; l'avance dans le LDT.</P>
<P>La seconde possiblit&eacute; permet d'&ecirc;tre plus "compatibles" avec
les environnements 16 bits mais il n&eacute;cessite une gestion bien plus
compliqu&eacute;e.</P>
<P>Dans les deux cas, avant de sauter sur le code 16 bits, vous devez:
<UL>
<LI>mmapper toute adresse absolue utilis&eacute;e dans le code 16 bits
(comme la ROM, les tampons vid&eacute;o, les adresses DMA et les entr&eacute;es/sorties
passant des zones de m&eacute;moires mapp&eacute;es) 
&agrave; partir de /dev/mem dans votre espace d'adressage de votre
processus.</LI>
<LI>configurer le LDT et/ou le moniteur en mode vm86.</LI>
<LI>demander au noyau les droits d'acc&egrave;s n&eacute;cessaires
pour les entr&eacute;es/sorties (voir plus haut).</LI>
</UL>
</P>
<P>Encore une fois, lisez attentivement les codes sources 
situ&eacute;s dans le r&eacute;pertoire de DOSEMU et consorts,
en particulier ces mini-&eacute;mulateurs permettant de faire tourner
des programmes ELKS et/ou des .COM assez simples sous Linux/i386.</P>
<P></P>
<P></P>
<P></P>

<H2>5.2 <A NAME="ss5.2"></A> DOS</H2>

<P></P>
<P>La plupart des &eacute;mulateurs DOS sont livr&eacute;s avec certaines interfaces
d'acc&egrave;s aux services DOS. Lisez leur documentation &agrave; ce sujet, mais bien
souvent, ils ne font que simuler <CODE>int $0x21</CODE> et
ainsi de suite, donc c'est comme si vous &eacute;tiez en mode r&eacute;el
(je doute qu'ils aient de possibilit&eacute;s de fonctionner avec des
op&eacute;randes 32 bits: ils ne font que r&eacute;fl&eacute;chir l'interruption dans
le mode r&eacute;el ou dans le gestionnaire vm86).</P>
<P>Certaines documentations concernant DPMI (ou ses variantes
peuvent) &ecirc;tre trouv&eacute;es sur 
<A HREF="ftp://x2ftp.oulu.fi/pub/msdos/programming/">ftp://x2ftp.oulu.fi/pub/msdos/programming/</A>
</P>
<P>DJGPP est livr&eacute; avec son propre sous-ensemble, d&eacute;riv&eacute;, ou remplacement
(limit&eacute;) de la glibc.</P>
<P>Il est possible d'effectuer une compilation crois&eacute;e de Linux vers DOS.
Consultez le r&eacute;pertoire devel/msdos/ de votre miroir
FTP de sunsite.unc.edu. Voir &eacute;galement le dos-extender MOSS
du projet Flux d'utah.</P>
<P>D'autres documentations et FAQ sont plus consacr&eacute;s &agrave; DOS.
Nous d&eacute;conseillons le d&eacute;veloppement sous DOS.</P>
<P></P>
<P></P>

<H2>5.3 <A NAME="ss5.3"></A> Windauberies...</H2>

<P></P>
<P>Heu, ce document ne traite que de libre logiciel.
T&eacute;l&eacute;phonez-moi lorsque Windaube le deviendra ou du moins ses
outils de d&eacute;veloppement!</P>
<P>En fait, apr&egrave;s tout, cela existe:
<A HREF="http://www.cygnus.com">Cygnus Solutions</A>

a d&eacute;velopp&eacute; la biblioth&egrave;que cygwin32.dll
pour que les programmes GNU puissent
fonctionner sur les machines MicroMerdiques.
Donc, vous pouvez utiliser GCC, GAS et tous les outils GNU ainsi que bon
nombre d'applications Unix. Consultez leur site Web.
Je (Far&eacute;) ne souhaite pas m'&eacute;tendre sur la programmation sous Windaube,
mais je suis s&ucirc;r que vous trouverez tout un tas d'informations partout...</P>
<P></P>
<P></P>

<H2>5.4 <A NAME="ss5.4"></A> Votre propre syst&egrave;me d'exploitation</H2>

<P></P>
<P>Le contr&ocirc;le sur le syst&egrave;me &eacute;tant ce qui attire de nombreux programmeurs
vers l'assembleur, une pr&eacute;misse ou un corollaire naturel de son utilisation
est la volont&eacute; de d&eacute;velopper son propre syst&egrave;me d'exploitation.
Remarquons tout d'abord que tout syst&egrave;me permettant son auto-d&eacute;veloppement
pourrait &ecirc;tre qualifi&eacute; de syst&egrave;me d'exploitation, combien m&ecirc;me tournerait-il
au-dessus d'un autre syst&egrave;me sur lequel il se d&eacute;chargerait de
la gestion du multit&acirc;che (Linux sur Mach) ou des entr&eacute;es/sorties
(OpenGenera sur Digital Unix), etc.
Donc, pour simplifier le d&eacute;bogage, vous pouvez souhaiter d&eacute;velopper
votre syst&egrave;me d'exploitation comme &eacute;tant un processus fonctionnant
sous Linux (au prix d'un certain ralentissement), puis, utiliser le 
<A HREF="http://ww.cs.utah.edu/projects/flux/">Flux OS kit</A>

(qui permet l'utilisation des drivers Linux et BSD dans
votre propre syst&egrave;me d'exploitation) pour le rendre ind&eacute;pendant.
Lorsque votre syst&egrave;me est stable, il est toujours temps d'&eacute;crire
vos propres gestionnaires de mat&eacute;riels si c'est vraiment votre passion.</P>
<P>Ce HowTo ne couvrira pas des sujets comme le code de chargement du syst&egrave;me,
le passage en mode 32 bits, la gestion des interruptions,
les bases concernant les horreurs des processeurs Intel
(mode prot&eacute;g&eacute;, V86/R86), la d&eacute;finition de votre format d'objets
ou de vos conventions d'appel.
L'endroit o&ugrave; vous pourrez trouver le plus d'informations
concernant tous ces sujets est le code source de syst&egrave;me d&eacute;j&agrave; 
existants.</P>
<P>Un grand nombre de pointeurs se trouvent dans la page:
<A HREF="http://www.eleves.ens.fr:8080/home/rideau/Tunes/Review/OSes.html">http://www.eleves.ens.fr:8080/home/rideau/Tunes/Review/OSes.html</A>
</P>
<P></P>
<P></P>

<HR>
<P>
Chapitre <A HREF="Assembly-HOWTO-6.html">suivant</A>,
Chapitre <A HREF="Assembly-HOWTO-4.html">Pr&eacute;c&eacute;dent</A>
<P>
Table des mati&egrave;res de <A HREF="Assembly-HOWTO.html#toc5">ce chapitre</A>,
 <A HREF="Assembly-HOWTO.html#toc">Table des mati&egrave;res</A> g&eacute;n&eacute;rale</P>
<P>
<A HREF="Assembly-HOWTO.html">D&eacute;but</A> du document,
 <A HREF="#0"> D&eacute;but de ce chapitre</A></P>
</BODY>
</HTML>