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
-O2
est le bon niveau d'optimisation à utiliser.
Le fait d'utiliser un niveau d'optimisation supérieur
produit un code qui est beaucoup plus important,
mais seulement un peu plus rapide : de telles
optimisations massives peut être utiles uniquement pour
de courtes boucles (s'il y en a), que vous pourriez éventuellement
faire en assembleur de toute manière. Si vous avez besoin de
telles optimisations, faîtes les uniquement pour les quelques routines
qui en ont besoin.
-fomit-frame-pointer
autorise le code généré à
ne pas gérer la maintenance particulièrement
stupide des frame pointers, ce qui rend ainsi le code plus
rapide et plus petit. Cette option permet également de libérer
un registre pour des optimisations supplémentaires.
Cette option toutefois réduit la facilité d'utilisation des
outils de débogage (comme gdb
), mais lorsque vous les
utilisez, la vitesse et la taille du programme sont peu importants.
-m386
génère un code plus compacte, sans que l'on
puisse mesurer une réelle perte de performance (vous pouvez remarquer
que plus le code est petit, moins il y a d'opération d'entrées sorties
sur disque et que donc l'exécution est plus rapide).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).
gas
est l'assembleur GNU, qui est utilisé par gcc
.
Vous le trouverez au même endroit que gcc
, dans un paquetage
appelé binutils
.
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 :
kernel/entry.S
kernel/head.S
boot/compressed/head.S
mathemu/*.S
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.
gasp
est le préprocesseur gas
. Il permet
l'utilisation des macro-commandes ainsi que certaines syntaxes sympathiques
de gas
.
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
?
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.
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.
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 (?) :
POSIX_HEADERS_MISSING
;
bcc
/as
, si vous n'utilisez pas
djgpp
, vous devrez renomer la variable
"far" dans la fonction mcall()
du fichier mops.c
,
car certains compilateurs Dos pensent que "far" est un mot
réservé. Notez que vous devez réaliser l'édition de lien avec
typeconf.obj
du répertoire bcc/ld
...
bcc
/ld
, vous devrez avoir une copie des
fichiers d'en-tête a.out.h
et ar.h
.
djgpp
les possède mais d'autres compilateurs C
peuvent demander à ce que vous les récupériez
(sous Dos, Linux, VSTa, etc).
bcc
/ld
, vous devez définir la macro
BSD_A_OUT
pour tous les fichiers, et éditer le fichier
writebin.c
pour qu'il définisse STANDARD_GNU_A_OUT
et
ainsi inclure une copie du fichier a.out.h
Linux
avec un nom Dos utilisanle ;
a.out.h
Linux inclue à son tour
le fichier asm/a.out.h
, donc vous devez vous
arranger à ce qu'il soit inclus également. Les compilateurs
16-bit demandent à ce que vous éditiez le
fichier asm/a.out.h
pour modifier un champ sur 24 bits
en un ensemble de champs de moins de 24 bits (ld
ne sait
pas se servir de ce champ).
cc1
, mais il devrait être capable
de le compiler également si vous voulez l'utiliser. Toutefois, vous
devrez re-écrire une partie de bcc
(le frontend),
ou bien utiliser cc1
directement car il se base sur
le triptique fork(),exec()
et wait()
pour
lancer cc1
, as
, et ld
lors de la
compilation.
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
...
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
.
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
.
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).
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/.
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.
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/.
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