``Hello World!''

Acte Zéro! Car cet article de notre rubrique Assembleur est juste destiné à permettre une simple prise de contact avec l'ARM, qui donne sa puissance à notre cher RISC PC...

Je tape mon premier listing...

... et pour commencer, comme il est évident que l'assembleur est un langage qui ne peut s'apprendre que par la pratique, il vous faut un logiciel d'assemblage sur votre machine, pour vous permettre de compiler, et donc de faire fonctionner les listings que je mettrai dans mes articles.

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 essai
Ce 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...


Qu'est-ce que j'ai tapé?

C'est ce que nous allons tenter d'expliquer aussi clairement que possible dans l'espace restreint alloué à cet article.

Tout d'abord, un minimum de présentation du microprocesseur ARM est nécessaire:

Je jette un coup d'oeil à la bête

La bébête

La bébête qui habite la machine est, sachez-le, un microprocesseur, c'est-à-dire un appareil qui va passer son temps à prendre des données dans la mémoire, à les traiter (d'où son nom, qui vient du mot anglais ``to process'', ``traiter''), et à les renvoyer à la mémoire .

``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

La ``mémoire interne'', donc, est constituée par les registres, et elle n'est pas très étendue, puisque le nombre de registres avec lesquels on peut travailler à un instant donné est de 16, seulement. Nous verrons ultérieurement que certains registres ont un rôle particulier dans le fonctionnement de la machine.

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.

La mémoire centrale de l'ordinateur

Toutes les données, tous les programmes présents dans l'ordinateur sont logés là-dedans, et ça fait du monde, puisque les configurations minimales, en ce milieu des années 90, contiennent 8 méga-octets, environ 8 millions d'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.

Les instructions du microprocesseur

Ce sont les ``atomes'' composant un programme. Elles sont les ordres élémentaires permettant au microprocesseur de savoir quoi faire à un instant donné. Elles se présentent en mémoire comme des files de nombres et sont codées sur un ou plusieurs mots de 32 bits. Le microprocesseur les exécute les unes après les autres, dans l'ordre dans lequel il les trouve en mémoire. Il y a plusieurs sortes d'intructions: Nous verrons qu'il y a en fait un nombre très maigre d'instructions, et c'est ce qui donne son nom au RISC PC: ``Reduced Instruction Set Computer''. Pourtant, n'oubliez pas que c'est avec ces quelques instructions de base que sont créés ces logiciels superbes que vous utilisez quotidiennement...

Les fonctions du système d'exploitation

En plus du misérable quarteron d'instructions que vous avez à votre disposition pour programmer, les gars de chez ACORN vous ont pondu une merveille de système d'exploitation offrant, toutes cuites, des dizaines de fonctions, directement appelables depuis l'assembleur, qui nous permettront sans nous casser la tête à réinventer la roue d'imprimer, d'afficher, de lire, de dessiner, etc. Le ``système d'exploitation'', en effet, c'est le programme en mémoire morte que le microprocesseur se met à exécuter dès la mise sous tension de l'ordinateur, et qui fait tout démarrer. Il est à votre disposition, servez-vous en!

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.


Et maintenant, j'examine le listing

Hmm... Il y a la syntaxe de l'assembleur!

Avant d'être un programme exécutable, votre listing est un texte pur. Il convient de le traduire en langage-machine, autrement dit une suite de mots (nombres entiers de 32 bits), qui sont les codes des instructions. Le logiciel qui s'occupe de cette traduction est le programme d'assemblage, encore appelé couramment assembleur. En sortie, vous ne reconnaîtrez plus ce que vous avez tapé: il n'y a plus rien de clair pour les êtres humains, ni de commentaires.

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:

Miracle! Je comprends tout!

Reprenons point par point les lignes du programme que nous avons tapé précédemment...
        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.

Méditation en guise de conclusion

Voilà, nous venons de créer entièrement du début à la fin notre premier programme en assembleur ARM! Ca se fête, allons nous saouler la gueule dans un bar!

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 !

Retour au sommaire