Le cross-assembleur de rêve: vasm !
Par Thomas Reiss le mercredi 5 mars 2008, 00:29 - Oldschool - Lien permanent
Il y a des soirs comme ça qui réservent plein de surprises !
Ce soir, sans trop y croire, j'ai jeté un oeil à vasm de Frank Wille, déjà auteur de PhxAss, un assembleur pour Amiga très performant, quasi 100% compatible avec Devpac, mais malheureusement absolument pas portable car écrit lui-même en assembleur.
Puis est venu vasm pour offrir un assembleur au compilateur vbcc du Dr. Volker Barthelmann. Cet assembleur est capable de générer du code pour différents processeurs, dont la série des 680x0 de Motorola. Avec son copain vlink, l'éditeur de lien, on peut générer des exécutables pour Amiga ou Atari ST (avec les symbôles siouplé !). La dernière fois que j'ai regardé, il manquait le support des macros, et contacté à ce sujet, Frank Wille m'a répondu que c'était l'affaire d'une soirée ou deux.
Un an est passé.. Et Frank Wille a donc passé une soirée sur vasm et a implémenté le support des macros !
Partons donc pour une petite description de la procédure de compilation sous Linux et un brin de mise en oeuvre.
Présentons
L'assembleur vasm a donc été créé par Frank Wille spécialement
pour le compilateur vbcc. L'assembleur supporte non seulement les
processeurs de la famille M68k de Motorola - et apparemment les ColdFire de
Freescale -, mais peut également générer du code pour processeurs x86, PPC,
ARM, 6502 et un CPU que je ne connais pas. Il dispose en plus de cela de
plusieurs modules de sortie, permettant de générer des fichiers objets pour le
l'éditeur de liens vlink (format vobj), des
hunk (format hunk) Amiga, des fichiers au standard ELF
(format elf, un fichier texte de sortie permettant de valider la
sortie de l'assembleur (format test, par défaut) ou encore au
format binaire (format bin).
Le l'éditeur de lien vlink est l'outil qui va nous permettre de
passer d'un fichier objet vobj à un exécutable Atari TOS, ou pour
Amiga mais vasm permet déjà de générer directement un exécutable Amiga (le
fameux format Amiga Hunk).
Compilons
Tout d'abord, il faut récupérons les sources de vasm et vlink sur le site de Frank Wille :
On désarchive le contenu des deux fichiers téléchargés (au format tar.gz) quelque part et on y va !
vlink
La compilation de cet élément est très simple. On se positionne dans le
répertoire des sources de vlink et on crée un répertoire
objects, qui contiendra tous les fichiers issues de la
compilation, et on lance la compilation de la manière la plus traditionnelle
qui soit :
cd vlink mkdir objects make
Ces opérations vont générer un exécutable vlink que l'on
installera
là où l'on souhaite à la main
(man
cp).
vasm
La compilation de vasm nécessite quant à elle d'ajuster quelques variables,
mais le principe est le même. On va reprendre le fichier fichier
Makefile et ajouter les lignes suivantes en tête de fichier, afin
de générer un assembleur pour processeur M68k utilisant la syntaxe Motorola. Le
fichier ressemblera à ça :
# Unix CPU = m68k SYNTAX=mot TARGET = CC = gcc COPTS = -c -O2 LDFLAGS = -lm RM = rm -f include make.rules
On notera que l'on laisse la variable TARGET vide, cela nous
évite de devoir faire une flopée de répertoires, vu que nous ne souhaitons
avoir qu'une seule version de l'assembleur. Comme pour vlink, on
crée un répertoire destiné à accueillir les fichiers objets issues de la
compilation, mais il s'appellera cette fois obj, puis on lance la
compilation :
cd vasm mkdir obj make
Et voilà ! Un exécutable vasmm68k_mot a été généré !
On le renommera éventuellement.
Essayons
Pour tester, nous supposerons que les deux exécutables sont accessibles,
donc dans un répertoire accessible par le biais de la variable shell
$PATH.
On commence par créer un source de test intelligemment appelé test.s, comme ceci :
Pterm0 macro
clr.w -(sp)
trap #1
endm
Puts macro
pea \1
move.w #9,-(sp)
trap #1
endm
Puts chaine
Pterm0
chaine dc.b "Hello, world", 10, 13
even
On va dans un premier temps l'assembler avec le module de sortie test et examiner la sortie. Ce qui nous donne :
tom@clementina:~/Sources/vasm$ ./vasmm68k_mot -Ftest -o test.lst test.s vasm 1.2b (c) in 2002-2007 Volker Barthelmann vasm M68k/ColdFire cpu backend 0.9c (c) 2002-2007 Frank Wille vasm motorola syntax module 2.5 (c) 2002-2007 Frank Wille vasm test output module 1.0 (c) 2002 Volker Barthelmann
Et le contenu du fichier test.lst généré :
Sections: section CODE (attr=<acrx> align=2): 00000000: data(4): 48 7a 00 0c 00000004: data(4): 3f 3c 00 09 00000008: data(2): 4e 41 0000000a: data(2): 42 67 0000000c: data(2): 4e 41 0000000e: symbol: chaine LAB (14) sec=CODE 0000000e: data(12): 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 0000001a: data(1): 0a 0000001b: data(1): 0d 0000001c: space(0,fill=00) Symbols: chaine LAB (14) sec=CODE
Ce qui ne m'aide plus vraiment, car je n'ai connais pas les opcodes du 68000 par coeur.. Denis ??? Bon, il n'est pas là, on va générer un exécutable au format Atari TOS. Un peu rapidement et sans détailler, voici les deux étapes de la compilation (vasm et vlink) suivi d'une petite vérification de routine :
tom@clementina:~/Sources/vasm$ ./vasmm68k_mot -Fvobj -o test.o test.s vasm 1.2b (c) in 2002-2007 Volker Barthelmann vasm M68k/ColdFire cpu backend 0.9c (c) 2002-2007 Frank Wille vasm motorola syntax module 2.5 (c) 2002-2007 Frank Wille vasm vobj output module 0.4 (c) 2002-2006 Volker Barthelmann tom@clementina:~/Sources/vasm$ ./vlink -b ataritos -o test.prg test.o tom@clementina:~/Sources/vasm$ file test.prg test.prg: Atari ST M68K contiguous executable (txt=28, dat=0, bss=0, sym=14)
On déplace l'exécutable test.prg dans le répertoire faisant office de disque dur virtuel à Steem, et on lance toute la machine !! Ouf, le message Hello, World est bien affiché !
Concluons
Je suis allé très vite, sans vraiment détailler l'utilisation de vasm et de vlink, et surtout, je n'ai fait qu'un simple test de rien du tout. Il faut cependant bien avoir à l'idée que vasm a été conçu pour être indépendant de l'architecture de la machine hôte (celle qui assemble), et notamment n'est pas sensible à ces histoires de grand et petit indien -big ou little endian pour ceux qui ne suivent pas - et du moins tant qu'on ne lui fait gober n'importe quoi comme fichier en inclusion binaire.
En utilisant PhxAss sur Amiga, j'avais noté une incompatibilité notable avec
Devpac, c'est la manière dont est géré le symbôle *, qui
représente soit l'adresse de l'instruction courante, soit l'adresse de
l'instruction suivante. Donc pour ceux qui ont l'habitude de Devpac et qui
passe sur vasm, faites attention à cela.
Je tâcherai de pousser un peu plus les tests pour voir ce qu'il est nécessaire d'adapter.
- Site de vasm
- La documentation en ligne de vasm
- La même sous forme de fichier PDF





Commentaires
oui le code hexa est correct par contre dans ton source tu as oublie la correction de pile apres ton print :p
Tu vas pouvoir coder au boulot !!!
Denis: arg ! ça promet pour la suite !
Xerus: ben là pas le temps...
Ah oui, vasm ne supporte pas REPT/ENDR ! :-(
ben c'est open source, donc tu sais ce qu'il te reste a faire ;-)
Oui, j'ai bien envie de m'y coller ! :)
ouais ps de promesse que tu tiendras pas !
pas de rept/endr???? fini les optimisations pour les demos :)
Allez mon poulet, tu peux le faire :)
bah au pire tu fais un script shell/perl/java?/python/ruby qui parse ton source et qui duplique pour toi les zones en rept :p
bourrin power !!
en cherchant bien j'ai un script perl qui fait du formattage de source asm, typiquement pour traiter du code desassemble tout moche... et c'est grace a ca que la my galaxy a ete sauvee d'une mort atrocement precoce
Ton script m'intéresse tiens :)
Mais je commencerai déjà par un script effectivement vu que je n'ai pas eu le temps de continuer ma bidouille pour avoir rept/endr.
Ce qui m'embête beaucoup, c'est la licence de vasm qui est tout sauf libre !! Alors je tâcherai de faire ce patch et de le rendre public, mais vu la licence, ce n'est clairement pas une bonne idée d'investir plus dessus.
Enfin heureusement, on peut l'utiliser !
vasm supporte REPT/ENDR depuis V1.3! :)
Danke Schön Frank. Ich will es probieren ;)