Assembly HOWTO

Fran�ois-Ren� Rideau rideau@ens.fr

v0.4l, 16 Novembre 1997
(Version fran�aise r�alis�e par Eric Dumas dumas@freenix.fr dumas@Linux.EU.Org, et Far� Rideau rideau@ens.fr, 11 Novembre 1997). Ce document d�crit comment programmer en assembleur x86 en n'utilisant que des outils de d�veloppement libres, et tout particuli�rement avec le syst�me d'exploitation Linux sur la plate-forme i386. Les informations contenues dans ce document peuvent �tre applicables ou non applicables � d'autres plates-formes mat�rielles ou logicielles. Les contributions � ce documents seront accept�es avec gratitude. mots-clefs: assembleur, libre, macroprocesseur, pr�processeur, asm, inline asm, 32 bits, x86, i386, gas, as86, nasm

1. Introduction

1.1 Copyright

Copyright © 1996,1997 Fran�ois-Ren� Rideau. Ce document peut �tre redistribu� sous les termes de la license LDP, disponibles � http://sunsite.unc.edu/LDP/COPYRIGHT.html.

1.2 Note importante

Ceci est cens� �tre la derni�re version que j'�crirai de ce document. Il y a un candidat pour reprendre en charge le document, mais jusqu'� ce qu'il le reprenne compl�tement en main, je serai heureux de m'occuper de tout courrier concernant ce document.

Vous �tes tout sp�cialement invit�s � poser des questions, � y r�pondre, � corriger les donn�es, � ajouter de nouvelles informations, � compl�ter les r�f�rences sur d'autres logiciels, � mettre en �vidence les erreurs et lacunes du document. Si vous �tes motiv�s, vous pouvez m�me prendre en charge ce document. En un mot, apporter votre contribution!

Pour contribuer � ce document, contactez la personne qui appara�t actuellement en charge. Au moment o� j'�cris ces lignes, il s'agit de Fran�ois-Ren� Rideau) ainsi que de Paul Anderson.

1.3 Avant-Propos

Ce document est destin� � r�pondre aux questions les plus fr�quemment pos�es par les gens qui d�veloppent ou qui souhaitent d�velopper des programmes en assembleurs x86 32 bits en utilisant des logiciels libres, et tout particuli�rement sous Linux. Vous y trouverez �galement des liens sur d'autres documents traitant d'assembleur, fond�s sur des outils logiciels qui ne sont pas libres, pas 32-bit, ou pas d�di�s � l'architecture x86, bien que cela ne soit pas le but principal de ce document.

Etant donn� que l'int�ret principal de la programmation en assembleur est d'�tablir les fondations de syst�mes d'exploitation, d'interpr�teurs, de compilateurs, et de jeux, l� o� un compilateur C n'arrive plus � fournir le pouvoir d'expression n�cessaire (les performances �tant de plus en plus rarement un probl�me), nous insisteront sur le d�veloppement de tels logiciels.

Comment utiliser ce document

Ce document contient des r�ponses � un certain nombre de questions fr�quemment pos�es. Des URL y sont donn�s, qui pointent sur des sites contenant documents ou logiciels. Prenez conscience que les plus utiles de ces sites sont dupliqu�s sur des serveurs miroirs, et qu'en utilisant le site miroir le plus proche de chez vous, vous �vitez � un g�chis inutile aussi bien de pr�cieuses ressources r�seau communes � l'Internet que de votre propre temps. Ainsi, il existe un certain nombre de gros serveurs diss�min�s sur la plan�te, qui effectuent la duplication d'autres sites importants. Cherchez o� se trouvent ces sites et identifiez les plus proches de chez vous (du point de vue du r�seau). Parfois, la liste des miroirs est donn�es dans un fichier ou dans le message de connexion. Suivez ces conseils. Si ces informations ne sont pas pr�sentes, utilisez le programme archie.

La version la plus r�cente de ce document peut �tre trouv�e sur

http://www.eleves.ens.fr:8080/home/rideau/Assembly-HOWTO ou http://www.eleves.ens.fr:8080/home/rideau/Assembly-HOWTO.sgml

mais les r�pertoires de HowTo Linux devraient normalement �tre � peu pr�s � jour (je ne peux pas le garentir):

ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/ (?)

La version fran�aise de ce document peut �tre trouv�e sur le site

ftp://ftp.ibp.fr/pub/linux/french/HOWTO/

Autres documents de r�f�rence

1.4 Historique de document

Chaque version inclue quelques modifications et corrections mineures, qui ne sont pas indiqu�es � chaque fois.

Version 0.1 23 Avril 1996

Francois-Rene "Far�" Rideau <rideau@ens.fr> cr�e et diffuse initialement le document sous forme d'un mini-HOWTO car ``Je suis un peu fatigu� d'avoir � r�pondre encore et toujours aux m�mes questions dans le forum comp.lang.asm.x86''

Version 0.2 4 Mai 1996

*

Version 0.3c 15 Juin 1996

*

Version 0.3f 17 Octobre 1996

Tim Potter indique l'option -fasm pour activer l'assembleur en-ligne de GCC sans le reste des optimisations de -O.

Version 0.3g 2 Novembre 1996

Cr�ation de l'historique. Ajout de pointeurs dans la section sur la compilation crois�e. Ajout d'une section concernant la programmation des entr�es/sorties sous Linux (en particulier pour l'acc�s vid�o).

Version 0.3h 6 Novembre 1996

plus sur la compilation crois�e - voir sur sunsite: devel/msdos/

Version 0.3i 16 Novembre 1996

NASM commence � �tre particuli�rement int�ressant

Version 0.3j 24 Novembre 1996

R�f�rence sur la version fran�aise

Version 0.3k 19 D�cembre 1996

Quoi? J'avais oubli� de parler de Terse?

Version 0.3l 11 Janvier 1997

*

Version 0.4pre1 13 Janvier 1997

Le mini-HOWTO au format texte est transform� en un authentique HOWTO au format linuxdoc-sgml, pour explorer les possibilit�s dudit format.

Version 0.4 20 Janvier 1997

Premi�re diffusion de ce HOWTO.

Version 0.4a 20 Janvier 1997

Ajout de la section CREDITS

Version 0.4b 3 F�vrier 1997

NASM mis avant AS86

Version 0.4c 9 F�vrier 1997

Ajout de la partie "Avez-vous besoin d'utilisateur l'assembleur?"

Version 0.4d 28 F�vrier 1997

Annonce fant�me d'un nouveau responsable de ce HowTo.

Version 0.4e 13 Mar 1997

Version diffus�e pour DrLinux

Version 0.4f 20 Mars 1997

*

Version 0.4g 30 Mars 1997

*

Version 0.4h 19 Juin 1997

Ajouts � propos de "Comment ne pas utiliser l'assembleur"; mises � jour concernant NASM et GAS.

Version 0.4i 17 Juillet 1997

Informations sur l'acc�s au mode 16 bits � partir de Linux.

Version 0.4j 7 September 1997

*

Version 0.4k 19 Octobre 1997

je (Far�) reprends en main la traduction fran�aise du HowTo

Version 0.4l 16 Novembre 1997

version pour LSL 6�me �dition.

Il s'agit encore d'une nouvelle ``toute derni�re version r�alis�e par Far� avant qu'un nouveau responsable ne prenne la main''.

1.5 Cr�dits

Je souhaiterais remercier les personnes suivantes:

2. Avez-vous besoin de l'assembleur?

Je ne veux en aucun cas jouer les emp�cheurs-de-tourner-en-rond, mais voici quelques conseils issus d'une exp�rience gagn�e � la dure.

2.1 Le Pour et le Contre

Les avantages de l'assembleur

L'assembleur peut vous permettre de r�aliser des op�rations tr�s bas niveau:

Les inconv�nients de l'assembleur

L'assembleur est un langage tr�s bas niveau (le langage du plus bas niveau qui soit au dessus du codage � la main de motifs d'instructions en binaire). En cons�quence:

Affirmation

En pesant le pour et le contre, on peut conclure que si l'assembleur est parfois n�cessaire, et peut m�me �tre utile dans certains cas o� il ne l'est pas, il vaut mieux:

M�me dans les cas o� l'assembleur est n�cessaire (par exemple lors de d�veloppement d'un syst�me d'exploitation), ce n'est qu'� petite dose, et sans infirmer les principes ci-dessus.

Consultez � ce sujet les sources du noyau de Linux: vous verrez qu'il s'y trouve juste le peu qu'il faut d'assembleur, ce qui permet d'avoir un syst�me d'exploitation rapide, fiable, portable et d'entretien facile. M�me un jeu tr�s c�l�bre comme DOOM a �t� en sa plus grande partie �crit en C, avec une toute petite routine d'affichage en assembleur pour acc�l�rer un peu.

2.2 Comment ne pas utiliser l'assembleur

M�thode g�n�rale pour obtenir du code efficace

Comme le dit Charles Fiterman dans comp.compilers � propos de la diff�rence entre code �crit par l'homme ou la machine,

``L'homme devrait toujours gagner, et voici pourquoi:

L'homme gagne parce qu'il peut utiliser la machine.''

Langages avec des compilateurs optimisateurs

Des langages comme ObjectiveCAML, SML, CommonLISP, Scheme, ADA, Pascal, C, C++, parmi tant d'autres, ont tous des compilateurs optimiseurs librement disponibles, qui optimiseront le gros de vos programmes, et produiront souvent du code meilleur que de l'assembleur fait-main, m�me pour des boucles serr�es, tout en vous permettant de vous concentrer sur des d�tails haut niveau, et sans vous interdire de gagner par la m�thode pr�c�dente quelques pourcents de performance suppl�mentaire, une fois la phase de conception g�n�rale termin�e. Bien s�r, il existe �galement des compilateurs optimiseurs commerciaux pour la plupart de ces langages.

Certains langages ont des compilateurs qui produisent du code C qui peut ensuite �tre optimis� par un compilateur C. C'est le cas des langages LISP, Scheme, Perl, ainsi que de nombreux autres. La vitesse des programmes obtenus est toute � fait satisfaisante.

Proc�dure g�n�rale � suivre pour acc�lerer votre code

Pour acc�l�rer votre code, vous ne devriez traiter que les portions d'un programme qu'un outil de mesure de temps d'�x�cution (profiler) aura identifi� comme �tant un goulot d'�tranglement pour la performance de votre programme.

Ainsi, si vous identifiez une partie du code comme �tant trop lente, vous devriez

Enfin, avant d'en venir � cette derni�re option, vous devriez inspecter le code g�n�r� pour v�rifier que le probl�me vient effectivement d'une mauvaise g�n�ration de code, car il se peut fort bien que ce ne soit pas le cas: le code produit par le compilateur pourrait �tre meilleur que celui que vous auriez �crit, en particulier sur les architectures modernes � pipelines multiples! Il se peut que les portions les plus lentes de votre programme le soit pour des raisons intrins�ques. Les plus gros probl�mes sur les architectures modernes � processeur rapide sont dues aux d�lais introduits par les acc�s m�moires, manqu�s des caches et TLB, fautes de page; l'optimisation des registres devient vaine, et il vaut mieux repenser les structures de donn�es et l'encha�nement des routines pour obtenir une meilleur localit� des acc�s m�moire. Il est possible qu'une approche compl�tement diff�rente du probl�me soit alors utile.

Inspection du code produit par le compilateur

Il existe de nombreuses raisons pour vouloir regarder le code assembleur produit par le compilateur. Voici ce que vous pourrez faire avec ce code:

La mani�re standard d'obtenir le code assembleur g�n�r� est d'appeller le compilateur avec l'option -S. Cela fonctionne avec la plupart des compilateur Unix y compris le compilateur GNU C (GCC); mais � vous de voir dans votre cas. Pour ce qui est de GCC, il produira un code un peu plus compr�hensible avec l'option -fverbose-asm. Bien sur, si vous souhaitez obtenir du code assembleur optimis�, n'oubliez pas d'ajouter les options et indices d'optimisation appropri�es!

3. Assembleurs

3.1 Assembleur en-ligne de GCC

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

O� trouver GCC

Le site principal de GCC est le site FTP du projet GNU: ftp://prep.ai.mit.edu/pub/gnu/ On y trouve �galement toutes les applications provenant du projet GNU. Des versions configur�es ou pr�compil�es pour Linux sont disponibles sur ftp://sunsite.unc.edu/pub/Linux/GCC/. Il existe un grand nombre de miroirs FTP des deux sites partout de par le monde, aussi bien que des copies sur CD-ROM.

Le groupe de d�veloppement de GCC s'est r�cemment scind� en deux; pour plus d'informations sur la version exp�rimentale, egcs, voir http://www.cygnus.com/egcs/

Les sources adapt�s � votre syst�me d'exploitation pr�f�r� ainsi que les binaires pr�compil�s peuvent �tre trouv�s sur les sites FTP courants.

Le portage le plus c�l�bre de GCC pour DOS est DJGPP et il peut �tre trouv� dans le r�pertoire du m�me nom sur les sites ftp. Voir:

http://www.delorie.com/djgpp/

Il existe �galement un portage de GCC pour OS/2 appel� EMX qui fonctionne �galement sous DOS et inclut un grand nombre de routines d'�mulation Unix. Voir les sites

http://www.leo.org/pub/comp/os/os2/gnu/emx+gcc/

http://warp.eecs.berkeley.edu/os2/software/shareware/emx.html

ftp://ftp-os2.cdrom.com/pub/os2/emx09c/

O� trouver de la documentation sur l'assembleur en ligne avec GCC?

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 � peu pr�s n'importe quel format (avec les outils ad�quats). Les fichiers .info sont g�n�ralement install�s en m�me temps que GCC.

La section � consulter est C Extensions::Extended Asm::

La section Invoking GCC::Submodel Options::i386 Options:: peut �galement vous aider. En particulier, elle donne les noms de contraintes pour les registres du i386: abcdSDB correspondent respectivement � %eax, %ebx, %ecx, %edx, %esi, %edi, %ebp (aucune lettre pour %esp).

Le site "DJGPP Games resource" (qui n'est pas r�serv� aux seuls d�veloppeurs de jeux) poss�de une page particuli�re sur l'assembleur:

http://www.rt66.com/~brennan/djgpp/djgpp_asm.html

Enfin, il existe une page de la Toile appel�e "DJGPP Quick ASM Programming Guide", contenant des URL sur des FAQ, la syntaxe assembleur AT&T x86, des informations sur l'assembleur en ligne, et la conversion des fichiers .obj/.lib:

http://remus.rutgers.edu/~avly/djasm.html

GCC soutraite l'assemblage proprement dit � GAS et suit donc sa syntaxe (voir plus bas), cela implique que l'assembleur en ligne doit utiliser des caract�res pourcents entre apostrophes pour qu'ils soient pass�s � GAS. Voir la section d�di�e � GAS.

Vous trouverez un grand nombre d'exemples instructifs dans le r�pertoire linux/include/asm-i386/ des sources de Linux.

Appeller GCC pour obtenir du code assembleur en ligne correcte?

Assurez-vous d'appeller gcc avec l'option -O (ou -O2, -O3, etc) pour activer les optimisations et l'assembleur en ligne. Si vous ne le fa�tes pas, votre code pourra compiler mais ne pas s'ex�cuter correctement!! En fait (merci � Tim Potter, timbo@moshpit.air.net.au), il suffit d'utiliser l'option -fasm, faisant partie de toutes les fonctionnalit�s activ�es par l'option -O. Donc si vous avez des probl�mes en raison d'optimisations bogu�es dans votre impl�mentation de gcc, vous pouvez toujours utiliser l'assembleur en ligne. De m�me, utilisez l'option -fno-asm pour d�sactiver l'assembleur en ligne (on peut se demander pourquoi?).

Plus g�n�ralement, les bonnes options de compilation � utiliser avec gcc sur les plates-formes x86 sont


        gcc -O2 -fomit-frame-pointer -m386 -Wall

-O2 est le bon niveau d'optimisation. Les optimisations sup�rieures g�n�rent un code un peu plus important, mais tr�s l�g�rement plus rapide. De telles sur-optimisations peuvent �tre utiles que dans le cas d'optimisations de boucles que vous pouvez toujours r�aliser en assembleur. Si vous avez besoin de faire ce genre de choses, ne le fa�tes que pour les routines qui en ont besoin.

-fomit-frame-pointer permet au code g�n�r� de se passer de la gestion inutile des pointeurs de fen�tre, ce qui rend le code plus petit plus rapide et lib�re un registre pour de plus amples optimisations. Cette option exclue l'utilisation des outils de d�boggage (gdb), mais lorsque vous les utilisez, la taille et la vitesse importent peu.

-m386 g�n�re un code plus compacte sans ralentissement notable, (moins de code signifie �galement mois d'entr�es/sorties sur disque et donc une ex�cution plus rapide). Vous pouvez �galement utiliser l'option -mpentium sur la version GCC g�rant l'optimisation pour ce processeur.

-Wall active toutes les mises-en-garde (warning) et vous �vite de nombreuses erreurs stupides et �videntes.

Pour optimiser encore plus, vous pouvez utiliser l'option -mregparm=2 et/ou les attributs de fonctions qui peuvent �tre utilis�s mais ils peuvent dans certains cas poser de nombreux probl�mes lors de l'�dition de liens avec du code externe (notamment les biblioth�ques partag�es)...

Notez que vous pouvez ajoutez ces options aux options utilis�es par d�faut sur votre syst�me en �ditant le fichier /usr/lib/gcc-lib/i486-linux/2.7.2.3/specs (cependant, ne rajoutez pas -Wall � ces options).

3.2 GAS

GAS est l'assembleur GNU, utilis� par gcc.

O� le trouver?

Au m�me endroit o� vous avez trouv� gcc, dans le paquetage binutils.

Qu'est-ce que la syntaxe AT&T

Comme GAS a �t� invent� pour supporter un compilateur 32 bits sous unix, il utilise la syntaxe standard "AT&T", qui ressemblent assez � l'assembleur m68k. La syntaxe n'est ni pire, ni meilleur que la syntaxe "Intel". Elle est juste diff�rente. Lorsque vous aurez l'habitude de vous en servir, vous la trouverez plus r�guli�re que la syntaxe Intel, quoique que l�g�rement plus ennuyeuse aussi.

Voici les points les plus importants � propos de la syntaxe de GAS:

Un programme existe pour vous aider � convertir des programmes �crits avec la syntaxe TASM en syntaxe AT&T. Voir

ftp://x2ftp.oulu.fi/pub/msdos/programming/convert/ta2asv08.zip

GAS poss�de une documentation compl�te au format TeXinfo, qui est distribu�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� gas.doc ou as.doc disponible autour des sources de GAS, mais il a �t� fusionn� avec la documentation TeXinfo. Bien s�r, en cas de doute, l'ultime documentation est constitu�e par les sources eux-m�mes! Une section qui vous int�ressera particuli�rement est Machine Dependencies::i386-Dependent::

Les sources de Linux dont un bon exemple: regardez dans le r�pertoire linux/arch/i386 les fichiers suivants: kernel/*.S, boot/compressed/*.S, mathemu/*.S

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).

Enfin g�n�rer � partir d'un programme C du code assembleur peut vous montrer le genre d'instructions que vous voulez. Consultez la section Avez-vous besoin de l'assembleur? au d�but de ce document.

mode 16 bits limit�

GAS est un assembleur 32 bits, con�u pour assembler le code produit par un compilateur 32 bits. Il ne reconna�t que d'une mani�re limit� le mode 16 bits du i386, en ajoutant des pr�fixes 32 bits aux instructions; vous �crivez donc en r�alit� du code 32 bits, qui s'ex�cute en mode 16 bits sur un processeur 32 bits. Dans les deux modes, il g�re les registres 16 bits, mais pas l'adressage 16 bits. Utilisez les instructions .code16 et .code32 pour basculer d'un mode � l'autre. Notez que l'instruction assembleur en ligne asm(".code16\n") autorisera gcc � g�n�rer du code 32 bits qui fonctionnera en mode r��l!

Le code n�cessaire pour que GAS g�re le mode 16 bits aurait �t� ajout� par Bryan Ford (� confirmer?). Toutefois, ce code n'est pr�sent dans aucune distribution de GAS que j'ai essay�e (jusqu'� binutils-2.8.1.x) ... plus d'informations � ce sujet seraient les bienvenues dans ce HowTo.

Une solution bon march� pour ins�rer quelques instructions 16-bit non reconnues pas GAS consiste � d�finir des macros (voir plus bas) qui produisent directement du code binaire (avec .byte), et ce uniquement pour les rares instructions 16 bits dont vous avez besoin (quasiment aucunes, si vous utilisez le .code16 pr�c�dement d�crit, et pouvez vous permettre de supposer que le code fonctionnera sur un processeur 32 bits). Pour obtenir le syst�me de codage correct, vous pouvez vous inspirer des assembleurs 16 bits.

3.3 GASP

GASP est un pr�processeur pour GAS. Il ajoute des macros et une syntaxe plus souple � GAS.

O� trouver gasp?

gasp est livr� avec gas dans le paquetage binutils GNU.

Comment il fonctionne?

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

3.4 NASM

Du projet Netwide Assembler est issu encore un autre assembleur, �crit en C, qui devrait �tre assez modulaire pour supporter toutes les syntaxes connues et tous les formats objets existants.

O� trouver NASM?

http://www.cryogen.com/Nasm

Les versions binaires se trouvent sur votre miroir sunsite habituel dans le r�pertoire devel/lang/asm/. Il devrait �galement �tre disponible sous forme d'archive .rpm ou .deb parmi les contributions � votre distribution pr�f�r�e RedHat ou Debian.

Son r�le

Au moment de l'�criture de ce HOWTO, NASM en est � la version 0.96.

La syntaxe est � la Intel. Une gestion de macros est int�gr�e.

Les formats objets reconnus sont bin, aout, coff, elf, as86, (DOS) obj, win32, et rdf (leur propre format).

NASM peut �tre utilis�e comme assembleur pour le compilateur libre LCC.

Comme NASM �volue rapidement, ce HowTo peut ne pas �tre � jour � son sujet. A moins que vous n'utilisiez BCC comme compilateur 16 bit (ce qui d�passe le cadre de ce document), vous devriez utiliser NASM plut�t que AS86 ou MASM, car c'est un logiciel libre avec un excellent service apr�s-don, qui tourne sur toutes plateformes logicielles et mat�rielles.

Note: NASM est �galement livr� avec un d�sassembleur, NDISASM.

Son analyseur "grammatical", �crit � la main, le rend beaucoup plus rapide que GAS; en contrepartie, il ne reconna�t qu'une architecture, en comparaison de la pl�thore d'architectures reconnues par GAS. Pour les plates-formes x86, NASM semble �tre un choix judicieux.

3.5 AS86

AS86 est un assembleur 80x86, � la fois 16 et 32 bits, faisant partie du compilateur C de Bruce Evans (BCC). Il poss�de une syntaxe � la Intel.

Where to get AS86

Une version compl�tement d�pass�e de AS86 est diffus�e par HJLu juste pour compiler le noyau Linux, dans un paquetage du nom de bin86 (actuellement version 0.4) disponible dans le r�pertoire GCC des sites FTP Linux. Je d�conseille son utilisation pour toute autre chose que compiler Linux. Cette version ne reconna�t qu'un format de fichiers minix modifi�, que ne reconnaissent ni les binutils GNU ni aucun autre produit. Il poss�de de plus certains bogues en mode 32 bits. Ne vous en servez donc vraiment que pour compiler Linux.

Les versions les plus r�centes de Bruce Evans (bde@zeta.org.au) est diffus�e avec la distribution FreeBSD. Enfin, elles l'�taient! Je n'ai pas pu trouver les sources dans la distribution 2.1. Toutefois, vous pouvez trouver les sources dans

http:///www.eleves.ens.fr:8080/home/rideau/files/bcc-95.3.12.src.tgz

Le projet Linux/8086 (�galement appel� ELKS) s'est d'une certaine mani�re charg�e de maintenir bcc (mais je ne crois pas qu'ils aient inclus les patches 32 bits). Voir les sites http://www.linux.org.uk/Linux8086.html et ftp://linux.mit.edu/.

Entre autres choses, ces versions plus r�centes, � la diff�rence de celle de HJLu, g�rent le format a.out de Linux; vous pouvez donc effectuer des �ditions de liens avec des programmes Linux, et/ou utiliser les outils habituels provenant du paquetage binutils pour manipuler vos donn�es. Cette version peut co-exister sans probl�me avec les versions pr�c�dentes (voir la question � ce sujet un peu plus loin).

La version du 12 mars 1995 de BCC ainsi que les pr�c�dentes a un probl�me qui provoque la g�n�ration de toutes les op�rations d'empilement/d�pilement de segments en 16 bits, ce qui est particuli�rement ennuyant lorsque vous d�veloppez en mode 32 bits. Un patch est diffus� par le projet Tunes

http://www.eleves.ens.fr:8080/home/rideau/Tunes/

� partir du lien suivant: files/tgz/tunes.0.0.0.25.src.tgz ou dans le r�pertoire LLL/i386/.

Le patch peut �galement �tre directement r�cup�r� sur

http://www.eleves.ens.fr:8080/home/rideau/files/as86.bcc.patch.gz

Bruce Evans a accept� ce patch, donc si une version plus r�cente de BCC existe, le patch devrait avoir �t� int�gr�...

Comme appeller l'assembleur?

Voici l'entr�e d'un Makefile GNU pour utiliser bcc pour transformer un fichier assembleur .s � la fois en un objet a.out GNU .o et un listing .l:


%.o %.l:        %.s
        bcc -3 -G -c -A-d -A-l -A$*.l -o $*.o $<

Supprimez %.l, -A-l, et -A$*.l, 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.

O� trouver de la documentation

Les documentations se trouvent dans le paquetage bcc. Des pages de manuel sont �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�s comment� mais le style de programmation est tr�s simple. Vous pouvez essayer de voir comment as86 est utilis� dans Tunes 0.0.0.25...

Que faire si je ne peux plus compiler Linux avec cette nouvelleversion

Linus est submerg� par le courrier �lectronique et mon patch pour compiler Linux avec un as86 a.out n'a pas d� lui parvenir (!). Peu importe: conservez le as86 provenant du paquetage bin86 dans le r�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�s bien de tout, y compris la conversion en a.out Linux, lorsqu'il est appel� avec les bonnes options. Assemblez les fichiers uniquement en passant par bcc, et non pas en appelant as86 directement.

3.6 Autres assembleurs

Il s'agit d'autres possibilit�s, qui sortent de la voie ordinaire, pour le cas o� les solutions pr�c�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�grante du logiciel que vous concevez (par exemple un syst�me d'exploitation ou un environnement de d�veloppement).

L'assembleur de Win32Forth

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

Terse

Terse est un outil de programmation qui fournit LA syntaxe assembleur la plus compacte pour la famille des processeur x86! Voir le site http://www.terse.com. Ce n'est cependant pas un logiciel libre. Il y aurait eu un clone libre quelque part, abandonn� � la suite de mensong�res all�gations de droits sur la syntaxe, que je vous invite � ressusciter si la syntaxe vous int�resse.

Assembleurs non libres et/ou non 32 bits

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 http://www2.dgsys.com/~raymoon/faq/asmfaq.zip

Remarquez que tous les assembleurs DOS devraient fonctionner avec l'�mulateur DOS de Linux ainsi qu'avec d'autres �mulateurs du m�me genre. Aussi, si vous en poss�dez un, vous pouvez toujours l'utiliser � l'int�rieur d'un vrai syst�me d'exploitation. Les assembleurs sous DOS assez r�cents g�rent �galement les formats de fichiers objets COFF et/ou des formats g�r�s par la biblioth�que GNU BFD de telle mani�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.

4. M�ta-programmation/macro-traitement

La programmation en assembleur est particuli�rement p�nible si ce n'est pour certaines parties critiques des programmes.

Pour travail donn�, il faut l'outil appropri�; ne choisissez donc pas l'assembleur lorsqu'il ne correspond pas au probl�me � r�soudre: C, OCAML, perl, Scheme peuvent �tre un meilleur choix dans la plupart des cas.

Toutefois, il y a certains cas o� ces outils n'ont pas un contr�le suffisamment fin sur la machine, et o� l'assembleur est utile ou n�cessaire. Dans ces cas, vous appr�cierez un syst�me de programmation par macros, ou un syst�me de m�ta-programmation, qui permet aux motifs r�p�titifs d'�tre factoris�s chacun en une seule d�finition ind�finiment r�utilisable. Cela permet une programmation plus s�re, une propagation automatique des modifications desdits motifs, etc. Un assembleur de base souvent ne suffit pas, m�me pour n'�crire que de petites routines � lier � du code C.

4.1 Description

Oui, je sais que cette partie peut manquer d'informations utiles � jour. Vous �tes libres de me faire part des d�couvertes que vous auriez d� faire � la dure...

GCC

GCC vous permet (et vous oblige) de sp�cifier les contraintes entre registres assembleurs et objets C, pour que le compilateur puisse interfacer le code assembleur avec le code produit par l'optimiseur. Le code assembleur en ligne est donc constitu� de motifs, et pas forc�ment de code exact.

Et puis, vous pouvez mettre du code assembleur dans des macro-d�finitions de CPP ou des fonctions "en-ligne" (inline), de telle mani�re que tout le monde puisse les utiliser comme n'importe quelle fonction ou macro C. Les fonctions en ligne ressemblent �norm�ment aux macros mais sont parfois plus propres � utiliser. M�fiez-vous car dans tous ces cas, le code sera dupliqu�, et donc seules les �tiquettes locales (comme 1:) devraient �tre d�finies dans ce code assembleur. Toutefois, une macro devrait permettre de passer en param�tre le nom �ventuellement n�cessaire d'une �tiquette d�finie non localement (ou sinon, utilisez des m�thodes suppl�mentaires de m�ta-programmation). Notez �galement que propager du code assembleur en-ligne r�pandra les bogues potentiels qu'il contiendrait, aussi, faites doublement attention � donner � GCC des contraintes correctes.

Enfin, le langage C lui-m�me peut �tre consid�r� comme �tant une bonne abstraction de la programmation assembleur, qui devrait vous �viter la plupart des difficult�s de la programmation assembleur.

M�fiez-vous des optimisations consistant � passer les arguments en utilisant les registres: cela interdit aux fonctions concern�es d'�tre appel�es par des routines exterieurs (en particulier celles �crites � la main en assembleur) d'une mani�re standard; l'attribut asmlinkage devrait emp�cher des routines donn�es d'�tre concern�es par de telles options d'optimisation. Voir les sources du noyau Linux pour avoir des exemples.

GAS

GAS a quelques menues fonctionnalit� pour les macro, d�taill�es dans la documentation TeXinfo. De plus

J'ai entendu dire que les versions r�centes en seront dot�es... voir les fichiers TeXinfo). De plus, tandis que GCC reconna�t les fichiers en .s comme de l'assembleur � envoyer dans GAS, il reconna�t aussi les fichiers en .S comme devant �tre filtrer � travers CPP avant d'�tre envoyer � GAS. Au risque de me r�p�ter, je vous convie � consulter les sources du noyau Linux.

GASP

Il ajoute toutes les fonctionnalit�s habituelles de macro � GAS. Voir sa documentation sous forme texinfo.

NASM

NASM poss�de aussi son syst�me de macros. Consultez sa documentation. Si vous avez quelqu'id�e lumineuse, contactez les auteurs, �tant donn� qu'ils sont en train de d�velopper NASM activement. Pendant ce m�me temps, lisez la partie sur les filtres externes un peu plus loin.

AS86

Il poss�de un syst�me simple de macros, mais je n'ai pas pu trouver de documentation. Cependant, les sources sont d'une approche particuli�rement ais�e, donc si vous �tes int�ress� pour en savoir plus, vous devriez pouvoir les comprendre sans probl�me. Si vous avez besoin d'un peu plus que des bases, vous devriez utiliser un filtre externe (voir un peu plus loin).

Autres assembleurs

4.2 Filtres externes

Quelque soit la gestion des macros de votre assembleur, ou quelque soit le langage que vous utilisez (m�me le C), si le langage n'est pas assez expressif pour vous, vous pouvez faire passer vos fichier � travers un filtre externe gr�ce � une r�gle comme suit dans votre Makefile:


%.s:    %.S autres_d�pendances
        $(FILTER) $(FILTER_OPTIONS) < $< > $@

CPP

CPP n'est vraiment pas tr�s expressif, mais il suffit pour les choses faciles, et il est appel� d'une mani�re transparente par GCC.

Comme exemple de limitation, vous ne pouvez pas d�clarer d'objet de fa�on � ce qu'un destructeur soit automatiquement appel� � la fin du bloc ayant d�clar� l'objet. Vous n'avez pas de diversions ou de gestion de port�e des variables, etc.

CPP est livr� avec tout compilateur C. Si vous pouvez faire sans, n'allez pas chercher CPP (bien que je me demande comment vous pouvez faire).

M4

M4 vous donne la pleine puissance du macro-traitement, avec un langage Turing-�quivalent, r�cursivit�, expressions r�guli�res, etc. Vous pouvez faire avec tout ce que cpp ne peut faire.

Voir macro4th/This4th que l'on trouve sur ftp://ftp.forth.org/pub/Forth/ dans Reviewed/ ANS/ (?), ou les sources de Tunes 0.0.0.25 comme exemple de programmation avanc�e en utilisant m4.

Toutefois, le syst�me de citation est tr�s p�nible � utiliser et vous oblige � utiliser un style de programmation par fonctions r�cursives avec passage explicite de continuation (CPS) pour toute programmation avanc�e (ce qui n'est pas sans rappeler � TeX -- au fait quelqu'un a-t-il d�j� essay� d'utiliser TeX comme macro-processeur pour autre chose que de la mise-en-page?). Toutefois, ce n'est pas pire que cpp qui ne permet ni citation ni r�cursivit�.

La bonne version de m4 � r�cup�rer est GNU m4 1.4 (ou ult�rieure si elle existe). C'est celle qui contient le plus de fonctionnalit� et le moins de bogues ou de limitations. m4 est con�u pour �tre intrins�quement lent pour toute utilisation sauf la plus simple; cela suffit sans aucun doute pour la plupart des programmes en assembleur (vous n'allez quand m�me pas �crire des millions de lignes en assembleur, si?).

Macro-traitement avec votre propre filtre

Vous pouvez �crire votre propre programme d'expansion de macro avec les outils courants comme perl, awk, sed, etc. C'est assez rapide � faire et vous pouvez tout contr�ler. Mais bien toute puissance dans le macro-traitement doit se gagner � la dure.

M�ta-programmation

Plut�t que d'utiliser un filtre externe qui effectue l'expansion des macros, une mani�re de r�aliser cela est d'�crire des programmes qui �crivent d'autres programmes, en partie ou en totalit�.

Par exemple, vous pourriez utiliser un programme g�n�rant du code source

Pensez-y!

Backends provenant de compilateur existants

Des compilateurs comme SML/NJ, Objective CAML, MIT-Scheme, etc, ont leur propre g�n�rateur de code assembleur, que vous pouvez ou non utiliser, si vous souhaitez g�n�rer du code semi-automatiquement depuis les langages correspondants.

Le New-Jersey Machine-Code Toolkit

Il s'agit projet utilisant le langage de programmation Icon pour b�tir une base de code de manipulation d'assembleur. Voir http://www.cs.virginia.edu/~nr/toolkit/

Tunes

Le projet de syst�me d'exploitation OS d�veloppe son propre assembleur comme �tant une extension du langage Scheme. Il ne fonctionne pas encore totalement, de l'aide est bienvenue.

L'assembleur manipule des arbres de syntaxes symboliques, de telle mani�re qu'il puisse servir comme base d'un traducteur de syntaxe assembleur, un d�sassembleur, l'assembleur d'un compilateur, etc. Le fait qu'il utile un vrai langage de programmation puissant comme Scheme le rend imbatable pour le macro-traitement et pour la m�ta-programmation.

http://www.eleves.ens.fr:8080/home/rideau/Tunes/

5. Conventions d'appel

5.1 Linux

Edition de liens avec GCC

C'est la solution la plus pratique. Consultez la documentation de gcc et prenez exemple sur les sources du noyau Linux (fichiers .S qui sont utilis�s avec gas, non pas as86).

Les arguments 32 bits sont empil�s dans la pile vers le bas dans l'ordre inverse de l'ordre syntaxique (c'est-�-dire qu'on acc�de aux arguments ou les d�pile dans l'ordre syntaxique), au-dessus de l'adresse de retour 32 bits. %ebp, %esi, %edi, %ebx doivent �tre conserv�s par l'appel�, les autres registres peuvent �tre d�truits; %eax doit contenir le r�sultat, ou %edx:%eax pour des r�sultats sur 64 bits.

Pile virgule flottante: je ne suis pas s�r, mais je pense que le r�sultat se trouve dans st(0), la pile �tant � la discr�tion de l'appel�.

Notez que GCC poss�de certaines options pour modifier les conventions d'appel en r�servant certains registres, en mettant les arguments dans des registres, en supposant que l'on ne poss�de pas de FPU, etc. Consultez les pages .info concernant le i386.

Il faut prendre garde � d�clarer l'attribut cdecl pour une fonction qui suit la convention standard GCC (je ne sais pas exactement ce que cela produit avec des conventions modifi�es). Consultez la documentation GCC dans la section: C Extensions::Extended Asm::

Probl�mes ELF et a.out

Certains compilateurs C ajoutent un underscore avant tout symbole, alors que d'autres ne le font pas.

En particulier, la version GCC a.out effectue ce genre d'ajouts, alors que la version ELF ne le fait pas.

Si vous �tes confront� � ce probl�me, regardez comment des paquetages existants traitent le probl�mes. Par exemple, r�cup�rer une ancienne arborescence des sources de Linux, Elk, les qthreads ou OCAML...

Vous pouvez �galement red�finir le renommage implicite de C en assembleur en ajoutant les instructions suivantes:


        void truc asm("machin") (void);

pour s'assurer que la fonction C truc sera r�ellement appel�e machin en assembleur.

Remarquez que l'outil objcopy, du paquetage binutils, devrait vous permettre de transformer vos fichiers objets a.out en objets ELF et peut-�tre inversement dans certains cas. D'une mani�re plus g�n�rale, il vous permet d'effectuer de nombreuses conversions de formats de fichiers.

Appels syst�mes directs

Il n'est absolument pas recommand� d'effectuer de tels appels par ce que leurs conventions peuvent changer de temps en temps, ou d'un type de noyau � un autre (cf L4Linux), de plus, ce n'est pas portable, difficile � �crire, redondant avec l'effort entrepris par libc, et enfin, cela emp�che les corrections et les extensions effectu�es � travers la libc, comme par exemple avec le programme zlibc qui r�alise une d�compression � la vol�e de fichiers compress�s avec gzip. La mani�re standard et recommend�e d'effectuer des appels syst�mes est et restera de passer par la libc.

Les objets partag�s devraient r�duire l'occupation m�moire des programmes, et si vous souhaitez absolument avoir de petits ex�cutables, utilisez #! avec un interpr�teur qui contiendra tout ce que vous ne voulez pas mettre dans vos binaires.

Maintenant, si pour certaines raisons, vous ne souhaitez pas effectuer une �dition des liens avec la libc, r�cup�rez-la et essayez de comprendre comment elle fonctionne! Apr�s tout, vous pr�tendez bien la remplacer non?

Vous pouvez aussi regarder comment eforth 1.0c le fait.

Les sources de Linux sont fort utiles, en particulier le fichier d'en-t�te asm/unistd.h qui d�crit comment sont effectu�s les appels syst�me...

Le principe g�n�ral est d'utiliser l'instruction int $0x80 avec le num�ro de l'appel syst�me __NR_machin (regarder dans asm/unistd.h) dans %eax, et les param�tres (jusqu'� cinq) dans %ebx, %ecx, %edx, %esi, %edi. Le r�sultat est renvoy� dans %eax avec un r�sultat n�gatif �tant l'erreur dont l'oppos� est tranf�r� par la libc dans errno. La pile utilisateur n'est pas modific�e donc n'avez pas besoin d'en avoir une correcte lors de l'appel.

Entr�es/sorties sous Linux

Si vous souhaitez effectuer des entr�es/sorties directement sous Linux, soit il s'agit de quelque chose de tr�s simple qui n'a pas besoin de sp�cificit�s du syst�me et dans ce cas l�, consultez le mini-HOWTO IO-Port-Programming, ou alors vous devez cr�er un nouveau gestionnaire de p�riph�rique et vous devriez alors lire quelques documents sur les m�andres du noyau, le d�veloppement de gestionnaires de p�riph�riques, les modules du noyau, etc. Vous trouverez d'excellents HOWTO ou autres documents du projet LDP.

Plus particuli�rement, si vous souhaitez r�aliser des programmes graphiques, rejoignez le projet GGI: http://synergy.caltech.edu/~ggi/ http://sunserver1.rz.uni-duesseldorf.de/~becka/doc/scrdrv.html

Dans tous les cas, vous devriez plut�t utiliser l'assembleur en ligne de GCC avec les macros provenant des fichiers linux/asm/*.h que d'�crire des sources en assembleur pur.

Acc�der aux gestionnaires 16 bits avec Linux/i386

De telles choses sont th�oriquement possibles (preuve: voir comment DOSEMU permet � des programmes d'acc�der au port s�rie), et j'ai entendu des rumeurs que certaines personnes le font (avec le gestionnaire PCI? Acc�s aux cartes VESA? PnP ISA? Je ne sais pas). Si vous avez de plus amples pr�cisions � ce sujet, soyez les bienvenus. Le bon endroit � regarder est les sources du noyau, les sources de DOSEMU (et des autres programmes se trouvant dans le r�pertoire DOSEMU), ainsi que les sources d'autres programmes bas niveaux (peut-�tre GGI s'il g�re les cartes VESA).

En fait, vous devez utiliser soit le mode prot�g� 16 bits, soit le mode vm86.

Le premier est plus simple � configurer mais il ne fonctionne qu'avec du code ayant un comportement propre qui n'effectue pas d'arithm�tique de segments ou d'adressage absolu de segment (en particulier pour l'adressage du segment 0), � moins que par chance tous les segments utilis�s peuvent �tre configur� � l'avance dans le LDT.

La seconde possiblit� permet d'�tre plus "compatibles" avec les environnements 16 bits mais il n�cessite une gestion bien plus compliqu�e.

Dans les deux cas, avant de sauter sur le code 16 bits, vous devez:

Encore une fois, lisez attentivement les codes sources situ�s dans le r�pertoire de DOSEMU et consorts, en particulier ces mini-�mulateurs permettant de faire tourner des programmes ELKS et/ou des .COM assez simples sous Linux/i386.

5.2 DOS

La plupart des �mulateurs DOS sont livr�s avec certaines interfaces d'acc�s aux services DOS. Lisez leur documentation � ce sujet, mais bien souvent, ils ne font que simuler int $0x21 et ainsi de suite, donc c'est comme si vous �tiez en mode r�el (je doute qu'ils aient de possibilit�s de fonctionner avec des op�randes 32 bits: ils ne font que r�fl�chir l'interruption dans le mode r�el ou dans le gestionnaire vm86).

Certaines documentations concernant DPMI (ou ses variantes peuvent) �tre trouv�es sur ftp://x2ftp.oulu.fi/pub/msdos/programming/

DJGPP est livr� avec son propre sous-ensemble, d�riv�, ou remplacement (limit�) de la glibc.

Il est possible d'effectuer une compilation crois�e de Linux vers DOS. Consultez le r�pertoire devel/msdos/ de votre miroir FTP de sunsite.unc.edu. Voir �galement le dos-extender MOSS du projet Flux d'utah.

D'autres documentations et FAQ sont plus consacr�s � DOS. Nous d�conseillons le d�veloppement sous DOS.

5.3 Windauberies...

Heu, ce document ne traite que de libre logiciel. T�l�phonez-moi lorsque Windaube le deviendra ou du moins ses outils de d�veloppement!

En fait, apr�s tout, cela existe: Cygnus Solutions a d�velopp� la biblioth�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�) ne souhaite pas m'�tendre sur la programmation sous Windaube, mais je suis s�r que vous trouverez tout un tas d'informations partout...

5.4 Votre propre syst�me d'exploitation

Le contr�le sur le syst�me �tant ce qui attire de nombreux programmeurs vers l'assembleur, une pr�misse ou un corollaire naturel de son utilisation est la volont� de d�velopper son propre syst�me d'exploitation. Remarquons tout d'abord que tout syst�me permettant son auto-d�veloppement pourrait �tre qualifi� de syst�me d'exploitation, combien m�me tournerait-il au-dessus d'un autre syst�me sur lequel il se d�chargerait de la gestion du multit�che (Linux sur Mach) ou des entr�es/sorties (OpenGenera sur Digital Unix), etc. Donc, pour simplifier le d�bogage, vous pouvez souhaiter d�velopper votre syst�me d'exploitation comme �tant un processus fonctionnant sous Linux (au prix d'un certain ralentissement), puis, utiliser le Flux OS kit (qui permet l'utilisation des drivers Linux et BSD dans votre propre syst�me d'exploitation) pour le rendre ind�pendant. Lorsque votre syst�me est stable, il est toujours temps d'�crire vos propres gestionnaires de mat�riels si c'est vraiment votre passion.

Ce HowTo ne couvrira pas des sujets comme le code de chargement du syst�me, le passage en mode 32 bits, la gestion des interruptions, les bases concernant les horreurs des processeurs Intel (mode prot�g�, V86/R86), la d�finition de votre format d'objets ou de vos conventions d'appel. L'endroit o� vous pourrez trouver le plus d'informations concernant tous ces sujets est le code source de syst�me d�j� existants.

Un grand nombre de pointeurs se trouvent dans la page: http://www.eleves.ens.fr:8080/home/rideau/Tunes/Review/OSes.html

6. A faire et pointeurs

Signature de l'auteur:

--    ,                                         ,           _ v    ~  ^  --
--
-- Fare -- rideau@clipper.ens.fr -- Francois-Rene Rideau -- +)ang-Vu Ban --
--                                      '                   / .          --
Join the TUNES project for a computing system based on computing freedom!
                 TUNES is a Useful, Not Expedient System
WWW page at URL: http://www.eleves.ens.fr:8080/home/rideau/Tunes/