Circuits et architecture TD 7 : assembleur LC-3









Exercices corrigés sur l'assembleur

Le code assembleur pour calculer le carré d'un nombre est comme suit: MOV AX#nombre. MUL AX. Exercice 1.3. Écrivez un code assembleur qui permet de 
INF exercices m


4. Initiation à l'assembleur

Finalement il faut compiler au moyen de Console Assemble & Link. Exercices. 1. Écrire un programme assembleur qui affiche le message “Bonjour le monde!” à l' 
Supplement


Architecture des ordinateurs

Assembleur : Exercices avec Solutions. EMI. Page 3/34. Introduction à la programmation en assembleur (TASM). Le langage assembleur est classé dans la 
ArchitectureSol


Initiation à l'assembleur

Corrigé des exercices . Qu'est-ce que l'assembleur ou le langage d'assemblage ? ... les accolades autant d'instructions assembleur que vous désirez.
Initiation Assembleur





Éléments de base de l'assembleur

Successful assembly. Figure 5.1 Liste d'assemblage. 5.3 Exercices. 5.3.1 Quels caractères peut-on utiliser pour délimiter les 
ndc elements base


Feuille de travaux dirigés n 4 Introduction à l'assembleur

Introduction à l'assembleur. Exercice 4.1. On considère une valeur n sur 8 bits (voir dessin ci-dessous). 1. Donner les opérations logiques et les masques 
correction td introduction a l assembleur


Circuits et architecture TD 7 : assembleur LC-3

Exercice 1. Comment initialiser un registre à la valeur zéro? Donner l'instruction assembleur puis son codage hexadécimal. Exercice 2.
td


EXERCICES D'ASSEMBLEUR ET DE MACRO-ASSEMBLEUR

EXERCICES D'ASSEMBLEUR ET DE. MACRO-ASSEMBLEUR. J. RIVEIRE. RESUME. Programmer c'est organiser. Si les langages les plus évolués offrent des.





TD 1 : Langage assembleur et Calcul numérique

Proposer un calcul équivalent avec une utilisation plus efficace des registres. Exercice 5 : Calcul d'addition 64 bits. Réaliser un programme qui additionne les 
TDTP


Chapitre 4 Éléments de base de l'assembleur Pep/8

Exercice. Écrire un programme qui attend les initiales de l'utilisateur (deux lettres) et affiche : bonjour <initiales>. Jean Privat (UQAM). 04 — Assembleur.
assembleur


224007 Circuits et architecture TD 7 : assembleur LC-3

Université Paris Diderot Master 1

Circuits et architecture

TD 7 : assembleur LC-3

On va utiliser un sous-ensemble de l"assembleur LC-3 que vous avez vu en cours. Il est composé des instructionsADD, AND, BR, JMP, LDR, NOT, STR(voir document joint). Nous avons implanté ces instructions dans un circuittkgatedisponible sur http://www.liafa.jussieu.fr/~amicheli/Ens/Archi/ L"architecture LC-3 et ce circuit seront utilisés à l"occasion du projet que vous aurez à rendre.

Exercice 1

Comment initialiser un registre à la valeur zéro? Donner l"instruction assembleur puis son codage hexadécimal.

Exercice 2

Comment mettre une constante, par exemple 2007, dans un registre? Donner l"instruction assembleur puis son codage hexadécimal.

Exercice 3

Avec la technique précédente, combien d"instructions sont nécessaires pour une constante arbitraire sur 16 bits? Quelle autre technique peut-on utiliser?

Exercice 4

Avec les instructions dont on dispose, donner toutes les façons de coder l"instructionNOP.

Exercice 5

Programmer une séquence de boot qui remet à zéro les registres et (une partie de) la mémoire.

Exercice 6

Programmer la soustraction, c"est-à-dire une séquence qui code R2 R0 R1. 1

Exercice 7

Faites un programme qui calcule les 12 premiers termes de la suite de

Fibonacci grâce à une boucle.

Exercice 8

On souhaite programmer la somme d"un tableau. L"adresse du début du tableau est stockée dans R0 et la somme doit être calculée dans R1. On suppose qu"on peut modifier tous les registres. Programmer la somme d"un tableau si : 1. on supp oseque la fin du tableau est marquée par un o ctetn ul, 2. on supp oseque la taille du tableau est sto ckéeda nsR2. On désire maintenant implémenter le changement de contexte, afin de pouvoir faire des appels de fonctions et (en exagérant un peu...) du multi- tâches. Dans ce but, nous allons implémenter unepileen mémoire. Par conven- tion, (aujourd"hui)Mem[0]est le sommet de pile (adresse de la première case vide), la première case de la pile estMem[1], la secondeMem[2]... jusqu"à

Mem[Mem[0]]. La pile grandit donc vers le haut.

Exercice 9

Programmer la sauvegarde du contexte, c"est-à-dire le fait de placer sur la pile les 7 registres R1, R2,:::, R7. Pourquoi ne peut-on pas sauvegarder les 8 registres dans la pile?

Exercice 10

Programmer la restauration du contexte : les 7 registres R1, R2,:::, R7 doivent reprendre leurs valeurs initiales. 2

Solutions

Solution1 : Avec AND et la valeur immédiate zéro.

AND R0, R0, 0

Noté aussi AND R0, R0, #0

Pour R0 : 0101 000 000 1 00000 x5020

Pour R1 : 0101 001 001 1 00000 x5260

Pour R4 : 0101 100 100 1 00000 x5920

Pour R7 : 0101 111 111 1 00000 x5FE0

Solution2 : Les seules valeurs immédiates dont on dispose sont sur 5 bits signées, donc dans l"intervalle[16;15]. Mais on peut aussi multiplier un registre par deux avec ADD... Noter que2007 = 20483281 = 111 1101 01112On peut aussi faire les divisions par 2 successives.

Assembleur binaire hexa

AND R0, R0, 0 0101 000 000 1 00000 x5020

ADD R0, R0, 7 0001 000 000 1 00111 x1027

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, 13 0001 000 000 1 01101 x102D

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, 5 0001 000 000 1 00110 x1026

Solution3 : Si on le fait naïvement, comme plus haut, il faut1+53+1 =

17lignes. On peut gagner une ligne si on utilise "l"extension signée" pour le

bit de poids fort. L"autre technique, vue en cours, consiste à mettre les constantes dans un segment de données, qui se trouve en mémoire à la suite du programme. On peut ensuite utiliser l"instruction de chargement LD (load), dont le mode d"adressage est relatif au PC (PCoffset9).

Solution4 : BR *** 000000000

BR 000 ********* qui ne peut pas s"écrire en assembleur en fait, mais peut s"écrire en binaire (parce que BR est interprété comme BRnzp ...) 3 Les solutions suivantes ne sont pas tout à fait correctes : elles modifient les codes de conditions NZP

ADD Ri, Ri, 0 pouri= 0;:::;7

AND Ri, Ri, 11111 pouri= 0;:::;7

AND Ri, Ri, Ripouri= 0;:::;7

Faire deux NOT successif sur le même registre est plus risqué, en cas d"in- terruption... Solution5 : Le début est comme l"exo 1. Pour la mémoire, on a besoin de 2 registres : un pour l"adresse et un pour la valeur 0.

AND R0, R0, 0

AND R1, R1, 0

STR R0, R1, 0 Mem[R1+0] R0

ADD R1, R1, 1

BRnp -3 revient à STR si R1 n"est pas nul

Bien sûr, si l"on fait comme cela, le programme (et le système d"exploitation) vont être écrasés... Mais on peut aussi commencer avec une autre valeur de R1. Ou décrémenter R1 jusqu"à zéro. On peut aussi utiliser un autre registre pour faire des soustractions et des comparaisons.

Noter que BRnp -3 se code

0000 101 111111101

revoir aussi la sémantique du saut : "incremented PC"

Solution6 : vu en cours :

NOT R1,R1

ADD R1, R1, 1

ADD R2, R0, R1

Attention, si l"on veut retrouver R1 à la fin, il faut ensuite

NOT R1,R1

ADD R1, R1, 1

On pourrait aussi n"ajouter le 1 qu"à R2

Ou bien, sans modifier les registres sources :

AND R2 R2 0

ADD R2 R1 0

NOT R2 R2

ADD R2 R2 1

ADD R2 R2 R0

on peut gagner une instruction en faisant -1 avant le not, au lieu de +1 après : 4

AND R2 R2 0

ADD R2 R1 -1

NOT R2 R2

ADD R2 R2 R0

Ou encore (mieux) :

NOT R2,R1

ADD R2,R2,#1

ADD R2,R2,R0

Solution7 :

AND R0,R0,0

AND R1,R1,0

AND R2,R2,0

ADD R2,R2,#1; premier élément non nul de la suite

ADD R0,R0,#12; compteur de boucle

boucle :

ADD R3,R1,R2; calcul du nouvel élément

ADD R1,R2,0

ADD R2,R3,0

ADD R0,R0,#-1 BRp boucle; c"est-à-dire BRp -5

Solution8 :

Université Paris Diderot Master 1

Circuits et architecture

TD 7 : assembleur LC-3

On va utiliser un sous-ensemble de l"assembleur LC-3 que vous avez vu en cours. Il est composé des instructionsADD, AND, BR, JMP, LDR, NOT, STR(voir document joint). Nous avons implanté ces instructions dans un circuittkgatedisponible sur http://www.liafa.jussieu.fr/~amicheli/Ens/Archi/ L"architecture LC-3 et ce circuit seront utilisés à l"occasion du projet que vous aurez à rendre.

Exercice 1

Comment initialiser un registre à la valeur zéro? Donner l"instruction assembleur puis son codage hexadécimal.

Exercice 2

Comment mettre une constante, par exemple 2007, dans un registre? Donner l"instruction assembleur puis son codage hexadécimal.

Exercice 3

Avec la technique précédente, combien d"instructions sont nécessaires pour une constante arbitraire sur 16 bits? Quelle autre technique peut-on utiliser?

Exercice 4

Avec les instructions dont on dispose, donner toutes les façons de coder l"instructionNOP.

Exercice 5

Programmer une séquence de boot qui remet à zéro les registres et (une partie de) la mémoire.

Exercice 6

Programmer la soustraction, c"est-à-dire une séquence qui code R2 R0 R1. 1

Exercice 7

Faites un programme qui calcule les 12 premiers termes de la suite de

Fibonacci grâce à une boucle.

Exercice 8

On souhaite programmer la somme d"un tableau. L"adresse du début du tableau est stockée dans R0 et la somme doit être calculée dans R1. On suppose qu"on peut modifier tous les registres. Programmer la somme d"un tableau si : 1. on supp oseque la fin du tableau est marquée par un o ctetn ul, 2. on supp oseque la taille du tableau est sto ckéeda nsR2. On désire maintenant implémenter le changement de contexte, afin de pouvoir faire des appels de fonctions et (en exagérant un peu...) du multi- tâches. Dans ce but, nous allons implémenter unepileen mémoire. Par conven- tion, (aujourd"hui)Mem[0]est le sommet de pile (adresse de la première case vide), la première case de la pile estMem[1], la secondeMem[2]... jusqu"à

Mem[Mem[0]]. La pile grandit donc vers le haut.

Exercice 9

Programmer la sauvegarde du contexte, c"est-à-dire le fait de placer sur la pile les 7 registres R1, R2,:::, R7. Pourquoi ne peut-on pas sauvegarder les 8 registres dans la pile?

Exercice 10

Programmer la restauration du contexte : les 7 registres R1, R2,:::, R7 doivent reprendre leurs valeurs initiales. 2

Solutions

Solution1 : Avec AND et la valeur immédiate zéro.

AND R0, R0, 0

Noté aussi AND R0, R0, #0

Pour R0 : 0101 000 000 1 00000 x5020

Pour R1 : 0101 001 001 1 00000 x5260

Pour R4 : 0101 100 100 1 00000 x5920

Pour R7 : 0101 111 111 1 00000 x5FE0

Solution2 : Les seules valeurs immédiates dont on dispose sont sur 5 bits signées, donc dans l"intervalle[16;15]. Mais on peut aussi multiplier un registre par deux avec ADD... Noter que2007 = 20483281 = 111 1101 01112On peut aussi faire les divisions par 2 successives.

Assembleur binaire hexa

AND R0, R0, 0 0101 000 000 1 00000 x5020

ADD R0, R0, 7 0001 000 000 1 00111 x1027

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, 13 0001 000 000 1 01101 x102D

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, R0 0001 000 000 000 000 x1000

ADD R0, R0, 5 0001 000 000 1 00110 x1026

Solution3 : Si on le fait naïvement, comme plus haut, il faut1+53+1 =

17lignes. On peut gagner une ligne si on utilise "l"extension signée" pour le

bit de poids fort. L"autre technique, vue en cours, consiste à mettre les constantes dans un segment de données, qui se trouve en mémoire à la suite du programme. On peut ensuite utiliser l"instruction de chargement LD (load), dont le mode d"adressage est relatif au PC (PCoffset9).

Solution4 : BR *** 000000000

BR 000 ********* qui ne peut pas s"écrire en assembleur en fait, mais peut s"écrire en binaire (parce que BR est interprété comme BRnzp ...) 3 Les solutions suivantes ne sont pas tout à fait correctes : elles modifient les codes de conditions NZP

ADD Ri, Ri, 0 pouri= 0;:::;7

AND Ri, Ri, 11111 pouri= 0;:::;7

AND Ri, Ri, Ripouri= 0;:::;7

Faire deux NOT successif sur le même registre est plus risqué, en cas d"in- terruption... Solution5 : Le début est comme l"exo 1. Pour la mémoire, on a besoin de 2 registres : un pour l"adresse et un pour la valeur 0.

AND R0, R0, 0

AND R1, R1, 0

STR R0, R1, 0 Mem[R1+0] R0

ADD R1, R1, 1

BRnp -3 revient à STR si R1 n"est pas nul

Bien sûr, si l"on fait comme cela, le programme (et le système d"exploitation) vont être écrasés... Mais on peut aussi commencer avec une autre valeur de R1. Ou décrémenter R1 jusqu"à zéro. On peut aussi utiliser un autre registre pour faire des soustractions et des comparaisons.

Noter que BRnp -3 se code

0000 101 111111101

revoir aussi la sémantique du saut : "incremented PC"

Solution6 : vu en cours :

NOT R1,R1

ADD R1, R1, 1

ADD R2, R0, R1

Attention, si l"on veut retrouver R1 à la fin, il faut ensuite

NOT R1,R1

ADD R1, R1, 1

On pourrait aussi n"ajouter le 1 qu"à R2

Ou bien, sans modifier les registres sources :

AND R2 R2 0

ADD R2 R1 0

NOT R2 R2

ADD R2 R2 1

ADD R2 R2 R0

on peut gagner une instruction en faisant -1 avant le not, au lieu de +1 après : 4

AND R2 R2 0

ADD R2 R1 -1

NOT R2 R2

ADD R2 R2 R0

Ou encore (mieux) :

NOT R2,R1

ADD R2,R2,#1

ADD R2,R2,R0

Solution7 :

AND R0,R0,0

AND R1,R1,0

AND R2,R2,0

ADD R2,R2,#1; premier élément non nul de la suite

ADD R0,R0,#12; compteur de boucle

boucle :

ADD R3,R1,R2; calcul du nouvel élément

ADD R1,R2,0

ADD R2,R3,0

ADD R0,R0,#-1 BRp boucle; c"est-à-dire BRp -5

Solution8 :