0a – Introduction au langage assembleur

Si comme moi vous êtes un programmeur de langages classiques (procédural/orienté objet), l’assembleur peut dans un premier temps faire peur. Néanmoins ne vous inquiétez pas, c’est simplement une autre façon de programmer, en plus nous avons de la chance, l’assembleur 68000 est réputé être un assembleur simple (plus simple que le x86).

L’assembleur est un langage dit bas-niveau, il est donc très proche du langage machine. Il n’existe pas comme en C ou C++ un standard de programmation, le langage assembleur est spécifique à chaque processeur, ainsi du code écrit pour un processeur type x86 (Intel ou AMD de nos PC modernes) ne sera pas compatible avec un processeur Motorola 68k (j’abrégerais en m68k pour le reste du cours).

En assembleur, nous travaillerons essentiellement en hexadécimal, prévoyez donc crayon et papier quand vous codez !

Variables

Si vous êtes un amoureux des variables avec des noms longs ou incompréhensibles (aa, bb, cc ou ageDeLutilisateur), vous allez être servis ! En assembleur, nous n’utiliseront pas de noms pour les variables, en effet, nous allons directement stocker des valeurs dans ce que l’on appelle des registres.

Comme nous sommes des petits chanceux, le m68k dispose de deux registres : un registre de 8 données de 32 bits (qui auront l’appellation de D0 à D7), un registre de 7 adresses de 32 bits (qui auront l’appellation de A0 à A6). Pour faire simple, c’est comme si on avait des variables D0, D1… et des pointeurs A0, A1…. C’est donc dans cet espace que nous allons stocker nos variables. Nous verrons plus tard qu’en choisissant l’Amiga, nous avons droit à pléiades d’autres registres dits « chips » étant spécifiques aux puces custom de l’Amiga.

Toujours à propos des variables, fini les types de variables complexes, en assembleur nous disposons de trois types de variables :

  • Un octet : on utilise 8 bits
  • Un mot (word) : on utilise 16 bits
  • Un long mot (long word) : on utilise 32 bits

Qu’est ce que veux dire tout cela ? Cela veux dire que nous allons soigneusement choisir la taille de nos variables selon leurs valeurs binaires.

Exemple : en C++, on déclare un entier avec int pour stocker la valeur 10. En C++, un entier prends 32 bits de mémoire, sa représentation binaire sera :
00000000000000000000000000001010
Si on regarde un petit peu, on se rends compte que pleins de 0 ne servent à rien et prennent de la place pour rien !
Sur Amiga, nous n’allons pas gaspiller inutilement de la RAM, on va donc déclarer notre valeur 10 dans un octet, ce qui est largement suffisants, sa valeur binaire sera alors :
00001010
On remarque tout de suite qu’on arrive à économiser pas mal de place !

Instructions

Depuis la nuit des temps, il subsiste chez les développeurs un débat sur le formatage de code : dans un if, l’accolade on la met sur la même ligne ou à la ligne ? En assembleur le débat ne se pose plus, comme le débat sur le else d’ailleurs. Le bout de code suivant est simple, si le click gauche de la souris est enfoncé et on va à l’instruction waitmouse :

waitmouse:
    btst #6, $bfe001
    bne waitmouse
    rts

Si on prends ligne par ligne
waitmouse : c’est ce que l’on appelle un label, c’est un repère dans le code auquel on peut faire référence (comme pour utiliser l’instruction GOTO en basic
btst : on va tester si la valeur du bit 6 à l’adresse bfe001 est à 1
bne : c’est l’action qui va être faite si l’instruction précédente est égale à false
rts : c’est un équivalent de return
En basic: ce bout de code assembleur correspondrait à celà (en imaginant que maValeur est égal à un pointeur vers le bit 6 de l’octet à l’adresse bfe001) :

waitmouse:
    z is boolean
    z = (maValeur == true)
    if z == false
        GOTO waitmouse
    endif
    return

Je ne détaillerai pas toutes les instructions de comparaisons disponibles sur le m68k, ici vous avez un exemple simple de comparaison de variables.

Conclusion

Vous avez donc un rapide aperçu de ce à quoi ressemble l’assembleur, alors oui c’est relativement déroutant, mais ce n’est qu’une question d’habitude, comme quand on débute et que l’on doit arriver à correctement lire les instruction if, else, switch ect…

Dans le prochain chapitre, nous parlerons des chips spécifiques à l’Amiga et à quoi ils servent !