6. Comment appeler gcc pour qu'il traite correctement moncode assembleur ?

Contenu de cette section

Assurez-vous d'appeler gcc avec l'option "-O" pour activer les optimisations ainsi que l'assembleur en ligne. Si vous ne l'utilisez pas, votre code peut compiler, mais ne s'exécutera pas convenablement !

Plus généralement, les bonnes options de compilations sur des plate-formes x86 avec gcc sont :

        gcc -O2 -fomit-frame-pointer -m386

Pour optimiser encore plus la génération du code, l'option de compilation -mregparm=2 et/ou la fonction correspondante peuvent être utiles mais peut poser pas mal de problèmes lors de l'édition de liens avec du code externe.

Notez que vous pouvez ajouter ces options en les rendant utilisables par défaut en modifiant le fichier /usr/lib/gcc-lib/i486-linux/2.7.2/specs (ou quelque soit sa place sur votre système).

6.1 gas

gas est l'assembleur GNU, qui est utilisé par gcc.

Où le trouver ?

Vous le trouverez au même endroit que gcc, dans un paquetage appelé binutils.

Qu'est-ce que la syntaxe AT&T

Etant donné que gas a été inventé pour être un compilateur unix 32 bits, il utilise la syntaxe standard AT&T, qui ressemble beaucoup à la syntaxe des assembleurs 680x0. Cette syntaxe n'est pas pire, ni meilleur que la syntaxe Intel. Elle est tout simplement différente. Lorsque vous aurez l'habitude de l'employer, vous la trouverez beaucoup plus régulière que la syntaxe Intel, bien qu'un peu ennuyeuse.

Un programme existe pour vous aider à convertir des programmes écrit avec la syntaxe TASM en une syntaxe AT&T. Récupérez le fichier ftp://x2ftp.oulu.fi/pub/msdos/programming/convert/ta2asv08.zip.

Un fichier gas.doc ou as.doc (pas très loin de l'endroit où vous trouverez gas, si ce n'est dans son paquetage lui-même) décrit la syntaxe.

Vous pouvez le trouver sur les sites ftp suivants :

ftp://sunsite.unc.edu/pub/linux/GCC/
ftp://sunsite.doc.ic.ac.uk/packages/linux/sunsite.unc-mirror/GCC/ (?)
ftp://ftp.ibp.fr/pub/gnu

A nouveau, les sources du système d'exploitation Linux sont de bons exemples. Regardez dans le répertoire linux/arch/i386 les fichiers suivants :

Mode limité 16 bits

gas est un assembleur 32 bits, conçu pour gérer les instructions 32 bits. Il ne gère que partiellement le mode 16 bits, qui consiste à transformer les préfixes 32 bits en instructions, de telle manière que vous écriviez du code 32 bits qui s'éxécute en mode 16 bits sur un processeur 32 bits. Dans les deux modes, il gère l'utilisation des registres 16 bits mais l'adressage 16 bits n'est pas supporté. Utilisez les directives code16 et code32 pour basculer d'un mode à l'autre. Remarquez que l'instruction assembleur en ligne

asm("code16\n")
autorisera gcc (32 bits) à générer du code qui s'exécutera en mode réel ! Vous êtes libres d'ajouter une gestion complète 16 bits si vous en avez besoin.

6.2 GASP

gasp est le préprocesseur gas. Il permet l'utilisation des macro-commandes ainsi que certaines syntaxes sympathiques de gas.

Où trouver gasp ?

Je ne sais pas vraiment. Regardez dans les répertoires du projet GNU (prep.ai.mit.edu et miroirs). Peut-être avec gas dans le paquetage binutils ?

Comme ça marche ?

Aucune idée ! Mais c'est livré avec sa propre documentation en texinfo donc vous avez juste à l'imprimer ou à les consulter... En ce qui me concerne, ça ressemble à un macro-assembleur.

6.3 AS86

as86 est un assembleur pour 80x86, à la fois 16 et 32 bits, qui fait partie du Bruce Evans' C Compiler (BCC). Il utilise en grande partie la syntaxe Intel, bien qu'exprimant les modes d'adressage d'une manière différente.

Où récupérer as86 ?

Une version complètement dépassée de as86 est distribuée par HJLu pour arriver à compiler le noyau Linux, dans un paquetage appelé bin86 (à l'heure actuelle, version 0.3), disponible dans n'importe quel répertoire GCC pour Linux. Mais je ne conseille à personne de l'utiliser pour autre chose que pour compiler Linux. Cette version ne supporte qu'un format de fichier minix modifié, et possède certaines erreurs avec le mode 32 bits. Donc, ne vous en servez que pour compiler Linux.

Les versions les plus récentes sont diffusées avec la distribution FreeBSD. Je les récupère dans ftp://ftp.ibp.fr/pub/FreeBSD/packages-2.1/development/bcc-95.3.12.tgz. Mais le chemin peut être fonction de votre miroir et la version peut avoir changée. En autre chose, il gère le format Linux a.out et vous pouvez donc effectuer une édition de liens avec d'autres programmes existant, et/ou utiliser les outils standards du paquetage binutil pour manipuler vos données. Cette version peut co-exister sans aucun problème avec la version précédente.

La version de bcc du 12 mars 1995 ainsi que les version antérieur ont un petit problème qui rend tous les segments empilés ou dépilés 16 bits, ce qui est assez ennuyant lorsque l'on développe en mode 32 bits. Un patch est diffusé dans le projet Tunes : http://www.eleves.ens.fr:8080/home/rideau/Tunes/ puis files/tunes.0.0.0.25.src.tgz ou le sous-répertoire LLL/i386/ sous forme décompressée. Ce patch est également disponible via http://www.eleves.ens.fr:8080/home/rideau/files/as86.bcc.patch.gz. Bruce Evans a accepté ce patch donc s'il existe une version plus récente de bcc quelque part, ce patch devrait être inclu...

Note pour les utilisateurs de Dos (?) :

Où trouver de la documentation ?

Les documentations sont inclues dans le paquetage bcc. Les pages de manuels sont également disponibles quelque part sur les sites FreeBSD. Dans le doute, les sources sont bien souvent de très bonnes sources de documentation : ce n'est pas très bien commenté mais le code est propre. Vous devriez jeter un coup d'oeil pour voir comment as86 est utilisé dans Tunes 0.0.0.25...

Comment appeler l'assembleur ?

Voici l'entrée dans le Makefile GNU pour permettre à bcc de transformer les fichiers assembleurs .s en objets a.out et .o ainsi qu'en listing .l :


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

Supprimez les %.l, -A-l et -A$*.l si vous ne voulez pas les listings. Si vous voulez autre chose que du format a.out, alors consultez la documentation de bcc pour connaître les autres formats gérés ou utilisez le programme objcopy du paquetage binutils.

Que faire si je n'arrive plus à recompiler Linux avec cette nouvelle version ?

Linus étant particulièrement surchargé par le courrier, mon patch pour compiler Linux avec un as86 a.out n'a pas du lui parvenir... Maintenant, cela ne devrait pas être vraiment important : conservez votre as86 du paquetage bin86 dans le répertoire /usr/bin, et installez le bon programme as86 comme étant /usr/local/libexec/i386/bcc/as. Vous n'aurez en fait jamais a appeler directement ce programme car bcc fait tout seul ces opérations, dont la conversion en a.out Linux lorsqu'il est appelé avec les bonnes options. Donc, on peut assembler des fichiers uniquement en utilisant bcc comme un frontend et pas en utilisant directement as86.

6.4 Les autres assembleurs

Ce sont d'autres possibilités dans le cas où les précédentes ne vous conviennent pas (pourquoi donc ?) que je ne vous recommande pas dans un cas normal mais qui peut s'avérer utile si l'assembleur fait partie de ce que vous ètes en train de concevoir (par exemple un système d'exploitation ou un environement de développement).

Assembleur Win32Forth

Win32Forth est une solution 32 bits *libre* FORTH qui tourne sans problème sous Win32s, Win95, Win/NT. Il inclue un assembleur 32 bits (avec une syntaxe pré-fixe ou post-fixe). Le traitement des macros est effectuée par le langage FORTH, mais le seul contexte utilisable en entrée ou en sortie est Win32For. Vous pouvez le trouver à l'adresse ftp://ftp.forth.org/pub/Forth/win32for/.

NASM

Il s'agit du Netwide Assembler, écrit en C, qui devrait être suffisement modulaire pour gérer toutes les syntaxes et les formats connus.

La version actuelle tourne bien, mais seulement sur de la syntaxe très simple, et pour générer uniquement du binaire. Aucun traitement de macros est intégré.

NASM évolue trop vite pour que ce document soit à jour. Toutefois, n'attendez pas à ce que cet assembleur implémente toutes les caractéristiques à moins que vous ne donniez un coup de main pour les implémenter. Consultez http://www.dcs.warwick.ac.uk/~jules/nasm1.html.

Tunes

Le projet OS Tunes développe son propre assembleur sous la forme d'une extension du langage Scheme, comme étant une partie de son processus de développement. Toutefois, il ne tourne pas d'une manière satisfaisante actuellement. Il est fort probable qu'un peu d'aide serait la bienvenue.

Cet assembleur manipule des arbres de syntaxe symboliques , donc il pourrait aussi bien servir pour un traducteur de syntaxe assembleur, un désassembleur, un compilateur/assembleur, etc. Voir http://www.eleves.ens.fr:8080/home/rideau/Tunes/.

Assembleurs non libres et non 32 bits pour x86.

Vous en saurez plus à ce sujet en lisant les bases de la programmation x86 dans la FAQ de Raymond Moon du forum Usenet comp.lang.asm.x86 : http://www2.dgsys.com/~raymoon/faq/asmfaq.zip.


Chapitre suivant, Chapitre Précédent

Table des matières de ce chapitre, Table des matières générale

Début du document, Début de ce chapitre