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 principaleC'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'entreeCette 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_WriteSL'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 afficherLa 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 4Cette 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_ExitEncore 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'assemblageLa 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 !