Elements de correction Examen, inf401, 2h, 1 doc A4 RV autorisé, Mai 2018 a) mot b) il faut des adresses multiples de 4, l'octet DEG entraine une adresse incorrecte c) .bss : "the name .bss is used by many compilers and linkers for a part of the data segment containing statically-allocated variables that are not explicitly initialized to any value. Typically only the length of the bss section, but no data, is stored in the object file. The program loader allocates memory for the bss section when it loads the program." source wikipedia .bss vs .data : avec .data, les données peuvent être initialisées, elles sont explicites dans le fichier objet. (pour la suite, on supposera, contrairement à l'énoncé, sauf pour Deg, que les entiers sont relatifs 32 bits) Q1.1 : Itération et tableau @ Allocation registre : @ R0, R1 : pour E/S @ R2 pour i @ R4 pour Deg @ R5 pour @Poly main: ldr r1, Q1 bl EcrChaine ldr r1, ptrDeg bl Lire8 ldr r1, ptrDeg ldrb r4, [r1] @ Deg dans R4 pour la suite si: cmp r4, #9 bls sinon ldr r1, E bl EcrChaine b suite sinon: ldr r1, Q2 bl EcrChaine ldr r5, ptrPoly @ @Poly dans R5 pour la suite mov r2, #0 @ i dans R2 pour la suite b condboucle corpsboucle: mov r1, r2, asl #2 add r1, r1, r5 bl Lire32 add r4, r4, #1 condboucle: cmp r2, r4 bge corpsboucle Q1.2 Appel Fonction (seul l'appel est demandé !) @ Allocation registre : @ R2 pour i @ R3 pour p @ R6 pour X ldr r6, ptrX ldr r6, [r6] sub sp, sp, #4 str r6, [sp] sub sp, sp, #4 str r2, [sp] sub sp, sp, #4 @ resultat bl exp_rec ldr r3, [sp] add sp, sp, #12 Q1.3 Fonction récursive @ Allocation registre : @ R3 temporaire @ R7 pour r exp_rec: sub sp, sp, #4 str lr, [sp] sub sp, sp, #4 str fp, [sp] mv fp, sp sub sp, sp, #4 str r3, [sp] sub sp, sp, #4 str r7, [sp] si_rec: ldr r3, [fp, #12] cmp r3, #0 bne sinon_rec mov r3, #1 b fin_rec sinon_rec: ldr r3, [fp, #16] sub sp, sp, #4 str r3, [sp] ldr r3, [fp, #12] mov r3, r3, asr #1 sub sp, sp, #4 str r3, [sp] sub sp, sp, #4 bl exp_rec ldr r7, [sp] add sp, sp, #12 mul r7, r7, r7 tst r3, #1 beq fin_rec ldr r3, [fp, #16] mul r7, r7, r3 fin_rec: str r7, [fp, #8] @ resultat ldr r7, [sp] add sp, sp, #4 ldr r3, [sp] add sp, sp, #4 ldr fp, [sp] add sp, sp, #4 ldr lr, [sp] add sp, sp, #4 mov pc, lr Q2 a) @: Val -------- 0: 1 1: 5 2: 14 3: 3 4: 15 5: 1 6: 5 7: 13 8: 3 9: 14 10: 4 11: 10 12: xx 13: 3 14: 9 15: 10 b) 1 : pc <= 0 pc = 0 : rinst = ? : acc = ? : ma = ? : md = ? : ... 2 : ma <= pc (0) - : - : - : ma = 0 : - : ... 3 : md <= Mem[ma] (1) - : - : - : - : md = 1 : ... 4 : rinst <= md (1) - : rinst = 1 : - : - : - : ... 5 : pc <= pc +1 (1) pc = 1 : - : - : - : - : ... 6 : acc <= 0 - : - : acc = 0 : - : - : ... 7 : ma <= pc (1) - : - : - : ma = 1 : - : ... ... c) 8 d) load@ : on réutilise le add@, le load@ se distingue seulement par le dernier état où il n'y a pas d'addition, pour cela on ajoute un état acc <= md, et une alternative pour distingue entre le acc <= acc + md et acc <= md selon que c'est l'instruction add@ ou load@ (un état de plus, une alternative de plus, modifications des alternatives initiales) jacc : on se place après la récupération du paramètre md <= Mem[MA] (d'autres solutions sont possibles plus tôt), on ajoute une alternative à celles existante (selon rinst = jacc [sinon comme dans l'automate initial]) vers la micro-action suivante : rinst <= acc qui permet de tester l'accumulateur pour former une nouvelle alternative : si rinst = 0, fin de l'instruction, retour vers le début de l'automate et lecture de la prochaine instruction sinon, transition vers la micro-action du jmp : pc <= md (un état de plus, 1 alternative de plus, modifications des alternatives initiales) swp : on se place après la récupération de la valeur du paramètre md <= Mem[MA] à la fin de load@/add@; on ajoute une alternative (selon rinst = swp [sinon comme dans l'automate initial]) vers les micro-action suivantes : tmp <= acc acc <= md md <= tmp Mem[ad]<=md (quatre états de plus, modifications des alternatives présentes)