jeudi 20 novembre 2014

Les tables [fr]

Alors, Alain Thellier et moi avons eu un petite discussion par email il y a peu : il me demande de commencer à expliquer un petit programme...

Arg, c'est encore un peu tôt : en effet, il y a un minimum de théorie à connaître avant... Pour l'instant, vous commencez à avoir une idée bien plus précise de la programmation en asm : dans les très grandes lignes, c'est déjà plus clair je suppose. Encore quelques leçons, et il vous sera possible d'afficher un "Coucou, c'est moi !" sur un cli et surtout de bien comprendre comment ce tout petit programme fonctionne, ce qui est le plus important bien sûr !

Vous constaterez aussi la simplicité d'utilisation de certaines routines du Kickstart... Pourquoi tous les coders Amiga Classics sont partis sur d'autres plate-formes bien plus complexes à programmer ? Zarbi tout ça... En tout cas, moi je reste ! Et puis tiens, je me décrète Capitaine du navire coulant Amiga Classic et je ne bouge pas d'un poil !

Nous allons continuer aujourd'hui avec l'explication des tables. Alors, là encore c'est très simple, il n'y aucune difficulté.

Les tables sont une suite de données, et rien d'autres !


Il existe plusieurs types de tables :
1. Les tables de données .b/.w/.l
Ce sont des chiffres de divers formats et précédées d'un "dc.b", "dc.w" ou "dc.l". J'ignore ce que signifie dc, peut-être data constant, à vérifier... Bref, dc permet d'indiquer à l'assembleur que ce sont des nombres qui vont être utilisés ensuite. Ce n'est donc pas une mnémonique, juste une indication pour Phxass. Les chiffres seront stockés l'adresse/label __maTable tels quels, sans rien d'autre avant ni après.

Un petit exemple est toujours bien plus parlant et qui aide beaucoup à mieux comprendre :

L'adresse de __maTable est donc dans a0 et donne sur une série de nombres. Ensuite, les trois move vont nous donner $12345678.l dans d0, $AABB.w dans d1 et $FF.b dans d2. Notez que les ; servent juste à indiquer des commentaires que vous voulez afin d'expliquer votre code pour plus de clarté future : très utile voire indispensable lorsque vous reviendrez fouiner dans vos sources plusieurs semaines ou mois après...

2. Les tables d'adresses absolues
Cette fois, ce sont des labels (donc des adresses, et donc des données en fait) que nous pouvons mettre dans une table. Ces autres tables ont la particularité d'être toujours en 32 bit (.l) puisque ce sont des adresses : dc.l obligatoire !

L'éternel petit exemple bien venu :

Le premier "dc.l _MyRoutine_1" va donc contenir l'adresse _MyRoutine_1 tout simplement. Et ainsi de suite pour les autres. Le nop est une nouvelle mnémonique abordée ici qui signifie no operation, c'est à dire qu'elle ne fait aucun calcul, elle cycle juste dans le vide.

3. Les tables de caractères
Ce sont des tables qui servent pour tout ce qui est textuel :

Pour cet exemple, la __TableCaracteres est directement créée de caractères alphabétiques qui forment une phrase, le tout entre guillemets et terminé par un 0 indiquant la fin de la phrase/table. La seconde est identique avec son codage ASCII, c'est à dire sa transcription en nombres hexadécimales, chaque lettre étant codée sur 8 bits (.b) !

4. Les tables d'adresses relatives
Voilà la relativité qui arrive sur le blog : c'est selon moi une des forces et avantages du 68k sur d'autres CPUs qui en sont dépourvus, nous y reviendrons plus tard pour d'autres cas cette fois intégrés dans les transistors de tous les 68000+...

En fait, ce sont toujours des adresses mais relatives à un point d'entrée. Nous y reviendrons avec un important article spécial à venir sur cette fameuse relativité.


5. Les tables de bra/jmp
C'est un cas un peu particulier : ce sont des tables faites de mnémoniques bra ou alors jmp. Là encore, nous y reviendrons prochainement puisqu'il en sera question avec le futur petit programme cli qui affichera "Coucou, c'est moi !"...


Voilà encore un article important sur votre cheminement de l'assembleur, les tables étant utilisées souvent, et ce dans tous les programmes Amiga quels qu'ils soient.