Académique Documents
Professionnel Documents
Culture Documents
Page
91
SAOUDI Lalia Génération de code 2007/2008
On peut produire un code d’assez bonne qualité pour l’instruction simple ADD RJ, RI de cout un ,
dont le résultat a se trouve dans le registre RI, on peut produire cette instruction à condition que Ri
contienne b, que Rj contienne c et que b soit pas actif après cette instruction.
Si Ri contient b mais que c se trouve dans un emplacement mémoire, on peut produire la séquence :
ADD c , Ri cout=2 ou MOV c,Rj ADD Rj, Ri cout=3. B ne soit pas actif
La seconde séquence devient plus intéressante si la valeur de c est utilisée ensuite.
En résumé on constate que le processus de production de code doit examiner un très grand nombre de
cas et que la solution à choisir dépend du contexte dans lequel l’instruction à trois adresses a été
examinée.
Page
92
SAOUDI Lalia Génération de code 2007/2008
La fonction DonnerRegistre :
La fonction DonnerRegistre retourne un emplacement E pour recevoir la valeur de x dans l’affectation
x :=y op z :
1. Si le nom y est dans un registre qui ne contient pas la valeur d’autres noms, si y n’est pas
référencé et s’il n’a aucune utilisation après l’exécution de x :=y op z, la fonction DR retourne
pour L le registre de y. Modifier le descripteur d’adresse de y pour indiquer que y ne réside
plus dans L, le même traitement est appliqué à l’opérande z.
2. Si (1) échoue, retourner un registre libre s’il en existe un.
3. Si (2) échoue, si x a une utilisation ultérieure dans le bloc ou si op est un opérateur qui requiert
un registre (tel que l’indexation), chercher un registre occupé R. Ranger le contenu de ce
registre dans un emplacement mémoire M( par MOV R ,M) s’il n y est pas déjà, modifier le
descripteur d’adresses pour M, et retourner R. Si R contient la valeur de plusieurs variables ,
une instruction MOV doit être produite pour chaque variable qui nécessite d’être sauvegardée.
Un choix convenable pour le registre occupé peut être celui dont la donnée est référencée le
plus loin dans le futur, ou l’un de ceux dont le contenu est aussi en mémoire.
4. Si x n’est pas utilisé plus loin dans le bloc, ou si aucun registre occupé ne convient, choisir
pour E l’emplacement mémoire de x.
Exemple : d := (a –b) + ( a- c) + ( a – c) peut être traduite en séquence de code à trois adresses
comme suit : t := a-b , u := a-c v := t + u d := t +v
Où d est active à la fin du bloc , en appliquant l’algorithme de production de code :
Le fait que a , b et c sont toujours présents dans la mémoire ne figure pas dans le descripteur
d’adresses, nous supposons aussi que t , u et v étant des temporaires, ils ne sont pas présents dans
la mémoire
Instruction Code produit Descripteur de registre Descripteur d’adresses
Registres vides
T := a –b MOV a, R0 R0 contient t T est dans R0
SUB b , R0
U:= a-c MOV a, R1 R0 contient t T est dans R0
SUB c , R1 R1 contient u u est dans R1
V:= t + u ADD R1 ,R0 R0 contient V v est dans R0
R1 contient u u est dans R1
D := v + u ADD R1 , R0 R0 contient d D est dans R0
MOV R0 , d d est dans R0
et dans la mémoire
I dans RI I dans MI
Page
93
SAOUDI Lalia Génération de code 2007/2008
2 4
MOV b(Ri), R MOV Mi, R
a := b[i] MOV b(R),R
Instruction conditionnelles:
Il existe deux implantations possibles des instructions conditionnelles. L’une d’elles consiste à
effectuer le branchement en fonction du contenu d’un registre spécifique qui dénote six conditions :
négatif, nul, positif, non négatif, non positif et non nul. Sur une telle machine l’instruction à trois
adresses : si x <y aller à z peut être implantée en soustrayant y de x dans le registre R, puis en se
branchant vers z si la valeur de R est négative.
La seconde approche utilisée sur la plupart des machines, utilise un ensemble de codes conditions pour
indiquer si la dernière quantité calculée et chargée dans un registre est négative, nulle ou positive, par
exemple CMP x,y positionne le code-condition à une valeur positive si x>y. une instruction de
branchement conditionnel effectue le branchement si la condition <,=,>, <= ;=> ou ≠ est vérifiée. Nous
utilisons l’instruction machine CJ <= z qui signifie « se brancher à z si le code condition est négatif
ou nul » par exemple ; si x<y aller à z pourrait être implanté par : CMP x, y CJ < z
Page
94