• Aucun résultat trouvé

10 Micro-processeur LC-

11.1 Programmation en assembleur

La programmation en langage machine est rapidement fastidieuse. Il est inhumain de se souvenir du codage de chacune des instructions d’un micro-processeur même simplifié à l’extrême comme le LC-3 et a fortiori encore plus pour un micro-processeur réel. Le langage d’assemblage ou assembleur par abus de langage rend la tâche beaucoup plus facile même si cette programmation reste longue et technique.

L’assembleur est un programme qui autorise le programmeur à écrire les instructions du micro-processeur sous forme symbolique. Il se charge de traduire cette écriture symbolique en codage hexadécimal ou binaire. Il est beaucoup plus aisé d’écrire ADD R6,R1,R2 plutôt que 0x1C42 en hexadécimal ou encore 0001 1100 0100 0010 en binaire.

L’assembleur permet aussi l’utilisation d’étiquettes symboliques pour désigner certaines adresses. L’étiquette est associée à une adresse et peut alors être utilisée dans d’autres instructions. On peut par exemple écrire un morceau de code comme ci-dessous.

...

label: ADD R6,R1,R2 ...

BRz label ...

L’étiquette label est alors associée à l’adresse ou se trouvera l’instruction ADD R6,R1,R2 lors de l’exécution du programme. Cette adresse est alors utilisée pour calculer le codage de l’instruction BRz label. Comme le codage de l’instruction BR contient un offset, l’assembleur calcule la différence entre les adresses des deux instructions ADD R6,R1,R2 et BRz label et place cette valeur dans les 9 bits de poids faible du codage de BRz.

11.1.1 Syntaxe

La syntaxe des programmes en assembleur est la même pour tous les assembleurs à quelques détails près.

Les instructions d’un programme en assembleur sont mises dans un fichier dont le nom se termine par l’extension .asm. Chaque ligne du fichier contient au plus une instruction du programme. Chaque ligne est en fait divisée en deux champs qui peuvent chacun ne rien contenir. Le premier champ contient une étiquette et le second champ une instruction. L’instruction est formée de son nom symbolique appelé mnémonique et d’éventuel paramètres.

Les espaces sont uniquement utiles comme séparateurs. Plusieurs espaces sont équivalents à un seul. Les programmes sont indentés de telle manière que les étiquettes se trouvent dans une première colonne et les instructions dans une seconde colonne.

L’instruction peut être remplacée dans une ligne par une directive d’assemblage. Les directives d’assemblage permettent de donner des ordres à l’assembleur. Elles sont l’équivalent des directives commençant par ’#’ comme #include ou #if du langage C.

11 Programmation du LC-3 Programmation du micro-processeur LC-3

11.1.1.1 Constantes

Il existe deux types de constantes : les constantes entières et les chaînes de caractères. Les chaînes de caractères peuvent uniquement apparaître après la directive .STRINGZ. Elles sont alors délimitées par deux caractères ’"’ comme dans "Exemple de chaine" et sont implicitement terminées par le caractère nul ’\0’.

Les constantes entières peuvent apparaître comme paramètre des instructions du LC3 et des directives

.ORIG, .FILL et .BLKW. Elles peuvent être données soit sous la forme d’un entier écrit dans la base 10 ou 16, soit sous la forme d’un caractère. Les constantes écrite en base 16 sont préfixées par le caractère x. Lorsque la constante est donnée sous forme d’un caractère, sa valeur est le code ASCII du caractère. Le caractère est alors entouré de caractères ’’’ comme dans ’Z’.

; Exemple de constantes

.ORIG x3000 ; Constante entière en base 16 AND R2,R1,2 ; Constante entière en base 10

ADD R6,R5,-1 ; Constante entière négative en base 10 .FILL ’Z’ ; Constante sous forme d’un caractère .STRINGZ "Chaine" ; Constante chaîne de caractères .END

11.1.1.2 Commentaires

Les commentaires sont introduits par le caractère point-virgule ’;’ et il s’étendent jusqu’à la fin de la ligne. Ils sont mis après les deux champs d’étiquette et d’instruction mais comme ces deux champs peuvent être vides, les commentaires peuvent commencer dès le début de la ligne ou après l’étiquette. Voici quelques exemples de commentaires

; Commentaire dès le début de la ligne

label: ADD R6,R1,R2 ; Commentaire après l’instruction

loop: ; Commentaire après l’étiquette (avec indentation) BRz label

11.1.2 Directives d’assemblage

.ORIG 〈adresse〉

Cette directive est suivi d’une adresse constante. Elle spécifie l’adresse à laquelle doit commencer le bloc d’instructions qui suit. Tout bloc d’instructions doit donc commencer par une directive

.ORIG.

.END

Cette directive termine un bloc d’instructions.

.FILL 〈valeur〉

Cette directive réserve un mot de 16 bits et le remplit avec la valeur constante donnée en paramètre.

.STRINGZ 〈chaine〉

Cette directive réserve un nombre de mots de 16 bits égal à la longueur de la chaîne de caractères terminée par un caractère nul et y place la chaîne. Chaque caractère de la chaîne occupe un mot de 16 bits.

.BLKW 〈nombre〉

Cette directive réserve le nombre de mots de 16 bits passé en paramètre.

Olivier Carton 11.1.2 Directives d’assemblage

11.1.3 Étiquettes (labels)

Les étiquettes sont des identificateurs formés de caractères alphanumériques et commençant par une lettre. Elles désignent une adresse qui peut alors être utilisée dans les instructions.

L’adresse est spécifiée en mettant l’étiquette suivie du caractère ’:’ dans la première colonne d’une ligne du programme. L’étiquette est alors affectée de l’adresse à laquelle se trouve l’instruction. L’étiquette peut également être mise avant une directive d’assemblage comme .BLKW, .FILL ou

.STRINGZ. Elle désigne alors l’adresse à laquelle sont placés les mots mémoires produits par la directive.

; Exemple d’étiquettes

label: ADD R0,R1,R2 ; ’label’ désigne l’adresse de l’instruction ADD char: .FILL ’Z’ ; ’char’ désigne l’adresse du caractère ’Z’

string: .STRINGZ "Chaine" ; ’char’ désigne l’adresse du premier caractère ’C’

Documents relatifs