Université de Sfax
Ecole Nationale d’Electronique et de Télécommunications de Sfax
Département génie informatique industrielle
Matière
DSP
Devoir à la maison
Réalisé par
Mefteh Moez
2éme Année Génie Informatique industrielle
Année universitaire 2020/2021
1
Exercice N°1
1. Déterminer le continu des registres en pointillés après l'exécution de ces instructions :
a. A1=0xFE1AC03B; A2=0x00330001
MPY A1, A2, A3 ; A3= 0xFFFFC03B,
b. A1=0x08C40006; A2=0x00010002
MPYH A1, A2, A3 ; A3=0x000008C4,
c. A1= 0x00010002; A2=0x00030004
DOTP2 .M1 A1, A2, A3 ; A3= 0x00030008
d. A1= 0x00330001; A2=0x00417000
ADD A1, A2, A3 ; A3=0x00747001,
e. A1= 0x00330001; A2=0x00417000
ADD2 A1, A2, A3 ; A3=0x00747001,
f. B0=0x00000000; B1=0x00000002; A1= 0x00020004; A2=0x00010002
[!B0] SUB .D2 B1, 1, B1 ; B1=0x00000001,
[B0] ADD2 .S1 A1, A2, A2 ; A2=0x00010002,
2. Sachant que A0= 0x0102ABC0 et que dans la mémoire à partir de l'adresse 0x0102ABC0 on
a les octets suivants :
0xFE, 0xA3, 0xBF, 0x74, 0x59, 0xA6, 0xA1, 0x11, 0x61, 0xC5, 0xE0, 0x45,0x6D, 0xFF,
0x29, 0x5A, 0x4E, 0x58, 0x82, 0xA0, 0xFA, 0x52, 0x6B, 0x33, 0x4C, 0x58, 0x3F et 0xAA.
Déterminer le continu des registres en pointillés après l'exécution de ces instructions :
NB: Les 4 cas sont liés (dépendantes l’une de l’autre)
a) LDB.D1 *++A0[2], A1 ; A0= 0x0102ABC2 et A 1= 0x000000BF
b) LDH. D 1 *A0, A1; ; A0= 0x0102ABC2 et A1= 0x0000BF74
c) LDW .D1 *+A0, A1; ; A0= 0x0102ABC2 et A1= 0xA11161C5
d) LDDW .D1 *A0++, A3:A2; ; A0=0x0102ABCA= 0xBF7459A6 et A3=A11161C5,
e) STW.D1 A1, *A0 ; A1=0xA11161C5 ; @case=0x0102ABCA Valeur= 0xA11161C5
2
Exercice 2:
Soit le code assembleur suivant :
MVK .S1 100, A1
ZERO .L1 A7
LOOP : LDH .D1 *A4++,A2
LDH .D2 *B4++,B2
NOP 4
MPY .M1X
A2,B2,A6
NOP
ADD .L1 A6,A7,A7
SUB .S1 A1 ,1,A1
[A1] B .S2 LOOP
NOP 5
STH .D1 A7,*A9
1. Sachant que le programme ci-dessus calcule la somme de produits de deux vecteurs de 100
éléments codés sur 16 bits et pointés respectivement par les registres A4 et B4. Compléter
les pointillés de ce programme.
2. Calculer le nombre de cycles d’exécution nécessaires pour ce programme ?
Nbre de cycle = (100*16) +3=1603
3. Modifier le programme en remplaçant les instructions LDH par LDW et utiliser les instructions
MPY et MPYH
MVK .S1 50, A1
ZERO .L1 A7
LOOP : LDW .D1 *A4++,A2
LDW .D2 *B4++,B2
NOP 4
ADD .L1 A3,A7,A7
MPY .M1X A2,B2,A6
MPYH .M2X A2,B2,B6
NOP
ADD .L1X A6,B6,A3
SUB .S1 A1 ,2,A1
[A1] B .S2 LOOP
5
NOP
STH .D1 A7,*A9
3
4. Donner le nouveau nombre de cycles ?
Nbre de cycle =903
5. Utiliser les instructions parallèles. Déduire le nouveau nombre de cycle
MVK .S1 50, A1
ZERO .L1 A7
LOOP : LDW .D1 *A4++,A2
|| LDW .D2 *B4++,B2
NOP 4
MPY .M1X A2,B2,A6
|| MPYH .M2X A2,B2,B6
NOP
ADD .L1X A6,B6,A3
ADD .L1 A3,A7,A7
SUB .S1 A1 ,1,A1
[A1] B .S2 LOOP
5
NOP
STH .D1 A7,*A9
Nbre de cycle= (16*50)+3=803
6. Minimiser le nombre de cycles par des instructions. Déduire le nouveau nombre de cycle.
MVK .S1 50, A1
ZERO .L1 A7
LOOP : LDW .D1 *A4++,A2
|| LDW .D2 *B4++,B2
NOP 3
[A1] B .S2 loop
MPY .M1X A2,B2,A6
|| MPYH .M2X A2,B2,B6
NOP
ADD .L1X A6,B6,A3
ADD .L1 A3,A7,A7
|| SUB .S1 A1 ,1,A1
STH .D1 A7,*A9
Nbre cycle=(9*50)+3=453
4
7. Modifier le programme de la question 3 tout en remplaçant les instructions LDDW et
DOTP2 (utiliser le parallélisme des deux voies A et B).
MVK .S1 25, A1
ZERO .L1 A7
ZERO .L1 B8
LOOP : LDDW .D1 *A4++,A2:A3
|| LDDW .D2 *B4++,B2:B3
NOP 3
[A1] B .S2 loop
DOTP2 .M1X A2,B2,A6
|| DOTP2 .M2X A3,B3,B6
NOP 2
ADD .L1 A6,A7,A7
|| ADD .L2 B6,B8,B8
ADD .L1X A7,B8,A7
|| SUB .S1 A1 ,1,A1
STH .D1 A7,*A9
8. Donner le nouveau nombre de cycles.
Nbre de cycle= (10*25) +4= 254
EXERCICE 3
Soit le programme assembleur suivant:
.def _sumfunc; // declaration de nom de fonction
_sumfunc:
MV. L1 A4, A1; // charger le contenue de A4 dans A1
SUB. S1 A1, 1, A1; // decrementer A1 de 1
Loop: ADD. L1 A4, A1, A4; // somme de A4 et A1 est enregistrer la somme dans A4
SUB. S1 A1, 1, A1; // decrementer A1 de 1
[A1] B .S1 Loop; // brancher sur la loop si A1 != 0
NOP 5; // 5 instruction de « no-opération » pour finaliser le branchement
B .S2 B3; // resultat du retour sur B3
NOP 5;
5
2- Ce programme fait la somme d’une suite
arithmétique de raison -1.
3- Langage C de ce programme :
Int sommeAr(int n){
Int U=0;
For ( int i=n; i>=0; i--)
U=U+i;
Return(U); }