Architectures Logicielles et Matérielles Eléments de

Transcription

Architectures Logicielles et Matérielles Eléments de
UNIVERSITE Joseph FOURIER, Grenoble
U.F.R. Informatique et Maths. Appli.
Licence Sciences et technologies
UE INF241 : Architectures Logicielles et Matérielles
Eléments de correction
1
Codage de la fonction puiss avec paramètres dans des registres
@ n : r0, p : r1, resultat de la fonction : r2
@ u : r3, res : r4
puiss:
@ sauvegarde de l’adresse de retour
sub sp, sp, #4
str lr, [sp]
@ sauvegarde des registres utilisés par la fonction
sub sp, sp, #4
str r3, [sp]
sub sp, sp, #4
str r4, [sp]
@ (point AA)
@ u=p
mov r3, r1
@ res=1
mov r4, #1
@ iteration
tq: cmp r3, #0
@ u==0 ??
beq fintq
@ point CC
@ premier parametre pour appel à prod : n, déjà dans r0
mov r1, r4 @ deuxieme parametre pour appel à prod : res
bl prod
@ prod(n, res)
mov r4, r2 @ res=
sub r3, r3, #1 @ u=u-1
bal tq
fintq:
mov r2, r4
@ return(res) dans r2 (point BB)
@ récupérer le contenu des registres utilisés par la fonction
ldr r4, [sp]
add sp, sp #4
ldr r3, [sp]
add sp, sp #4
@ récupérer l’adresse de retour
ldr lr, [sp]
add sp, sp #4
@ retour
mov pc, lr
1
2
Codage de la fonction puiss avec paramètres et résultat de la
fonction dans la pile
La pile au moment de l’appel contient les valeurs des paramètres n et p et une place pour le résultat
de la fonction puiss.
|
| (adresses basses)
|------|
sp-->|
| place pour le résultat
|------|
| p
|
|------|
| n
|
|------| (adresses hautes)
En début de procédure on procède comme dans la version précédente ce qui revient à empiler au
dessus de nos trois cases précédentes le contenu des registres lr, r3 et r4.
Il suffit alors :
– d’ajouter au point AA : ldr r0, [sp, #20] et ldr r1, [sp, #16], on a alors les valeurs de n et
de p dans les ragistres r0 et r1.
– de remplacer la ligne du point BB par str r4, [sp, #12]
– remplacer les trois lignes à partir du point CC par :
sub sp,
str r0,
sub sp,
str r4,
sub sp,
bl prod
ldr r4,
add sp,
3
sp, #4
[sp]
sp, #4
[sp]
sp, #4
@ empiler n
@ empiler res
@ place pour le résultat
[sp]
@ res= le résultat de prod(n,res)
sp, #12 @ récupérer la place
Codage de l’action puiss : deux paramètres données et un paramètre résultat
On repart de la version de la section 1. Les lignes .... sont inchangées. On suppose que la fonction
prod ne modifie pas les registres, autres que r2 dans lequel elle rend son résultat évidemment.
@ n : r0, p : r1, adresse de res : r2
@ u : r3
@ r4 sert de registre pour de calcul intermédiaire
puiss:
@ sauvegarde de l’adresse de retour
....
@ sauvegarde des registres utilisés par la fonction
....
@ u=p
....
@ *res=1
mov r4, #1
str r4, [r2]
@ pour la suite on place l’adresse de res dans r4 car la fonction
@ prod rend son résultat dans r2
mov r4, r2
@ iteration
tq: cmp r3, #0
@ u==0 ??
2
beq fintq
@ premier parametre pour appel à prod : n, déjà dans r0
str r1, [r4] @ deuxieme parametre pour appel à prod
@ *res désigne la valeur stockée à l’adresse res
bl prod
@ prod(n, *res)
str r2, [r4] @ *res= résultat de l’appel de la fonction
@ qui est dans r2
sub r3, r3, #1
@ u=u-1
bal tq
fintq:
mov r2, r4
@ si on ne veut pas avoir modifié les paramètres
@ récupérer le contenu des registres utilisés par la fonction
....
@ récupérer l’adresse de retour
....
@ retour
....
4
Code pour puiss(a,b,&c)
.data
a: .word ...
b: .word ...
c: .word ...
.text
ldr r0, adr_a
ldr r0, [r0]
ldr r1, adr_b
ldr r1, [r1]
ldr r2, adr_c
bl puiss
adr_a: .word a
adr_b: .word b
adr_c: .word c
3