Sophie

Sophie

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

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

<HTML>
<HEAD>
<TITLE>Assembleurs</TITLE>
</HEAD>
<BODY>
<H1>3. <A NAME="s3"></A>Assembleurs</H1>
<P>
<A HREF="Assembly-HOWTO.html#toc3">Contenu de cette section</A></P>

<P></P>
<P></P>
<H2>3.1 <A NAME="ss3.1"></A> Assembleur en-ligne de GCC</H2>

<P></P>
<P>Le c&eacute;l&egrave;bre GNU C/C++ Compiler (GCC),
est un compilateur 32 bits optimisant situ&eacute; au coeur du projet GNU.
Il g&egrave;re assez bien les architectures x86
et permet d'ins&eacute;rer du code assembleur
&agrave; l'int&eacute;rieur de programmes C de telle mani&egrave;re que les registres
puissent &ecirc;tre soit sp&eacute;cifi&eacute;s soit laiss&eacute; aux bons soins de GCC.
GCC fonctionne sur la plupart des plates-formes dont Linux, *BSD,
VSTa, OS/2, *DOS, Win*, etc.</P>
<P></P>
<H3>O&ugrave; trouver GCC</H3>

<P></P>
<P>Le site principal de GCC est le site FTP du projet GNU:
<A HREF="ftp://prep.ai.mit.edu/pub/gnu/">ftp://prep.ai.mit.edu/pub/gnu/</A>

On y trouve &eacute;galement toutes les applications provenant du projet GNU.
Des versions configur&eacute;es ou pr&eacute;compil&eacute;es pour Linux sont disponibles sur
<A HREF="ftp://sunsite.unc.edu/pub/Linux/GCC/">ftp://sunsite.unc.edu/pub/Linux/GCC/</A>
.
Il existe un grand nombre de miroirs FTP des deux sites
partout de par le monde, aussi bien que des copies sur CD-ROM.</P>
<P>Le groupe de d&eacute;veloppement de GCC s'est r&eacute;cemment scind&eacute; en deux;
pour plus d'informations sur la version exp&eacute;rimentale, egcs, voir
<A HREF="http://www.cygnus.com/egcs/">http://www.cygnus.com/egcs/</A>
</P>
<P>Les sources adapt&eacute;s &agrave; votre syst&egrave;me d'exploitation pr&eacute;f&eacute;r&eacute;
ainsi que les binaires pr&eacute;compil&eacute;s peuvent &ecirc;tre trouv&eacute;s sur les
sites FTP courants.</P>
<P>Le portage le plus c&eacute;l&egrave;bre de GCC pour DOS est DJGPP et il peut
&ecirc;tre trouv&eacute; dans le r&eacute;pertoire du m&ecirc;me nom sur les sites ftp.
Voir:</P>
<P>
<A HREF="http://www.delorie.com/djgpp/">http://www.delorie.com/djgpp/</A>
</P>
<P>Il existe &eacute;galement un portage de GCC pour OS/2 appel&eacute; EMX qui fonctionne
&eacute;galement sous DOS et inclut un grand nombre de routines d'&eacute;mulation Unix.
Voir les sites</P>
<P>
<A HREF="http://www.leo.org/pub/comp/os/os2/gnu/emx+gcc/">http://www.leo.org/pub/comp/os/os2/gnu/emx+gcc/</A>
</P>
<P>
<A HREF="http://warp.eecs.berkeley.edu/os2/software/shareware/emx.html">http://warp.eecs.berkeley.edu/os2/software/shareware/emx.html</A>
</P>
<P>
<A HREF="ftp://ftp-os2.cdrom.com/pub/os2/emx09c/">ftp://ftp-os2.cdrom.com/pub/os2/emx09c/</A>
</P>
<P></P>
<P></P>
<H3>O&ugrave; trouver de la documentation sur l'assembleur en ligne avec GCC?</H3>

<P>La document de GCC inclus les fichiers de documentation au format texinfo.
Vous pouvez les compiler avec TeX et les imprimer,
ou les convertir au format .info et les parcourir interactivement avec emacs,
ou encore les convertir au format HTML,
ou en &agrave; peu pr&egrave;s n'importe quel format (avec les outils ad&eacute;quats).
Les fichiers .info sont g&eacute;n&eacute;ralement install&eacute;s en m&ecirc;me temps que GCC.</P>
<P>La section &agrave; consulter est
<CODE>C Extensions::Extended Asm::</CODE></P>
<P>La section
<CODE>Invoking GCC::Submodel Options::i386 Options::</CODE>
peut &eacute;galement vous aider.
En particulier, elle donne les noms de contraintes
pour les registres du i386:
abcdSDB correspondent respectivement &agrave;
<CODE>%eax</CODE>, <CODE>%ebx</CODE>, <CODE>%ecx</CODE>, <CODE>%edx</CODE>,
<CODE>%esi</CODE>, <CODE>%edi</CODE>, <CODE>%ebp</CODE>
(aucune lettre pour <CODE>%esp</CODE>).</P>
<P>Le site "DJGPP Games resource"
(qui n'est pas r&eacute;serv&eacute; aux seuls d&eacute;veloppeurs de jeux)
poss&egrave;de une page particuli&egrave;re sur l'assembleur:</P>
<P>
<A HREF="http://www.rt66.com/~brennan/djgpp/djgpp_asm.html">http://www.rt66.com/~brennan/djgpp/djgpp_asm.html</A>
</P>
<P>Enfin, il existe une page de la Toile appel&eacute;e
"DJGPP Quick ASM Programming Guide",
contenant des URL sur des FAQ, la syntaxe assembleur AT&amp;T x86,
des informations sur l'assembleur en ligne,
et la conversion des fichiers .obj/.lib:</P>
<P>
<A HREF="http://remus.rutgers.edu/~avly/djasm.html">http://remus.rutgers.edu/~avly/djasm.html</A>
</P>
<P>GCC soutraite l'assemblage proprement dit &agrave; GAS et suit donc sa syntaxe
(voir plus bas), cela implique que l'assembleur en ligne doit utiliser
des caract&egrave;res pourcents entre apostrophes pour qu'ils soient pass&eacute;s
&agrave; GAS. Voir la section d&eacute;di&eacute;e &agrave; GAS.</P>
<P>Vous trouverez un <EM>grand</EM> nombre d'exemples instructifs
dans le r&eacute;pertoire <CODE>linux/include/asm-i386/</CODE> des sources de Linux.</P>
<P></P>
<P></P>
<H3>Appeller GCC pour obtenir du code assembleur en ligne correcte?</H3>

<P></P>
<P>Assurez-vous d'appeller gcc avec l'option <CODE>-O</CODE> (ou <CODE>-O2</CODE>,
<CODE>-O3</CODE>, etc) pour activer les optimisations et l'assembleur en ligne.
Si vous ne le fa&icirc;tes pas, votre code pourra compiler mais ne pas s'ex&eacute;cuter
correctement!!
En fait (merci &agrave; Tim Potter, timbo@moshpit.air.net.au),
il suffit d'utiliser l'option <CODE>-fasm</CODE>,
faisant partie de toutes les fonctionnalit&eacute;s activ&eacute;es par l'option <CODE>-O</CODE>.
Donc si vous avez des probl&egrave;mes
en raison d'optimisations bogu&eacute;es dans votre impl&eacute;mentation de gcc,
vous pouvez toujours utiliser l'assembleur en ligne.
De m&ecirc;me, utilisez l'option <CODE>-fno-asm</CODE> pour d&eacute;sactiver
l'assembleur en ligne (on peut se demander pourquoi?).</P>
<P>Plus g&eacute;n&eacute;ralement, les bonnes options de compilation &agrave; utiliser avec
gcc sur les plates-formes x86 sont
<HR>
<PRE>
        gcc -O2 -fomit-frame-pointer -m386 -Wall
</PRE>
<HR>
</P>
<P><CODE>-O2</CODE> est le bon niveau d'optimisation. Les optimisations
sup&eacute;rieures g&eacute;n&egrave;rent un code un peu plus important, mais tr&egrave;s l&eacute;g&egrave;rement
plus rapide. De telles sur-optimisations peuvent &ecirc;tre utiles que dans le cas
d'optimisations de boucles que vous pouvez toujours r&eacute;aliser en assembleur.
Si vous avez besoin de faire ce genre de choses, ne le fa&icirc;tes que pour les
routines qui en ont besoin.</P>
<P><CODE>-fomit-frame-pointer</CODE> permet au code g&eacute;n&eacute;r&eacute; de se passer de la
gestion inutile des pointeurs de fen&ecirc;tre, ce qui rend le code plus petit
plus rapide et lib&egrave;re un registre pour de plus amples optimisations.
Cette option exclue l'utilisation des outils de d&eacute;boggage (<CODE>gdb</CODE>),
mais lorsque vous les utilisez, la taille et la vitesse importent peu.</P>
<P><CODE>-m386</CODE> g&eacute;n&egrave;re un code plus compacte sans ralentissement notable,
(moins de code signifie &eacute;galement mois d'entr&eacute;es/sorties sur disque et donc
une ex&eacute;cution plus rapide). Vous pouvez &eacute;galement utiliser
l'option -mpentium sur la version GCC g&eacute;rant l'optimisation pour ce
processeur.</P>
<P><CODE>-Wall</CODE> active toutes les mises-en-garde (warning)
et vous &eacute;vite de nombreuses erreurs stupides et &eacute;videntes.</P>
<P>Pour optimiser encore plus, vous pouvez utiliser l'option
<CODE>-mregparm=2</CODE> et/ou les attributs de fonctions qui peuvent
&ecirc;tre utilis&eacute;s mais ils peuvent dans certains cas poser de nombreux
probl&egrave;mes lors de l'&eacute;dition de liens avec du code externe
(notamment les biblioth&egrave;ques partag&eacute;es)...</P>
<P>Notez que vous pouvez ajoutez ces options aux options utilis&eacute;es par d&eacute;faut
sur votre syst&egrave;me en &eacute;ditant le fichier
<CODE>/usr/lib/gcc-lib/i486-linux/2.7.2.3/specs</CODE>
(cependant, ne rajoutez pas <CODE>-Wall</CODE> &agrave; ces options).</P>
<P></P>
<P></P>

<H2>3.2 <A NAME="ss3.2"></A> GAS</H2>

<P>GAS est l'assembleur GNU, utilis&eacute; par gcc.</P>
<P></P>
<P></P>
<H3>O&ugrave; le trouver?</H3>

<P>Au m&ecirc;me endroit o&ugrave; vous avez trouv&eacute; gcc, dans le paquetage binutils.</P>
<P></P>
<P></P>
<H3>Qu'est-ce que la syntaxe AT&amp;T</H3>

<P></P>
<P>Comme GAS a &eacute;t&eacute; invent&eacute; pour supporter un compilateur 32 bits sous unix,
il utilise la syntaxe standard "AT&amp;T",
qui ressemblent assez &agrave; l'assembleur m68k.
La syntaxe n'est ni pire, ni meilleur que la syntaxe "Intel".
Elle est juste diff&eacute;rente.
Lorsque vous aurez l'habitude de vous en servir,
vous la trouverez plus r&eacute;guli&egrave;re que la syntaxe Intel,
quoique que l&eacute;g&egrave;rement plus ennuyeuse aussi.</P>
<P>Voici les points les plus importants &agrave; propos de la syntaxe de GAS:
<UL>
<LI>Les noms de registres sont pr&eacute;fix&eacute;s avec <CODE>%</CODE>, de fa&ccedil;on que
les registres sont <CODE>%eax</CODE>, <CODE>%dl</CODE> et consorts
au lieu de juste <CODE>eax</CODE>, <CODE>dl</CODE>, etc.
Ceci rend possible l'inclusion directe de noms de symboles externes C
sans risque de confusion, ou de n&eacute;cessit&eacute; de pr&eacute;fixes _.</LI>
<LI>L'ordre des op&eacute;randes est source(s) d'abord, destination en dernier,
&agrave; l'oppos&eacute; de la convention d'intel consistant &agrave; mettre la destination
en premier, les source(s) ensuite.
Ainsi, ce qui en syntaxe intel s'&eacute;crit <CODE>mov ax,dx</CODE> (affecter au
registre <CODE>ax</CODE> le contentu du registre <CODE>dx</CODE>) s'&eacute;crira en syntaxe att
<CODE>mov %dx, %ax</CODE>.</LI>
<LI>La longueur des op&eacute;randes est sp&eacute;cifi&eacute;e comme suffixe du nom d'instruction.
Le suffixe est <CODE>b</CODE> pour un octet (8 bit), <CODE>w</CODE> pour un mot (16 bit),
et <CODE>l</CODE> pour un mot long (32 bit). Par exemple, la syntaxe correcte
pour l'instruction ci-dessus aurait d&ucirc; &ecirc;tre <CODE>movw %dx,%ax</CODE>.
Toutefois, gas n'est pas trop aussi strict que la syntaxe att l'exige,
et le suffixe est optionel quand la longueur peut &ecirc;tre devin&eacute;e
gr&acirc;ce aux op&eacute;randes qui sont des registres, la taille par d&eacute;faut &eacute;tant
32 bit (avec une mise en garde quand on y fait appel).</LI>
<LI>Les op&eacute;randes immediates sont marqu&eacute;s d'un pr&eacute;fixe <CODE>$</CODE>,
comme dans <CODE>addl $5,%eax</CODE>
(ajouter la valeur longue imm&eacute;diate 5 au registre <CODE>%eax</CODE>).</LI>
<LI>L'absence de pr&eacute;fixe &agrave; une op&eacute;rande indique une adresse m&eacute;moire;
ainsi <CODE>movl $foo,%eax</CODE> met l'<EM>adresse</EM>
de la variable <CODE>foo</CODE> dans le registre <CODE>%eax</CODE>,
tandis que <CODE>movl foo,%eax</CODE> met le <CODE>contenu</CODE> de la variable
<CODE>foo</CODE> dans le registre <CODE>%eax</CODE>.</LI>
<LI>L'indexation ou l'indirection se fait en mettant entre parenth&egrave;ses
le registre d'index ou la case m&eacute;moire contenant l'indirection,
comme dans <CODE>testb $0x80,17(%ebp)</CODE>
(tester le bit de poids fort de l'octet au d&eacute;placement 17 apr&egrave;s
la case point&eacute;e par <CODE>%ebp</CODE>).</LI>
</UL>
</P>
<P>Un programme existe pour vous aider &agrave; convertir des programmes 
&eacute;crits avec la syntaxe TASM en syntaxe AT&amp;T. Voir</P>
<P>
<A HREF="ftp://x2ftp.oulu.fi/pub/msdos/programming/convert/ta2asv08.zip">ftp://x2ftp.oulu.fi/pub/msdos/programming/convert/ta2asv08.zip</A>
</P>
<P></P>
<P>GAS poss&egrave;de une documentation compl&egrave;te au format TeXinfo,
qui est distribu&eacute;e entre autre avec les sources.
Vous pouvez parcourir les pages .info qui en sont extraites avec Emacs.
Il y avait aussi un fichier nomm&eacute; gas.doc ou as.doc
disponible autour des sources de GAS, mais il a &eacute;t&eacute; fusionn&eacute; avec
la documentation TeXinfo.
Bien s&ucirc;r, en cas de doute, l'ultime documentation
est constitu&eacute;e par les sources eux-m&ecirc;mes!
Une section qui vous int&eacute;ressera particuli&egrave;rement est
<CODE>Machine Dependencies::i386-Dependent::</CODE></P>
<P></P>
<P></P>
<P>Les sources de Linux dont un bon exemple: regardez dans le r&eacute;pertoire
linux/arch/i386 les fichiers suivants:
<CODE>kernel/*.S, boot/compressed/*.S, mathemu/*.S</CODE></P>
<P>Si vous codez ce genre de chose, un paquetage de thread, etc
vous devriez regarder d'autres langages (OCaml, gforth, etc),
ou des paquetages sur les thread (QuickThreads, pthreads MIT, 
LinuxThreads, etc).</P>
<P>Enfin g&eacute;n&eacute;rer &agrave; partir d'un programme C du code assembleur peut 
vous montrer le genre d'instructions que vous voulez. Consultez la
section 
<A HREF="Assembly-HOWTO-2.html#doyouneedasm">Avez-vous besoin de l'assembleur?</A>

au d&eacute;but de ce document.</P>
<P></P>
<P></P>
<H3>mode 16 bits limit&eacute;</H3>

<P></P>
<P>GAS est un assembleur 32 bits,
con&ccedil;u pour assembler le code produit par un compilateur 32 bits.
Il ne reconna&icirc;t que d'une mani&egrave;re limit&eacute; le mode 16 bits du i386,
en ajoutant des pr&eacute;fixes 32 bits aux instructions;
vous &eacute;crivez donc en r&eacute;alit&eacute; du code 32 bits,
qui s'ex&eacute;cute en mode 16 bits sur un processeur 32 bits.
Dans les deux modes, il g&egrave;re les registres 16 bits,
mais pas l'adressage 16 bits.
Utilisez les instructions <CODE>.code16</CODE> et <CODE>.code32</CODE>
pour basculer d'un mode &agrave; l'autre.
Notez que l'instruction assembleur en ligne
<CODE>asm(&quot;.code16\n&quot;)</CODE>
autorisera gcc &agrave; g&eacute;n&eacute;rer du code 32 bits qui fonctionnera en mode r&eacute;&eacute;l!</P>
<P></P>
<P>Le code n&eacute;cessaire pour que GAS g&egrave;re le mode 16 bits aurait &eacute;t&eacute; ajout&eacute;
par Bryan Ford (&agrave; confirmer?). Toutefois, ce code n'est pr&eacute;sent dans
aucune distribution de GAS que j'ai essay&eacute;e (jusqu'&agrave; binutils-2.8.1.x) ...
plus d'informations &agrave; ce sujet seraient les bienvenues dans ce HowTo. </P>
<P>Une solution bon march&eacute; pour ins&eacute;rer quelques instructions 16-bit
non reconnues pas GAS consiste &agrave; d&eacute;finir des macros (voir plus bas)
qui produisent directement du code binaire (avec <CODE>.byte</CODE>),
et ce uniquement pour les rares instructions 16 bits dont vous avez besoin
(quasiment aucunes, si vous utilisez le <CODE>.code16</CODE> pr&eacute;c&eacute;dement d&eacute;crit,
et pouvez vous permettre de supposer que le code fonctionnera
sur un processeur 32 bits). Pour obtenir le syst&egrave;me de codage 
correct, vous pouvez vous inspirer des assembleurs 16 bits.</P>
<P></P>
<P></P>
<P></P>

<H2>3.3 <A NAME="ss3.3"></A> GASP</H2>

<P></P>
<P>GASP est un pr&eacute;processeur pour GAS.
Il ajoute des macros et une syntaxe plus souple &agrave; GAS.</P>
<P></P>
<P></P>
<H3>O&ugrave; trouver gasp?</H3>

<P></P>
<P>gasp est livr&eacute; avec gas dans le paquetage binutils GNU.</P>
<P></P>
<P></P>
<H3>Comment il fonctionne?</H3>

<P></P>
<P>Cela fonctionne comme un filtre, tout comme cpp et ses variantes.
Je ne connais pas les d&eacute;tails, mais il est livr&eacute; avec sa propre
documentation texinfo, donc consultez-la, imprimez-la, assimilez-la.
La combinaison GAS/GASP me semble &ecirc;tre un macro-assembleur standard.</P>
<P></P>
<P></P>
<P></P>

<H2>3.4 <A NAME="ss3.4"></A> NASM</H2>

<P></P>
<P>Du projet Netwide Assembler est issu encore un autre assembleur,
&eacute;crit en C, qui devrait &ecirc;tre assez modulaire
pour supporter toutes les syntaxes connues
et tous les formats objets existants.</P>
<P></P>
<P></P>
<H3>O&ugrave; trouver NASM?</H3>

<P></P>
<P>
<A HREF="http://www.cryogen.com/Nasm">http://www.cryogen.com/Nasm</A>
</P>
<P>Les versions binaires se trouvent sur votre miroir sunsite habituel dans
le r&eacute;pertoire <CODE>devel/lang/asm/</CODE>.
Il devrait &eacute;galement &ecirc;tre disponible sous forme
d'archive .rpm ou .deb parmi les contributions &agrave;
votre distribution pr&eacute;f&eacute;r&eacute;e RedHat ou Debian.</P>
<P></P>
<P></P>
<H3>Son r&ocirc;le</H3>

<P></P>
<P>Au moment de l'&eacute;criture de ce HOWTO, NASM en est &agrave; la version 0.96.</P>
<P>La syntaxe est &agrave; la Intel.
Une gestion de macros est int&eacute;gr&eacute;e.</P>
<P>Les formats objets reconnus sont
<CODE>bin</CODE>, <CODE>aout</CODE>, <CODE>coff</CODE>, <CODE>elf</CODE>, <CODE>as86</CODE>,
(DOS) <CODE>obj</CODE>, <CODE>win32</CODE>, et <CODE>rdf</CODE> (leur propre format).</P>
<P>NASM peut &ecirc;tre utilis&eacute;e comme assembleur pour le compilateur libre LCC.</P>
<P></P>
<P>Comme NASM &eacute;volue rapidement, ce HowTo peut ne pas &ecirc;tre &agrave; jour &agrave; son sujet.
A moins que vous n'utilisiez BCC comme compilateur 16 bit
(ce qui d&eacute;passe le cadre de ce document),
vous devriez utiliser NASM plut&ocirc;t que AS86 ou MASM,
car c'est un logiciel libre avec un excellent service apr&egrave;s-don,
qui tourne sur toutes plateformes logicielles et mat&eacute;rielles.</P>
<P>Note: NASM est &eacute;galement livr&eacute; avec un d&eacute;sassembleur, NDISASM.</P>
<P>Son analyseur "grammatical", &eacute;crit &agrave; la main,
le rend beaucoup plus rapide que GAS;
en contrepartie, il ne reconna&icirc;t qu'une architecture,
en comparaison de la pl&eacute;thore d'architectures reconnues par GAS.
Pour les plates-formes x86, NASM semble &ecirc;tre un choix judicieux.</P>
<P></P>
<P></P>
<P></P>

<H2>3.5 <A NAME="ss3.5"></A> AS86</H2>

<P></P>
<P></P>
<P>AS86 est un assembleur 80x86, &agrave; la fois 16 et 32 bits,
faisant partie du compilateur C de Bruce Evans (BCC).
Il poss&egrave;de une syntaxe &agrave; la Intel.</P>
<P></P>
<P></P>
<H3>Where to get AS86</H3>

<P></P>
<P>Une version compl&egrave;tement d&eacute;pass&eacute;e de AS86 est diffus&eacute;e par HJLu
juste pour compiler le noyau Linux,
dans un paquetage du nom de bin86 (actuellement version 0.4)
disponible dans le r&eacute;pertoire GCC des sites FTP Linux.
Je d&eacute;conseille son utilisation pour toute autre chose que compiler Linux.
Cette version ne reconna&icirc;t qu'un format de fichiers minix modifi&eacute;,
que ne reconnaissent ni les binutils GNU ni aucun autre produit.
Il poss&egrave;de de plus certains bogues en mode 32 bits.
Ne vous en servez donc vraiment que pour compiler Linux.</P>
<P>Les versions les plus r&eacute;centes de Bruce Evans (bde@zeta.org.au)
est diffus&eacute;e avec la distribution FreeBSD.
Enfin, elles l'&eacute;taient! Je n'ai pas pu trouver les sources
dans la distribution 2.1. Toutefois, vous pouvez trouver les sources dans</P>
<P>
<A HREF="http:///www.eleves.ens.fr:8080/home/rideau/files/bcc-95.3.12.src.tgz">http:///www.eleves.ens.fr:8080/home/rideau/files/bcc-95.3.12.src.tgz</A>
</P>
<P>Le projet Linux/8086 (&eacute;galement appel&eacute; ELKS) s'est d'une certaine mani&egrave;re
charg&eacute;e de maintenir bcc (mais je ne crois pas qu'ils aient inclus les patches
32 bits). Voir les sites 
<A HREF="http://www.linux.org.uk/Linux8086.html">http://www.linux.org.uk/Linux8086.html</A>

et 
<A HREF="ftp://linux.mit.edu/">ftp://linux.mit.edu/</A>
.</P>
<P>Entre autres choses, ces versions plus r&eacute;centes,
&agrave; la diff&eacute;rence de celle de HJLu, g&egrave;rent le format a.out de Linux;
vous pouvez donc effectuer des &eacute;ditions de liens avec des programmes Linux,
et/ou utiliser les outils habituels provenant du paquetage 
binutils pour manipuler vos donn&eacute;es.
Cette version peut co-exister sans probl&egrave;me
avec les versions pr&eacute;c&eacute;dentes (voir la question &agrave; ce sujet un peu plus loin).</P>
<P>La version du 12 mars 1995 de BCC ainsi que les pr&eacute;c&eacute;dentes a un
probl&egrave;me qui provoque la g&eacute;n&eacute;ration de toutes les op&eacute;rations
d'empilement/d&eacute;pilement de segments en 16 bits, ce qui est particuli&egrave;rement
ennuyant lorsque vous d&eacute;veloppez en mode 32 bits. Un patch est diffus&eacute;
par le projet Tunes</P>
<P>
<A HREF="http://www.eleves.ens.fr:8080/home/rideau/Tunes/">http://www.eleves.ens.fr:8080/home/rideau/Tunes/</A>
</P>
<P>&agrave; partir du lien suivant:
<CODE>files/tgz/tunes.0.0.0.25.src.tgz</CODE>
ou dans le r&eacute;pertoire
<CODE>LLL/i386/</CODE>.</P>
<P>Le patch peut &eacute;galement &ecirc;tre directement r&eacute;cup&eacute;r&eacute; sur </P>
<P>
<A HREF="http://www.eleves.ens.fr:8080/home/rideau/files/as86.bcc.patch.gz">http://www.eleves.ens.fr:8080/home/rideau/files/as86.bcc.patch.gz</A>
</P>
<P>Bruce Evans a accept&eacute; ce patch, donc si une version plus r&eacute;cente de BCC existe,
le patch devrait avoir &eacute;t&eacute; int&eacute;gr&eacute;...</P>
<P></P>
<P></P>
<H3>Comme appeller l'assembleur?</H3>

<P>Voici l'entr&eacute;e d'un Makefile GNU pour utiliser bcc pour
transformer un fichier assembleur <CODE>.s</CODE> &agrave; la fois en un
objet a.out GNU <CODE>.o</CODE> et un listing <CODE>.l</CODE>:</P>
<P>
<HR>
<PRE>
%.o %.l:        %.s
        bcc -3 -G -c -A-d -A-l -A$*.l -o $*.o $&lt;
</PRE>
<HR>
</P>
<P>Supprimez <CODE>%.l</CODE>, <CODE>-A-l</CODE>, et <CODE>-A$*.l</CODE>,
si vous ne voulez pas avoir de listing.
Si vous souhaitez obtenir autre chose que du a.out GNU,
consultez la documentation de bcc concernant
les autres formats reconnus et/ou utilisez le programme
objcopy du paquetage binutils.</P>
<P></P>
<P></P>
<H3>O&ugrave; trouver de la documentation</H3>

<P></P>
<P>Les documentations se trouvent dans le paquetage bcc.
Des pages de manuel sont &eacute;galement disponibles
quelque part sur le site de FreeBSD.
Dans le doute, les sources sont assez souvent une bonne documentation:
ce n'est pas tr&egrave;s comment&eacute; mais le style de programmation est tr&egrave;s simple.
Vous pouvez essayer de voir comment as86 est utilis&eacute; dans Tunes 0.0.0.25...</P>
<P></P>
<P></P>
<H3>Que faire si je ne peux plus compiler Linux avec cette nouvelleversion</H3>

<P>Linus est submerg&eacute; par le courrier &eacute;lectronique et mon patch
pour compiler Linux avec un as86 a.out n'a pas d&ucirc; lui parvenir (!).
Peu importe: conservez le as86 provenant du paquetage bin86 dans 
le r&eacute;pertoire /usr/bin, et laissez bcc installer le bon as86 en tant que
/usr/local/libexec/i386/bcc/as comme que de droit.
Vous n'aurez jamais besoin d'appeler explicitement ce dernier,
car bcc se charge tr&egrave;s bien de tout, y compris la conversion en a.out Linux,
lorsqu'il est appel&eacute; avec les bonnes options.
Assemblez les fichiers uniquement en passant par bcc,
et non pas en appelant as86 directement.</P>
<P></P>
<P></P>
<P></P>

<H2>3.6 <A NAME="ss3.6"></A> Autres assembleurs</H2>

<P></P>
<P>Il s'agit d'autres possibilit&eacute;s, qui sortent de la voie ordinaire,
pour le cas o&ugrave; les solutions pr&eacute;c&eacute;dentes ne vous conviennent pas
(mais je voudrais bien savoir pourquoi?),
que je ne recommande pas dans les cas habituels,
mais qui peuvent se montrer fort utiles
si l'assembleur doit faire partie int&eacute;grante du logiciel que vous concevez
(par exemple un syst&egrave;me d'exploitation ou un environnement de d&eacute;veloppement).</P>
<P></P>
<P></P>
<H3>L'assembleur de Win32Forth</H3>

<P></P>
<P>Win32Forth est un syst&egrave;me ANS FORTH 32 bit <EM>libre</EM>
qui fonctionne sous Win32s, Win95, Win/NT.
Il comprend un assembleur 32 bit libre (sous forme pr&eacute;fixe ou postfixe)
int&eacute;gr&eacute;e au langage FORTH.
Le traitement des macro est effectu&eacute; en utilisant toute
la puissance du langage r&eacute;flexif FORTH.
Toutefois, le seul contexte d'entr&eacute;e et sortie reconnu actuellement
est Win32For lui-m&ecirc;me (aucune possibilit&eacute; d'obtenir un fichier objet,
mais vous pouvez toujours l'ajouter par vous-m&ecirc;me, bien s&ucirc;r).
Vous pouvez trouver Win32For &agrave; l'adresse suivante:
<A HREF="ftp://ftp.forth.org/pub/Forth/win32for/">ftp://ftp.forth.org/pub/Forth/win32for/</A>
</P>
<P></P>
<P></P>
<H3>Terse</H3>

<P></P>
<P>Terse est un outil de programmation qui fournit 
<EM>LA</EM> syntaxe assembleur la plus compacte pour la famille 
des processeur x86!
Voir le site 
<A HREF="http://www.terse.com">http://www.terse.com</A>
.
Ce n'est cependant pas un logiciel libre.
Il y aurait eu un clone libre quelque part,
abandonn&eacute; &agrave; la suite de mensong&egrave;res all&eacute;gations de droits sur la syntaxe,
que je vous invite &agrave; ressusciter si la syntaxe vous int&eacute;resse.</P>
<P></P>
<P></P>
<H3>Assembleurs non libres et/ou non 32 bits</H3>

<P></P>
<P>Vous trouverez un peu plus d'informations sur eux,
ainsi que sur les bases de la programmation assembleur sur x86,
dans la FAQ de Raymond Moon pour le forum comp.lang.asm.x86.
Voir
<A HREF="http://www2.dgsys.com/~raymoon/faq/asmfaq.zip">http://www2.dgsys.com/~raymoon/faq/asmfaq.zip</A>
</P>
<P>Remarquez que tous les assembleurs DOS devraient fonctionner avec
l'&eacute;mulateur DOS de Linux ainsi qu'avec d'autres &eacute;mulateurs du m&ecirc;me genre.
Aussi, si vous en poss&eacute;dez un, vous pouvez toujours l'utiliser &agrave; l'int&eacute;rieur
d'un vrai syst&egrave;me d'exploitation.
Les assembleurs sous DOS assez r&eacute;cents g&egrave;rent &eacute;galement
les formats de fichiers objets COFF et/ou des formats g&eacute;r&eacute;s
par la biblioth&egrave;que GNU BFD de telle mani&egrave;re que vous pouvez
les utiliser en conjonction avec les outils 32 bits libres,
en utilisant le programme GNU objcopy (du paquetage binutils)
comme un filtre de conversion.</P>
<P></P>
<P></P>

<HR>
<P>
Chapitre <A HREF="Assembly-HOWTO-4.html">suivant</A>,
Chapitre <A HREF="Assembly-HOWTO-2.html">Pr&eacute;c&eacute;dent</A>
<P>
Table des mati&egrave;res de <A HREF="Assembly-HOWTO.html#toc3">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>