Question 1 Ecrire du code nasm correspondant au calcul suivant : (1+2)*(2+3)+(5+6)*(7+8) en n'utilisant que les trois registres eax, ebx et ecx. Est il possible d'effectuer ce calcul avec moins de trois registres ? expliquez pourquoi ------------------------------------------------------------------------------------------------------------------------------------- Question 2 Expliquer pourquoi il est nécessaire d'avoir accès aux tables de symboles pour traduire du code trois adresses en pre-nasm. ------------------------------------------------------------------------------------------------------------------------------------- Question 3 Voici un petit bout de code pre-nasm. 1 mov r1, 2 ; 2 imul r1, 4 ; 3 mov r2, 1 ; 4 add r2, r1 ; 5 mov eax, 7 ; 6 mov r4, 2 ; 7 idiv r4 ; 8 mov r4, eax ; 9 mov r5, r2 ; 10 sub r5, r4 ; 11 mov eax, r5 ; Donnez le graphe d'interférence correspondant à ce code. Vous représenterez le graphe d'interférence sous la forme de paires de sommets reliés entre eux par une arête (par exemple (a,b)(b,c) correspond au graphe comportant les trois sommets a,b et c, tel que le sommet a est relié au sommet b et le sommet b est relié au sommet c). Une fois que vous aurez construit le graphe, choisissez deux arêtes de ce dernier et expliquez la raison pour laquelle elles apparaissent dans le graphe. ------------------------------------------------------------------------------------------------------------------------------------- Question 4 On a ajouté au langage L l'opérateur modulo, comme vous l'avez fait lors de l'évaluation du TP. Donner la séquence d'instructions trois adresses correspondant à l'expression 10 % 6 % 2 et la commenter. ------------------------------------------------------------------------------------------------------------------------------------- Question 5 Expliquer pourquoi les paramètres se trouvent avant les variables locales dans la trame de pile. Est il possible d'imaginer d'autres structures de la trame de pile ? Si c'est le cas, proposez en une autre. ------------------------------------------------------------------------------------------------------------------------------------- Question 6 Voici un petit bout de code trois adresses, expliquez quel calcul il permet de réaliser et donner le code en langage L lui correspondant. 1 t0 = call main 2 stop t0 3 main fbegin 4 t2 = 1 5 if 0 = 0 goto l1 6 t2 = 0 7 l1 t1 = 1 8 if t2 = 0 goto l0 9 t1 = 0 10 l0 write t1 11 fend ------------------------------------------------------------------------------------------------------------------------------------- Question 7 Voici un petit bout de code trois adresses. Traduire en pre-nasm les ligne 2, 4 et 5 en commentant chaque ligne de code pre-nasm. 1 f fbegin 2 ret a 3 fend 4 main fbegin 5 param 29 6 t1 = call f 7 write t1 8 fend ------------------------------------------------------------------------------------------------------------------------------------- Question 8 Expliquer le rôle de la pile dans un compilateur. Pourquoi est elle indispensable ? ------------------------------------------------------------------------------------------------------------------------------------- Question 9 Quelles contraintes sémantiques doivent respecter un programme en L. Expliquer pourquoi on ne peut pas écrire une grammaire du langage L qui prend en compte ces contraintes. ------------------------------------------------------------------------------------------------------------------------------------- Question 10 Le code trois adresses comporte des temporaires. Expliquer à quel moment ces temporaires ont été créés et la raison pour laquelle ils ont été créés.