Académique Documents
Professionnel Documents
Culture Documents
I. Prsentation du sujet
Lapprentissage de la programmation passe par la connaissance de larchitecture des
ordinateurs, et en particulier par la comprhension de son lment central, savoir le
microprocesseur. Celle-ci peut tre ralise de deux manires complmentaires : soit dun point de
vue purement lectronique, cest--dire axe sur ses composants, soit dun point de vue fonctionnel,
plutt axe sur son mode de fonctionnement.
Cette deuxime approche induit la dcouverte, pour chaque microprocesseur, de langages de
bas niveau tels que le langage machine ou le langage dassemblage. Cette tape peut prsenter
quelques difficults, car les langages impratifs sont gnralement les seuls langages que
connaissent les tudiants. Or, ces langages, tant de haut niveau, nimposent pas un dcoupage aussi
strict des oprations effectues. Entres autres, labsence de structures de contrle telles que les if
ou les while , ainsi que de tableaux ou denregistrements dsaronne les nophytes.
Lobjectif de ce projet est de crer une application permettant de simuler lexcution dun
programme crit dans un langage dassemblage ressemblant celui du microprocesseur 8086. Cette
simulation ayant pour but de faciliter la comprhension dun langage dassemblage, elle se doit de
prsenter clairement lordre dexcution des instructions, leur impact sur les donnes, ainsi que sur
les diffrents lments manipuls par ce microprocesseur, que sont la pile, les registres et les flags.
Il existe dj de tels dbogueurs dans le commerce, mais lapprentissage de leur syntaxe et
de leur mode de fonctionnement ncessite de passer de nombreuses heures compulser la
documentation. Notre but est de crer un interprteur minimaliste, dun sous-ensemble du langage
dassemblage du 8086, trs rapidement comprhensible, mme pour un utilisateur nayant que peu
de connaissances sur ce microprocesseur.
Le langage retenu pour effectuer le dveloppement de cette application est Java. Lintrt
dutiliser ce langage est que Java est un langage objets, ce qui a permis deffectuer une modlisation
du problme sous forme de classes. A cela sajoutent les fonctionnalits offertes par ce langage en
terme dInterfaces Homme-Machine.
Dans un premier temps, nous allons prsenter succinctement les principales caractristiques
du microprocesseur Intel 8086. Ensuite nous aborderons nos choix dimplmentation, la
modlisation effectue et le fonctionnement de la partie mulant le 8086. Enfin, nous nous
intresserons plus particulirement lutilisation de linterface graphique de lapplication.
Page 1
/ 20
registres de segmentation :
-
Page 2
/ 20
Page 3
/ 20
la premire, introduite par le mot-cl DATA seul sur une ligne, est la partie de
dclaration des variables et des tableaux. Dans cette partie, on peut dclarer une
variable ou un tableau par ligne, avec la syntaxe suivante pour une variable :
nom_de_variable DW valeur_initiale
A titre de rappel, notre mulateur ne permet que de supporter les donnes reprsentes
par des mots non signes sur 16 bits, ce qui nautorise que les valeurs entires
comprises entre 0 et 65535.
-
la seconde, introduite par le mot-cl CODE seul sur une ligne, qui se termine la fin du
fichier, consiste en une liste dinstructions excuter. Ces instructions peuvent
comporter des tiquettes, et faire intervenir les variables et les tableaux dclars dans
la section DATA, ainsi que les registres et des constantes numriques. Chaque ligne ne
peut contenir quune instruction ou une tiquette.
Page 4
/ 20
CALL
RET
ADD
SUB
MUL
DIV
CMP
Formes acceptes
PUSH reg
POP reg
MOV reg1, reg2
MOV reg , var
MOV var , reg
MOV reg , cste
MOV reg1 , tableau[reg2]
MOV tableau[reg1], reg2
CALL etiquette
RET
ADD
ADD
ADD
ADD
SUB
SUB
SUB
SUB
MUL
MUL
MUL
MUL
DIV
DIV
DIV
DIV
reg , cste
reg1, reg2
reg , var
reg1, tableau[reg2]
reg , cste
reg1, reg2
reg , var
reg1, tableau[reg2]
cste
reg
var
tableau[reg]
cste
reg
var
tableau[reg]
JUMP
JE
JNE
JG
JGE
JL
JLE
INC
DEC
NOT
AND
OR
XCHG
LIRE
ECRIRE
Description
Empile le contenu du registre
Dpile dans le registre spcifi
Affecte le contenu du second paramtre au premier paramtre. Le
second paramtre reste inchang.
Page 5
/ 20
Linstruction LIRE ralise une demande dune valeur numrique depuis lmulateur, tandis
que linstruction ECRIRE ralise une criture dune valeur numrique. Ces oprations
dentre/sortie ne sont pas gres directement au niveau du processeur mais dlgues
lmulateur.
A titre dexemple, voici un programme calculant une moyenne de 5 valeurs.
; exemple : calcul de moyenne
; dclaration des donnes
DATA
Somme
DW 0
Moyenne DW 0
Maximum DW 5
Notes
DW[5]
; instructions excuter
CODE
start:
MOV AX, 0
MOV BX, 0
loop:
LIRE Notes[BX]
ADD AX, Notes[BX]
INC BX
CMP BX, Maximum
JNE loop
MOV Somme, AX
DIV BX
MOV Moyenne, AX
ECRIRE Moyenne
Ce programme consiste demander lutilisateur dentrer cinq valeurs, qui vont tre
stockes dans le tableau Notes . La somme de ces valeurs est place dans la variable Somme .
Enfin, la moyenne est calcule par division entire, puis est stocke dans la variable Moyenne .
Ce rsultat est renvoye en sortie.
Ce court programme illustre le format gnral dun fichier programme. On notera lordre
des deux blocs introduits par DATA et CODE, ainsi que la dclaration de commentaires et
dtiquettes.
2. Modlisation en classes
Le langage de programmation retenu pour ce projet tant Java, la modlisation a t
effectue sous la forme dun arbre de classes, afin dutiliser au mieux les possibilits offertes dans
ce domaine par ce langage, telles que lhritage et le polymorphisme.
Chaque concept de lmulateur, comme celui de variable, de tableau ,de pile, de programme,
de processeur, de mmoire, a t modlis laide de classes. Lmulateur lui-mme est reprsent
sous la forme dune classe.
Page 6
/ 20
Larbre de classe utilis pour la reprsentation des donnes (variables, registres, constantes,
tiquettes) de base est montr ci-contre :
Afin de stocker diverses donnes comme des variables et des tableaux, nous avons besoin
dune classe Donnee permettant de stocker une valeur
numrique. Cette valeur est en lecture seule. Cette classe est
la base dautres classes permettant de stocker une tiquette (une
donne en lecture seule associe un nom), une variable ou un
registre (tous deux des donnes en lecture/criture et associes
un nom).
La classe Variable sert modliser une variable ou
un registre. Pour distinguer les deux utilisations, un champ
sorte a t introduit, ainsi que deux variables de classe
permettant de fixer la sorte (variable ou registre) dun objet de
la classe Variable lors de sa construction.
La construction dune variable se fait partir dun nom,
dune valeur initiale et dune sorte. La valeur transmise est
stocke dans le champ valeurInitiale qui peut tre recopi
dans le champ valeur (qui stocke la valeur courante) par un
appel la mthode reinitialiser .
Les
tableaux
Tableau
termes
descriptif
de
dun nom et
Chaque cellule
des autres, on
modliser
une
constitu du nom
La construction dun tableau se fait partir dun nom et dune taille (un nombre de cellules).
La classe ListeVariables mentionne ci-dessus est utilise afin de modliser une liste
contenant un nombre quelconque de variables. Il sagit en fait dune classe tendant la classe Vector
auquel on ajoute un attribut Nom accessible en lecture seule et fix lors de la construction.
Page 7
/ 20
Le processeur manipule 3 types de donnes internes que sont les registres, les flags et la pile.
Les registres sont modliss par la classe Variable , dcrite prcdemment. Les flags, quant
eux, sont modliss par une classe Flag , illustre sur la page suivante :
Une instance de la classe Flag permet de contenir
un boolen ainsi que les deux accesseurs. Notez quil ny a pas
de constructeur particulier pour cette classe puisque le
processeur est seul matre des valeurs des flags.
La pile est modlise par une classe Pile tendant la classe Stack de Java. La pile ne
contient que des instances de la classe Donnee : la valeur dune variable (ou dun registre) est
place dans la pile grce la mthode getDonnee de la classe Variable .
2.3. Modlisation de la mmoire
Lors de la lecture dun fichier contenant un programme, chaque ligne est traduite en une
instruction excutable par le processeur. Celle-ci consiste en la donne dun code dinstruction pris
dans une liste de valeurs prdfinies, dun numro de ligne (qui fait office de numro dinstruction)
ainsi que dun boolen permettant de savoir si un point darrt (valable uniquement pendant
Page 8
/ 20
lexcution du programme) est plac sur cette instruction. Seules les vritables instructions ou les
tiquettes peuvent tre munies dun point darrt.
Les trois classes utilises pour modliser les
diffrentes sortes dinstructions (sans paramtre, unaire,
binaire) sont reprsentes ci-contre. Les instances de ces
classes sont cres au fur et mesure de la traduction dun
fichier source de programme et ce par la classe
Programme dcrite plus loin. Les instructions unaires
et binaires ont besoin respectivement dune (de deux)
instance(s) dune classe Param dcrite plus bas. Cette
classe abstraite est la classe de base de 4 sortes possibles
de paramtres.
Afin de dterminer le code dinstruction dune
ligne du programme, une liste de variable de classe a t
place dans la classe Instruction (52 codes possibles
lists en annexe).
Lors de lexcution dun programme, le
processeur utilisera directement ces instructions et les
excutera squentiellement.
Page 9
/ 20
une constante :
Dans ce cas le paramtre est reprsent par une instance de ParamConstante . La
valeur est stocke dans le champ valeur , accessible en lecture seule et fixe une fois
pour toutes lors de la cration de lobjet.
une tiquette :
Dans ce cas le paramtre est reprsent par une instance de ParamEtiquette .
Ltiquette est rfrence par le champ etiq . Une tiquette est accessible en lecture
seule. Le numro de ligne de ltiquette peut tre obtenu grce la mthode
getEtiquette .
2.5. Modlisation dun programme
Page 10
/ 20
20
Page 12
/ 20
Page 13
/ 20
2. Manuel de lutilisateur
La fentre principale, seule visible au dmarrage de lapplication, comporte quatre menus :
Fichier , Affichage , Excution et Aide . Voici un montage qui donne une description
rapide de laction effectue par chaque commande de menu.
Il est noter que seul le menu Fichier est actif au lancement de lapplication et quun
programme doit tre charg pour activer les menus Affichage et Excution , dans le but
dviter des incohrences telles que le dclenchement dune excution sans quun programme nait
t charg au pralable.
Pour charger un fichier, utilisez la commande Charger du menu fichier. Une bote de
dialogue souvre alors pour vous permettre den slectionner un. Il ny a aucune restriction sur les
noms de fichiers, mais celui qui est choisi doit contenir le code source dun programme, sans quoi
une erreur de lecture se produira, si le fichier est mal form du point vue syntaxique (instruction
inconnue, nombre ou type de paramtre incorrect, absence des mots cls CODE ou DATA). La
cohrence du code, ainsi que des donnes, ne sera vrifie quau cours de lexcution. Une fois le
fichier charg, son contenu apparat dans la fentre de Code Source et les autres fentres
souvrent en vue de lexcution du programme.
Page 14
/ 20
Page 15
/ 20
Une fois la valeur saisie, lexcution continue et une trace de cette opration apparat dans
la fentre d Entres/Sortie . Il est noter, au
risque de se rpter, que les valeurs saisir doivent
toujours tre comprises entre 0 et 65535. Si tel nest
pas le cas, la demande de valeur de renouvele
jusqu lobtention dune valeur correcte.
Lutilisateur peut aussi choisir dannuler la saisie de
la valeur. Dans ce cas, lexcution est interrompue.
Nom de la classe
TFenPrinc
TFenEditeurVar
TFenEditeurTab
TFenEditeurReg
TFenCodeSource
TFenEditeurPile
TFenEntreeSortie
Lors du chargement dun fichier, depuis le menu de la fentre principale, lapplication reoit
lordre de charger le fichier indiqu par lutilisateur. Ce chargement seffectue en trois tapes. La
premire consiste vider linterface, au cas o un autre programme aurait t charg
prcdemment. La deuxime transfre cette requte lmulateur (i.e. linstance de la classe
Machine ). La troisime met jour linterface partir des donnes traduites et mises
disposition par lmulateur. Cette remise jour de linterface comprend, entre autre, ltablissement
dune liaison entre dune part les diffrentes fentres de linterface et dautre part les donnes
rendues disponibles par lmulateur.
Les diverses commandes dexcution disponibles depuis linterface graphique sont
transmises lapplication par la fentre principale ou la fentre de Code Source (via les raccourcis
clavier mentionns prcdemment). Lapplication transmet, son tour, ces commandes
lmulateur, qui effectue leur traitement et retourne les rsultats. Ces derniers sont alors rcuprs
par lapplication, qui met jour linterface graphique en rponse aux changements de donnes
fournis par lmulateur, savoir les valeurs des variables, des registres, des flags, de la pile, du
point dexcution et des cellules des tableaux. Grce ce systme, il y a indpendance de linterface
graphique vis vis de lmulateur et toute communication entre ces deux sous-ensembles de
Page 16
/ 20
cette demande est prise en compte directement dans linstance de la classe Variable conservant
la valeur de cette donne. Si la valeur saisie est incorrecte, la valeur initiale est rtablie dans la zone
ddition de la donne. Pour les flags, la modification est prise en compte directement par linstance
correspondante de la classe Flag .
Le fait de basculer un point darrt depuis la fentre de code source transmet la requte
lapplication, qui la transmet son tour lmulateur. Ce dernier accepte le point darrt si la ligne
sur laquelle il doit tre plac contient une instruction ou une tiquette. Lmulateur refuse de placer
un point darrt sur toute autre ligne du fichier source.
Lors de lexcution dune instruction dentre ( LIRE ) ou de sortie ( ECRIRE ), il y a
galement un va-et-vient entre linterface graphique et lmulateur.
Lors dune lecture, lmulateur demande la saisie dune valeur lapplication. Celleci transmet la demande la fentre grant les entres/sorties, qui ouvre une boite de
dialogue qui spcifie llment pour lequel on dsire une valeur et qui invite
lutilisateur entrer celle-ci. Le fait dannuler cette saisie stoppe lexcution. Si la
saisie est valide, le rsultat est retourn lapplication qui le transmet son tour
lmulateur. Celui-ci peut alors poursuivre lexcution aprs avoir mmoris cette
nouvelle valeur.
Lors dune criture, lmulateur transmet lordre de sortie lapplication qui
transmet cet ordre la fentre grant les entres/sorties. Cette dernire effectue
simplement un affichage du nom de llment afficher ainsi que de sa valeur.
Page 17
/ 20
V. Conclusion
Lapprentissage de la programmation en assembleur tant une tche ardue pour un
programmeur, nous avons tent, au travers de cette application, de la lui faciliter. Son interface
conviviale, mettant laccent sur les bases en laissant les dtails trop techniques de cot, a pour
ambition daider le dbutant mieux apprhender le fonctionnement de lassembleur.
Du fait de linteractivit existante pendant lexcution dun programme, il est
particulirement ais de comprendre les effets de chaque instruction non seulement sur lordre
dexcution de celles-ci, mais aussi sur les donnes manipules (mmoire, pile, registres et flags).
En ce qui nous concerne, ce projet a t loccasion de dvelopper une vritable application
crite en Java, et ce en utilisant ses capacits en terme de gestion dinterfaces graphiques. Le fait de
programmer dans un langage objets nous a permis dapprendre modliser entirement un
problme laide dune hirarchie de classes. Dautre part, le fait que le stage soit en rapport troit
avec la programmation en assembleur et le fonctionnement dun microprocesseur nous a apport
une meilleure matrise de ces deux notions.
Page 18
/ 20
Bibliographie
James W.COFFRON, 8086/8088 fonctionnement et programmation , d. Micro Passion
Collection, 1983.
Steven GUTZ, Up to speed with Swing user interfaces with Java foundation classes , d.
Manning, 1998.
Mark C.CHAN, Steven W.GRIFFITH, Anthony F.IASI, 1001 Java Programmers Tips ,
d. Jamsa Press, 1997.
Sun, Java 2 Software Development Kit SE v1.3 :
http://java.sun.com/j2se/1.3/docs/index.html.
Sun, The Java Tutorial :
http://java.sun.com/docs/books/tutorial/index.html.
Page 19
/ 20
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
int
OPER_NOP = 0;
OPER_PUSH_REG = 1;
OPER_POP_REG = 2;
OPER_MOV_REG_REG = 3;
OPER_MOV_REG_VAR = 4;
OPER_MOV_VAR_REG = 5;
OPER_MOV_REG_CST = 6;
OPER_MOV_REG_TAB = 7;
OPER_MOV_TAB_REG = 8;
OPER_CALL_ETIQ = 9;
OPER_RET = 10;
OPER_ADD_REG_CST = 11;
OPER_ADD_REG_REG = 12;
OPER_ADD_REG_VAR = 13;
OPER_ADD_REG_TAB = 14;
OPER_SUB_REG_CST = 15;
OPER_SUB_REG_REG = 16;
OPER_SUB_REG_VAR = 17;
OPER_SUB_REG_TAB = 18;
OPER_MUL_CST = 19;
OPER_MUL_REG = 20;
OPER_MUL_VAR = 21;
OPER_MUL_TAB = 22;
OPER_DIV_CST = 23;
OPER_DIV_REG = 24;
OPER_DIV_VAR = 25;
OPER_DIV_TAB = 26;
OPER_CMP_REG_CST = 27;
OPER_CMP_REG_REG = 28;
OPER_CMP_REG_VAR = 29;
OPER_CMP_REG_TAB = 30;
OPER_JUMP_ETIQ = 31;
OPER_JG_ETIQ = 32;
OPER_JGE_ETIQ = 33;
OPER_JE_ETIQ = 34;
OPER_JNE_ETIQ = 35;
OPER_JL_ETIQ = 36;
OPER_JLE_ETIQ = 37;
OPER_INC_REG = 38;
OPER_DEC_REG = 39;
OPER_NOT_REG = 40;
OPER_AND_REG_REG = 41;
OPER_OR_REG_REG = 42;
OPER_XCHG_REG_REG = 43;
OPER_LIRE_REG = 44;
OPER_LIRE_VAR = 45;
OPER_LIRE_TAB = 46;
OPER_ECRIRE_CST = 47;
OPER_ECRIRE_REG = 48;
OPER_ECRIRE_VAR = 49;
OPER_ECRIRE_TAB = 50;
OPER_ETIQ = 51;
Page 20
/ 20
Page 21
/ 20
LERIA
Emulation graphique
du fonctionnement
dun microprocesseur
8086
Frdric BEAULIEU
Yan LE CAM
Universit dAngers
Dpartement Informatique