Il existe évidemment le célèbre Desktop Assembler, disponible dans le circuit commercial pour une somme avoisinant les mille francs, ce qui n'est pas tout-à-fait excessif, au regard des possibilités du logiciel, mais pour la majorité d'étudiants désargentés que comporte la horde innombrable de nos lecteurs, un logiciel du domaine public s'impose. Et il existe: c'est le bien connu as. Si vous ne l'avez pas déjà installé, faites-le. Si vous ne l'avez pas, un bon conseil: procurez-le vous, ou passez à la rubrique suivante...
A présent que vous ètes devant votre ordinateur, avec la présente revue sur les genoux, recopiez scrupuleusement le listing suivant dans un simple fichier-texte, que vous appelerez ``essai'', et surtout, NE PANIQUEZ PAS !, les explications suivent!
;Premier contact avec l'assembleur sur ARM
AREA HELLO,CODE ;Zone principale
ENTRY ;Point d'entree
SWI 1 ;OS_WriteS
DCB "Hello World!",0 ;Chaine a afficher
ALIGN ;adresse multiple de 4
SWI &11 ;OS_Exit
END ;Fin d'assemblage
A présent que vous avez sauvegardé ce fichier-source ``essai'', faites-le compiler par l'assembleur. Pour cela, la démarche varie selon les différents logiciels que vous avez sous la main. Pour as, par exemple, ouvrez une task window et tapez la commande:
as -o essaiobj essaiCe qui lancera la compilation, produisant un nouveau fichier, ``essaiobj'', non exécutable, que vous devez faire suivre par une phase de linkage pour produire un fichier executable.
Pour ce faire, déclenchez le linkeur link de la library du DDE, et draguez sur son icone celle du fichier ``essaiobj''. link vous demandera alors, au moyen d'une boîte de dialogue, le nom que vous voulez donner au fichier exécutable résultant, vous proposant par défaut ``!RunImage''. Changez ce nom affreux en ``essaiexe'' et confirmez . Vous obtiendrez enfin un programme, le fichier exécutable ``essaiexe'', que vous pourrez déclencher en double-cliquant dessus. Une jolie fenêtre s'ouvrira devant vos yeux, vos yeux hagards, affichant:
Hello World ! Press space or click mouse button to exit . . .... c'est alors qu'un sentiment de puissance surhumaine s'emparera de vous: VOUS VENEZ DE FAIRE UN PROGRAMME EN ASSEMBLEUR!
Maintenant, il va falloir comprendre ce que vous avez tapé, tout de même, car là est le but du jeu, sans quoi, jamais vous ne parviendrez à faire ce méga-jeu blasteur de la mort qui vit que vous révez de programmer depuis l'enfance...
Tout d'abord, un minimum de présentation du microprocesseur ARM est nécessaire:
``Quoi... c'est tout ?'', me demandez-vous, le front perlant de sueur.
Et bien oui, c'est tout.
Bon , en fait, c'est un peu plus compliqué que ça mais, à votre niveau actuel, voir la machine de cette façon va vous permettre de prendre un peu de hauteur et d'assurance, en dédramatisant la chose. Plus tard, nous pourrons entrer dans les détails, mais pour le moment, il importe que vous ayez bien à l'esprit le fait que la machine que vous avez l'ambition de programmer n'est qu'un animal stupide qui ne sait faire qu'une trentaine de choses, mais qui les fait extrêmement vite!
A l'intérieur, le micoprocesseur est à lui tout seul un ordinateur en réduction: on y trouve une mémoire interne, appelée ``registres'', qui sert au stockage temporaire de toutes les informations traitées à un moment donné. On y trouve aussi, sans entrer dans les détails, une ``unité de calcul'' qui effectue toutes les opérations possibles sur les registres (addition, etc.), et enfin une ``unité d'entrée/sortie'' qui permet la communication entre les registres du microprocesseur et la mémoire centrale. Il y a d'autres composantes, mais il est inutile d'en parler pour le moment.
Les registres contiennent un mot, autrement dit un nombre entier codé sur 32 bits. Ses valeurs possibles vont donc de 0 à un peu plus de quatre milliards. On dit aussi que le mot est constitué de 4 octets.
Comment retrouver un octet dans cette masse? Par son adresse, qui est un nombre qui représente son numéro d'ordre dans la mémoire. Ce numéro va de 0 à la limite de la mémoire dans la machine. Par exemple, pour une machine avec 8 mégas, cette limite est un nombre un peu supérieur à huit millions (nous y reviendrons ultérieurement).
L'adresse d'un mot, qui est constitué de quatre octets, est l'adresse de son premier octet (Là encore , nous reparlerons ultérieurement de cette notion de ``premier octet''), c'est donc tout naturellement un nombre multiple de 4.
Au niveau de l'assembleur, ces fonctions rentrent dans la catégorie dite des ``interruptions logicielles'', c'est-à-dire des ruptures de séquence qui quitteront momentanément votre programme pour aller dans le système d'exploitation, faire ce pour quoi elles ont été faites, avant de revenir à votre programme, là où elles l'avaient laissé...
Il y en a un sacré paquet, plusieurs centaines, et chacune a un numéro.
Pour guider le logiciel d'assemblage dans son travail, on utilise ce qu'on appelle des ``directives d'assemblage'', qui ne sont pas des instructions, mais des commandes exécutées par l'assembleur au moment de la compilation, et que l'on ne retrouvera plus dans le programme resultant.
C'est vrai, il y a certaines conventions a respecter lors de l'écriture d'un programme en assembleur, conventions tout de même assez simples:
AREA HELLO,CODE ;Zone principale
C'est une directive, qui signale le début d'une zone (``AREA'') à
laquelle je donne le nom ``HELLO'', et qui contient du code.
ENTRY ;Point d'entree
Cette directive signale que, juste après, se situe la première instruction
qu'il faudra exécuter quand on déclenchera le programme. C'est ce qu'on
nomme le ``point d'entrée'' du programme.
SWI 1 ;OS_WriteS
L'instruction SWI appelle le système d'exploitation, et lui demande
d'exécuter la fonction numéro 1. Le commentaire me rappelle que cette
fonction s'appelle ``OS\_WriteS''. Cette fonction va afficher à l'écran
la chaîne de caractères qui suit l'instruction et qui se termine par un
octet nul.
DCB "Hello World!" ,0 ;Chaine a afficher
La directive DCB va permettre d'introduire des octets directement dans
le code du programme, tels quels. Dans ce cas précis, ces octets sont la
chaîne ``Hello World!'' terminée par l'octet nul.
ALIGN ;adresse multiple de 4
Cette directive permet de continuer l'assemblage en calant la prochaine
instruction sur une adresse multiple de 4, car la chaîne de caracteres
incluse juste avant a introduit un décalage qui n'est pas divisible par 4.
Rappelons qu'une instruction, consistant en un ou plusieurs mots-machine, doit
obligatoirement commencer à une adresse multiple de 4, sans quoi, vous allez
au devant de grosses surprises!
SWI &11 ;OS_Exit
Encore une fonction du système d'exploitation! Cette fois-ci, c'est celle
qui porte le numéro &11 (17 en décimal), et qui sert juste à sortir
du programme définitivement, d'où son nom de ``OS_Exit''.
END ;Fin d'assemblage
La dernière directive du listing. Elle dit à l'assembleur qu'il a fini
son travail.
Toutefois, une fois la gueule de bois venue, méditons ensemble sur le chemin qui reste à parcourir, entre l'affichage d'un simple message à l'écran, pour lequel une simple ligne ``PRINT "Hello World !"'' en BASIC aurait suffi, et ces jeux et démos magnifiques que nous finirons par créer et qui démontrerons l'incroyable puissance de notre machine favorite... Il y a encore énormément de choses à aborder, alors...
A bientôt, et BON COURAGE !