Vous êtes sur la page 1sur 10

Solution du TD2

Assembleur à deux passes

Code Opération Adresse

1 octet 2 octet

La taille d'une instruction est de 3 octets. Le champ adresse est sur 2 octets.
L'adresse de chaque instruction peut être alors définie sur 16 bits qui est équivalent
à 4 chiffres en hexadécimal. Chaque octet a une adresse.

Nous ne pouvons pas résoudre les références en avant (des symboles non
rencontrés en zone label ou donnée donc que nous ne connaissons pas encore),
ces symboles seront tous connus après la rencontre de la directive END.

exemple: Nous ne pouvons pas directement traduire la première instruction du


programme.

CHA est traduisible car son équivalent est 00 dans la table des codes opérations
donné dans l'exercice. Par contre, le symbole "Zone" ne peut être traduit car on ne
connait pas encore l'équivalent de ce symbole (Il s'agit de l'adresse de l'instruction
de la ligne 9). De même, "ADD Deux" ne peut être traduite directement tant qu'on
ne connait pas l'équivalent du symbole "Deux" qui correspond à l'adresse de
l'instruction la ligne 10. Il faudrait d'abord donc résoudre le problème des
références en avant en consultant une table (table des symboles) qui contient
l'adresse correspondant à chaque symbole.

On doit donc parcourir le programme une première fois pour déterminer l'adresse
de chaque instruction du programme (qui est sur 4 chiffres en hexadécimal) qui
nous mène à l'extraction des valeurs des symboles.

Une fois les adresses correspondant aux symboles sont résolues donc on a
rencontré le end , on parcourt le programme ligne par ligne une deuxième fois
pour traduire le programme.

Lors de la traduction, la première adresse commence toujours par (0000) , le


programme est translatable.

1
000 000 000 000 000 000
000 000 000 000
4 5 6 7 8 9
0 1 2 3

CHA Zone Zone ADD Deux Deux COMP Max Max

1 octet
2 octet 2 octet

Debut Suite
(étiquette) (étiquette)

La première instruction prend trois espaces mémoire adressable. Zone occupe


deux espaces adressables. L'adresse de "CHA" est 0000, l'adresse du premier octet
de "Zone" est 0001 et l'adresse du deuxième octet de "Zone" est 0002. L'adresse
début de l'instruction suivante est 0003. L'adresse de ADD (l'instruction suivante)
est donc 0003.

Pour simplifier, l'adresse d'une instruction correspond à l'adresse de l'instruction


précédente à laquelle on additionne sa taille et aussi à la valeur du compteur
d’emplacement pour cette ligne.

2
A chaque fois qu'on obtient l'adresse correspondant à un
symbole (en rouge sur le tableau), on le met dans la table des
symboles. Il s’agit de la valeur du compteur d’emplacement
correspondant à l’instruction traitée.

Numéro de Adresse en Taille (en


hexadécimal
ligne Programme Valeur Compteur octets)
d’emplacement +
1 Debut CHA Zone 0000 3

2 ADD Deux 0003 3

3 Suite COMP Max 0006 3

4 BEG Fin 0009 3

5 ADD Trois 000C 3

6 BRI Suite 000F 3

7 Fini RNG Result 0012 3

8 Fin 0015 1

9 Zone DEC 17 0016 2

10 Deux RES 4 0018 4

11 Trois DEC 3 001C 2

12 Result RES 2 001E 2

13 Max DEC 26 0020 2

END

Remarque

FIN est sur un octet : code opération.

3
Zone DEC 17 est sur 2 octets, DEC est une directive d’assemblage(ordre à
l’assembleur) qui définit la valeur 17 sur 2 octets (un mot), 17 occupe deux
octets).

Deux Res 4 a comme conséquence de réserver 4 octets. la taille de cet


emplacement à réserver est donc de 4.

En parcourant le programme, à chaque fois que nous obtenons l'adresse


correspondant à un symbole, nous la mettons dans la table des symboles.

Nom Valeur (en Hex) Type


Debut 0000 Label (étiquette)
Suite 0006 Label
Fini 0012 Label
Zone 0016 Data mot
Deux 0018 Data octet
Trois 001C Data Mot
Result 001E Data octet
Max 0020 Data Mot

La deuxième passe consiste à parcourir le programme et le traduire instruction par instruction


en se servant de la table des symboles et de la table des codes opération.
Voir la table des
Voir la table des codes opération symboles
(instruction) (données)

Numéro de *Adresse en Code en


hexadécimal=
ligne Code opération,
Programme hexadécimal
adressse ou bien
donnée

1 Debut CHA Zone 0000 00 0016

2 ADD Deux 0003 02 0018

3 Suite COMP Max 0006 06 0020

4
4 BEG Fin 0009 04 0012

5 ADD Trois 000C 02 001C


Réservation de 4
Le chiffre 17
octets
6 BRI Suite 000F
traduit en 05 0006
hexadécimal
7 Fini RNG Result 0012 01 001E

8 Fin 0015 99

9 Zone DEC 17 0016 0011

10 Deux RES 4 0018 ?? ?? ?? ??

11 Trois DEC 3 001C 0003

12 Result RES 2 001E ?? ??

13 Max DEC 26 0020 001A

END

Nous obtenons alors le programme objet (partie instruction + données)


‘ coloré en vert ’

b) Assembleur à une passes:

Principe de fonctionnement:

Dans ce cas, on parcourt le programme une seule fois. Une instruction qu'on ne
peut pas traduire directement (à cause d'une référence en avant) est mise dans la
table des instructions non assemblées.

Si l'instruction ne contient pas aucune référence en avant, on la traduit et on la met


dans la table des instructions assemblées.

A chaque fois qu'on arrive au niveau d'un symbole, on l'insère dans la table des
symboles. Si le symbole est connu, on précise sa valeur et on met le bit indiciel à
0. Sinon, on met le bit indiciel à 1 et on précise dans une file d'attente l'adresse de
l'instruction qui demande à utiliser le symbole et on poursuit le parcours du
5
programme. Une fois qu'on arrive au niveau de l'instruction étiquetée par le
symbole, on insère sa valeur dans la table des symboles, on se rapporte à l'adresse
contenue dans la file d'attente et on la met à jour au niveau de la table des
instructions non assemblées (puisqu'on connait désormais la valeur du symbole,
nous pouvons traduire l'instruction qui demande à l'utiliser).

Solution:

On parcourt le programme instruction par instruction du début à la fin.

Première ligne du programme:

-Comme le programme commence dans le cas d’un programme translatable par


l'adresse "0000", nous associons cette valeur au symbole "Début" et on l'insère
dans la table des symboles. et on met le bit indiciel à 0 pour indiquer que le
symbole est connu.

-Au niveau de cette instruction, nous avons aussi le symbole "Zone" qu'on insère
dans la table des symboles. Comme il s'agit d'une référence en avant, on met le
bit indiciel à 1 pour indiquer qu'on ne le connait pas et on met dans la file d'attente
correspondant au symbole l'adresse de l'instruction qui demande à l'utiliser
(0000).

-Comme l'instruction ne peut être traduite à cause du symbole inconnu (Zone),


nous l'insérons dans la table des instructions non assemblées.

Deuxième ligne du programme:

-Le symbole "Deux" est inconnu. On l'insère dans la table des symboles et on met
le bit indiciel à 1. On insère dans la file d'attente l'adresse de l'instruction en cours
qui demande à utiliser ce symbole (0003).

-Comme on ne connait pas encore la valeur de "Deux", on insère l'instruction dans


la table des instructions non assemblées avec son adresse.

Troisième ligne du programme:

-La valeur de "Suite" correspond à l'adresse de l'instruction en cours (0006). On


l'insère donc dans la table des symboles avec sa valeur. on ajuste le bit indiciel à
0 pour indiquer que cette valeur est connue.

-Le symbole Max est une référence en avant inconnue (car non rencontrée par
l’assembleur dans la zone label ou donnée). On l'insère dans la table des symboles

6
et on ajuste le bit indiciel à 1 pour indiquer que sa valeur est inconnue. On insère
dans la file d'attente l'adresse de l'instruction en cours qui demande à utiliser ce
symbole (0006).

-L'instruction n'est pas traduisible. On l'insère donc dans la table des instructions
non assemblées avec son adresse (adresse de l'instruction précédente+sa taille).

Lignes 4 et 5 du programme:

-Fini et Trois sont des symboles qui correspondent à des références en avant
inconnues. On met le bit indiciel à 1 pour indiquer que leurs valeurs sont
inconnues. On insère dans les files d'attente les adresses des instructions les
sollicitant (0009 et 000C respectivement).

-On insère les instructions correspondantes dans la table des instructions non
assemblées avec leurs adresses respectives.

Ligne 6 du programme: L'instruction est traduisible. on la met donc dans la table


des instructions assemblées (On connait la valeur du symbole Suite qui est sur la
table des symboles) avec son adresse (adresse de l'instruction de la ligne 5 + sa
taille).

Ligne 7 du programme:

-Nous avons la valeur de "Fini" (000F+3=0012). On met à jour la table des


symboles en ajoutant la valeur de fini et en mettant la valeur du bit indiciel à 0.
On consulte la file d'attente et on se rapporte à l'adresse qui y est contenu pour
mettre à jour l'instruction qui le sollicite dans la table des instructions non
assemblées.

-Nous mettons le symbole "Result" dans la table des symboles avec l'adresse de
l'instruction (ligne) en cours dans la file d'attente.

Ligne 8 du programme: L'instruction est traduisible, On l'insère dans la table des


instructions assemblées.

Ligne 9 du programme: Nous avons la valeur de "Zone". On met à jour la table


des symboles en ajoutant la valeur de "Zone" et en mettant la valeur du bit indiciel
à 0. Comme l'instruction est traduisible, on la met dans la table des instructions
assemblées.
.
.
.
.
. 7
.
.
.
Nom Valeur Bit File
(Hex) Indiciel d'attente
Debut 0000 0
Table des symboles (de l'inst.1 à 6)
Zone 0016 0 0000
Table des symboles (de l'inst.7 à 13)
Deux 0018 0 0003
Nom Valeur Bit File
Suite 0006 0
(Hex) Indiciel d'attente
Max 0020 0 0006
Debut 0000 0
Fini 0012 0 0009
Zone ------- 1 0000
Trois 001C 0 000C
Deux ------- 1 0003
Result 001E 0 0012
Suite 0006 0

Max ------- 1 0006

Fini ------- 1 0009

Trois ------- 1 000C

Mise à jour

Numéro Instruction : Adresse


code hexa
de ligne
1 00 0016 0000

2 02 0018 0003
3 06 0020 0006

8
4 04 0012 0009

Table des instructions non assemblées 5 02 001C 000C


7 01 001E 0012
Numéro Instruction : Adresse
Code opération,
de ligne
adresse ou
donnée
1 00 ---------- 0000

2 02 ---------- 0003
3 06 ---------- 0006
4 04 ---------- 0009
5 02 ---------- 000C
7 01 --------- 0012

Table des instructions assemblées

Numéro de Instruction ou donnée : Adresse


ligne code hexa
06 05 0006 000F
08 99 0015
09 0011 0016
10 ?? ?? ?? ?? 0018
11 0003 001C
12 ?? ?? 001E
13 001A 0020

Une fois le programme parcouru, nous fusionnons la table des inst. assemblées
et la table des inst. non assemblées selon l'ordre croissant des adresses (ou bien
des numéros de lignes).

Nous obtenons alors le programme objet (partie instruction + données) ‘en


vert’

9
Nous notons que le code hexadécimal généré correspond au code objet (partie
instructions + données) mais il ne correspond pas encore au code exécutable qui
sera obtenu après édition des liens (voir le chapitre 2).

10

Vous aimerez peut-être aussi