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