Vous êtes sur la page 1sur 6

Universit Paris Diderot Master 1

Circuits et architecture
TD 7 : assembleur LC-3

On va utiliser un sous-ensemble de lassembleur LC-3 que vous avez vu


en cours. Il est compos des instructions ADD, AND, BR, JMP, LDR, NOT,
STR (voir document joint). Nous avons implant ces instructions dans un
circuit tkgate disponible sur
http://www.liafa.jussieu.fr/~amicheli/Ens/Archi/
Larchitecture LC-3 et ce circuit seront utiliss loccasion du projet que
vous aurez rendre.

Exercice 1
Comment initialiser un registre la valeur zro ? Donner linstruction
assembleur puis son codage hexadcimal.

Exercice 2
Comment mettre une constante, par exemple 2007, dans un registre ?
Donner linstruction assembleur puis son codage hexadcimal.

Exercice 3
Avec la technique prcdente, combien dinstructions sont ncessaires
pour une constante arbitraire sur 16 bits ? Quelle autre technique peut-on
utiliser ?

Exercice 4
Avec les instructions dont on dispose, donner toutes les faons de coder
linstruction NOP.

Exercice 5
Programmer une squence de boot qui remet zro les registres et (une
partie de) la mmoire.

Exercice 6
Programmer la soustraction, cest--dire une squence qui code R2 R0
R1.

1
Exercice 7
Faites un programme qui calcule les 12 premiers termes de la suite de
Fibonacci grce une boucle.

Exercice 8
On souhaite programmer la somme dun tableau. Ladresse du dbut du
tableau est stocke dans R0 et la somme doit tre calcule dans R1. On
suppose quon peut modifier tous les registres. Programmer la somme dun
tableau si :
1. on suppose que la fin du tableau est marque par un octet nul,
2. on suppose que la taille du tableau est stocke dans R2.

On dsire maintenant implmenter le changement de contexte, afin de


pouvoir faire des appels de fonctions et (en exagrant un peu...) du multi-
tches.
Dans ce but, nous allons implmenter une pile en mmoire. Par conven-
tion, (aujourdhui) M em[0] est le sommet de pile (adresse de la premire case
vide), la premire case de la pile est M em[1], la seconde M em[2]... jusqu
M em[M em[0]]. La pile grandit donc vers le haut.

Exercice 9
Programmer la sauvegarde du contexte, cest--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
Solution 1 : Avec AND et la valeur immdiate zro.
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

Solution 2 : Les seules valeurs immdiates dont on dispose sont sur 5


bits signes, donc dans lintervalle [16, 15]. Mais on peut aussi multiplier
un registre par deux avec ADD...
Noter que 2007 = 2048 32 8 1 = 111 1101 01112 On 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

Solution 3 : Si on le fait navement, comme plus haut, il faut 1+53+1 =


17 lignes. On peut gagner une ligne si on utilise lextension signe pour le
bit de poids fort.
Lautre technique, vue en cours, consiste mettre les constantes dans
un segment de donnes, qui se trouve en mmoire la suite du programme.
On peut ensuite utiliser linstruction de chargement LD (load), dont le mode
dadressage est relatif au PC (PCoffset9).

Solution 4 : BR *** 000000000


BR 000 ********* qui ne peut pas scrire en assembleur en fait, mais peut
scrire en binaire (parce que BR est interprt comme BRnzp ...)

3
Les solutions suivantes ne sont pas tout fait correctes : elles modifient les
codes de conditions NZP
ADD Ri, Ri, 0 pour i = 0, . . . , 7
AND Ri, Ri, 11111 pour i = 0, . . . , 7
AND Ri, Ri, Ri pour i = 0, . . . , 7

Faire deux NOT successif sur le mme registre est plus risqu, en cas din-
terruption...

Solution 5 : Le dbut est comme lexo 1. Pour la mmoire, on a besoin


de 2 registres : un pour ladresse 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 nest pas nul

Bien sr, si lon fait comme cela, le programme (et le systme dexploitation)
vont tre crass... Mais on peut aussi commencer avec une autre valeur de
R1. Ou dcrmenter R1 jusqu zro. 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 smantique du saut : incremented PC

Solution 6 : vu en cours :
NOT R1,R1
ADD R1, R1, 1
ADD R2, R0, R1
Attention, si lon veut retrouver R1 la fin, il faut ensuite
NOT R1,R1
ADD R1, R1, 1
On pourrait aussi najouter 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


aprs :

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

Solution 7 :
AND R0,R0,0
AND R1,R1,0
AND R2,R2,0
ADD R2,R2,#1 ; premier lment non nul de la suite
ADD R0,R0,#12 ; compteur de boucle
boucle :
ADD R3,R1,R2 ; calcul du nouvel lment
ADD R1,R2,0
ADD R2,R3,0
ADD R0,R0,#-1 BRp boucle ; cest--dire BRp -5

Solution 8 :
1. LDR R2 R0 0
ADD R0 R0 1
ADD R1 R2 R1
ADD R2 R2 0
BRnp -5
2. LDR R1 R0 0
ADD R1 R2 R1
ADD R0 R0 1
ADD R2 R2 -1
BRp -5

Solution 9 : Sauvegarde :
AND R0,R0,0
LDR R0,R0,0 ; adresse du sommet de pile
STR R1,R0,0
STR R2,R0,1 ; le dcalage (offset) vite de modifier R0 chaque fois...
STR R3,R0,2
STR R4,R0,3
STR R5,R0,4
STR R6,R0,5

5
STR R7,R0,6
ADD RO,RO,7
AND R1,R1,0
STR R0,R1,0 ; mem[0] <- nouveau sommet de pile
On a besoin de R0 pour aller chercher le sommet de pile.

Solution 10 : Restauration :
AND R1,R1,0
LDR R0,R1,0 ; adresse du sommet de pile
ADD R0,R0,#-7 ;
STR R0,R1,0 ; on modifie tout de suite le sommet de pile, pour librer R1
LDR R1,R0,0
LDR R2,R0,1 ; le dcalage (offset) vite de modifier R0 chaque fois...
LDR R3,R0,2
LDR R4,R0,3
LDR R5,R0,4
LDR R6,R0,5
LDR R7,R0,6

Vous aimerez peut-être aussi