Liste des cours‎ > ‎

Assembleur (23 janvier)

Maintenant que votre nano-processeur fonctionne, il faut pouvoir le programmer. À cette fin, vous allez écrire un assembleur, c'est-à-dire un programme qui transforme des mnémoniques (aussi appelés langage d'assemblage, ou assembleur) en format binaire compréhensible par le processeur.

Première version

Format du fichier d'entrée

Le fichier attaché "test.s" présente les différentes caractéristiques que devront avoir la première version de votre assembleur :
  • Les commentaires commencent par un ";" et se terminent à la fin de la ligne.
  • Une ligne peut avoir une ou plusieurs définitions de labels commençant par ":". Ces labels peuvent être utilisés par la suite, ou même avant leur définition.
  • Toutes les instructions sont écrites en majuscules et prennent un argument, y compris "NOP". Cet argument, qui sera ignoré pour "NOP", déterminera ce qui est stocké en mémoire à l'adresse suivant le "NOP" lui-même, comme pour les autres instructions.
  • Le mnémonique ".db" indique qu'on stocke la valeur indiquée par la suite en mémoire à l'adresse courante.

Format du fichier de sortie

Tous les nombres du fichier de sortie doivent être écrits en hexadécimal. Les espaces sont équivalents aux retours à la ligne. Le fichier peut contenir soit des nombres précédés de "@" qui indiquent l'adresse à partir de laquelle on stockera les données, et les autres constituent les données. On peut écrire des commentaires entre "/*" et "*/".

Le fichier attaché "verif.dat" donne un exemple (correspondant au passage de "test.s" à travers un assembleur) d'un tel fichier.

Conseils de stratégie

Il est conseillé de définir une classe "Label", dont le constructeur prend un nom de label en paramètre, contenant :

  • le nom du label ;
  • sa valeur, une fois qu'elle est définie ;
  • un ensemble d'endroits en mémoire où ce label est utilisé et où sa valeur devra être substituée.

La redéfinition d'un label devra lever une exception, ainsi que la consultation de sa valeur si celle-ci n'a pas été définie.

De plus, l'assembleur aura besoin de stocker un certain nombre d'informations dans sa classe principale "Assembleur" :

  • l'état de la mémoire, sous la forme d'un tableau ;
  • l'index courant dans la mémoire, pour savoir où on doit écrire les valeurs suivantes au fur et à mesure qu'on assemble ;
  • l'ensemble des labels connus, indexés par leur nom, afin de pouvoir les manipuler.

Les différentes phases du processus d'assemblage seront donc :

  • initialisation de la mémoire, de l'index et des labels à l'état initial ;
  • analyse des lignes du fichier d'entrée au fur et à mesure, avec remplissage de la mémoire et des informations concernant les labels ;
  • résolution des références à des labels par modification de la mémoire aux endroits idoines ;
  • écriture du fichier de sortie au bon format.

Exécution

Votre assembleur devra prendre deux arguments sur la ligne de commande : le nom du fichier source, contenant les mnémoniques en assembleur, et le fichier destination, que vous produirez, et qui contient au format indiqué plus haut la carte mémoire destinée au nano-processeur.

Votre programme principale devra se trouver dans la classe "Assembler" du package "fr.enst.nano".

ċ
chicken.s
(6k)
Samuel Tardieu,
16 déc. 2011 à 01:33
ċ
test.s
(4k)
Samuel Tardieu,
14 déc. 2011 à 01:45
ċ
verif.dat
(1k)
Samuel Tardieu,
14 déc. 2011 à 01:51
Comments