Département Instrumentation et Automatique FEI / USTHB
Nom : Prénom : Matricule :
Master ESE : Epreuve de Moyenne Durée 2020/2021 : Module DSP
Exercice N°1 : (6 Point)
Dans cet exercice on cherche à trouver le factoriel d'un nombre n ≤7 avec n ! = n (n - 1) (n - 2) . . . (1).
La valeur de n est définie dans le programme source C factorial.c, qui appelle la fonction en langage
assembleur factfunc.asm.
#include <stdio.h> //for print statement
void main()
{
short n = 7; //set value
short result; //result from asm function
result = factfunc(n); //call ASM function factfunc
printf("factorial = %d", result); //print result from asm function
}
Le registre A1 est défini comme un compteur de boucle. Le premier multiplicateur est n (n - 1) et
s'accumule dans le registre A4. La valeur initiale de n est transmise à la fonction asm via A4. Le factoriel
résultant est renvoyé au programme C appelant via B3. Compléter le programme en langage assembleur.
;Factfunc.asm Assembly function called from C to find factorial
.def _factfunc ;ASM function called from C
_factfunc: MV .S1 A4,A1 ;setup loop count in A1
SUB .L1 A1,1,A1 ;decrement
LOOP: MPY .M1 A4,A1,A4
NOP
SUB .L1 A1,1,A1 ;decrement for next multiply
[A1] B S LOOP
NOP 5
B B3 ;return to calling routine
NOP 5
Exercice N°2 : (8 Point)
Considérons une simple fonction pour ajouter deux tableaux de N éléments a et b, élément par élément.
𝑐 [𝑛] = ( 𝑎 [𝑛] + 𝑏 [𝑛])
Compléter le programme en langage assembleur décrivant la boucle interne. Avec A1 : N-n, A0 : a
(n), B0 : b (n), B1 : a [n] + b [n].
USTHB / FEI 2020-2021 Page 1
Département Instrumentation et Automatique FEI / USTHB
MVK .S1 10, A1 ; N = 10
LOOP : LDW .D1 *a++, A0 ;A0 = a[n]
LDW .D2 *b++, B0 ; B0 = b[n]
ADD .L2x A0,B0,B1
STW .D2 B1, *c++ ;c[n] = A0+B0 , n++
SUB .L1 A1, 1 , A1 ;N = N-1
[A1] B S LOOP ;branch to LOOP if A1 != 0
Exercice N°3 : (6 Point)
L’exemple suivant présente un listing du programme C factclasm.c, qui appelle la fonction asm linéaire
factclasmfunc.sa, pour calculer le factoriel d'un nombre inférieur ou égal à 7. n ! = n (n - 1) (n - 2) . . .
(1).
#include <stdio.h> //for print statement
void main()
{
short number = 7; //set value
short result; //result of factorial
result = factclasmfunc(number); //call ASM function factlasmfunc
printf("factorial = %d", result); //result from linear ASM function
}
Compléter le programme en langage assembleur linéaire pour calculer le factoriel.
Argument : number, registres : a et b.
.ref _factclasmfunc ;Linear ASM func called from C
_factclasmfunc: .cproc number ;start of linear ASM function
.reg a,b ;asm optimizer directive
MV number,b ;setup loop count in b
MV number,a ;move number to a
SUB b,1,b ;decrement loop counter
loop: MPY a,b,a ;n(n-1)
SUB b,1,b ;decrement loop counter
[b] B loop ;loop back to loop if count #0
.return a ;result to calling function
.endproc ;end of linear ASM function
USTHB / FEI 2020-2021 Page 2