© Nino Silverio (octobre 1999) 1
La machine virtuelle
MaP
Le but de ce document est de fournir au lecteur une vue très simple du
fonctionnement d’un ordinateur au niveau de sa programmation en
langage machine.
Il s’agit d’un outil pédagogique n’ayant aucunément l’ambition de se
substituer à un produit professionnel du marché. L’avantage du
produit décrit dans ce document est:
d’être gratuit ;
de pouvoir être utilisé sur tout PC équipé d’un 80386 au moins;
d’être limité dans sa complexité afin justement de pouvoir être
utilisé dans un contexte d’enseignement.
La machine virtuelle MaP
2© Nino Silverio
1 L’architecture de la machine MaP
Le cœur de la machine virtuelle MaP est un processeur orienté pile
(stack machine). Outre le processeur proprement dit, la machine
contient de la mémoire centrale subdivisée en un segment de code et
un segment de données. Le processeur est doté de trois registres
spéciaux:
un compteur ordinal PC (program counter) pointant sur
l’instruction à exécuter;
un pointeur de pile SP (stack pointer) contenant l’adresse du
sommet de la pile, c’est-à-dire l’adresse du dernier mot mémoire
occupé dans le segment de données ;
le registre de base BP (base pointer) permettant d’accéder à des
mots mémoire du segment de données via un déplacement relatif
au contenu de ce registre.
Le segment de code et le segment de données sont physiquement
séparés. L’adresse de base de chacun des segments est 0. La fonction
du segment de code est de contenir le code machine que le processeur
doit exécuter.
Le segment de données sert à contenir les données que le programme
contenu dans le segment de code doit traiter ainsi que les résultats
que ce programme produit. Il est aussi l’endroit utilisé par le
processeur pour stocker des données temporaires. Le programmeur
peut utiliser le segment de données comme il l’entend, mais
généralement, il a intérêt, afin d’éviter tout conflit, de réserver
l’espace nécessaire au stockage des données et des résultats fixes
(alloués pour toute la durée de l’exécution du programme) en un bloc
processeur
MaP
segment de code segment de données
PC SPBP
Le jeu d’instructions de la machine MaP
© Nino Silverio 3
contigu à partir de l’adresse 0. Le segment de données aura ainsi la
structure usuelle suivante :
Ainsi, immédiatement après le dernier mot occupé par les données et
résultats débute ce que l’on appelle la pile d’exécution qui peut
s’étendre jusqu’à la fin du segment de données. Elle contiendra
toutes les données temporaires nécessaires à la bonne exécution du
programme. Cet espace mémoire croîtra et décroîtra au fur et à
mesure de l’exécution du programme.
2 Le jeu d’instructions de la machine MaP
Le processeur MaP est capable de traiter trois types différents de
données :
les nombres entiers (int) ;
les nombres décimaux (numeric) ;
les caractères (char).
La taille d’un mot mémoire du segment de données est tel qu’il peut
contenir un nombre entier ou un caractère. Un nombre décimal
nécessite deux mots mémoire du segment de données.
La taille d’un mot mémoire du segment de code est la moitié de celle
d’un mot mémoire du segment de données.
Dans l’implémentation proposée, un entier (int) peut prendre une
valeur allant de –2147483648 à +2147 483 647.
Structure du segment de données
données et résultats
fixes du programme
valeurs temporaires
La machine virtuelle MaP
4© Nino Silverio
Les caractères (char) sont représentés de manière interne en se basant
sur la codification ASCII.
Un numérique (numeric) peut prendre une valeur comprise entre
et .
Le processeur reconnaît 30 instructions de base parmi 58 instructions
possibles. En effet, la plupart des instructions existent en deux ou
trois versions suivant le type des données manipulées (int, numeric,
char).
Les instructions peuvent être classées de la manière suivante :
opérations arithmétiques : ADD, SUB, MULT, DIV, NEG
opérations logiques : AND, OR, NOT, EQ, GT, LS
instructions de rupture de séquence : CALL, RET, JF, JP
instructions de manipulation de la pile : DECR, INCR, DUPL,
ASSGN, LOAD, PAIBP, PUSH, STORE
instructions d’entrée-sortie : IN, OUT, OUTSTR
instructions spéciales : CALLS, HALT, NEWBP, RSTRBP.
Le code machine (exprimé en décimal) associé à chacune des
instructions est le suivant :
addi 0addn 1and 2
assgnc 3assgni 4assgnn 5
call 6calls 7contc 8
conti 9contn 10 decr 11
divi 12 divn 13 duplc 14
dupli 15 dupln 16 eqc 17
eqi 18 eqn 19 gtc 20
gti 21 gtn 22 halt 23
inc 24 ini 25 inn 26
incr 27 jf 28 jp 29
loadc 30 loadi 31 loadn 32
lsc 33 lsi 34 lsn 35
multi 36 multn 37 negi 38
negn 39 newbp 40 not 41
or 42 outc 43 outi 44
2.210
308
1.810
308
Le jeu d’instructions de la machine MaP
© Nino Silverio 5
2.1 Les opérations arithmétiques
Ces instructions existent pour le type entier ainsi que pour le type
numérique. Ainsi, par exemple, une opération d’addition de deux
entiers se fait à l’aide de l’instruction ADDI, alors qu’une instruction
d’addition de deux numériques se fait avec l’instruction ADDN.
L’ensemble des instructions arithmétiques s’écrit : ADDI, SUBI,
MULTI, DIVI, NEGI, ADDN, SUBN, MULTN, DIVN, NEGN.
Les instructions arithmétiques effectuent des opérations de calcul sur
les mots mémoire situés au sommet de la pile d’exécution. Elles ne
nécessitent pas d’opérandes car ceux-ci doivent se trouver sur le
sommet de la pile. Le compteur ordinal est incrémenté d’une unité à
la fin de chacune de ces instructions.
Voici la signification de ces instructions:
ADDI les deux opérandes entiers au sommet de la pile sont
additionnés et remplacés par le résultat entier de l’addition. Le
pointeur de pile décroît d’une unité.
SUBI l’opérande entier au sommet de la pile est soustrait de
l’opérande juste en dessous du sommet. Ces deux opérandes sont
remplacés par le résultat entier de la soustraction. Le pointeur de pile
décroît d’une unité.
MULTI les deux opérandes entiers du sommet de la pile sont
multipliés et remplacés par le résultat entier de la multiplication. Le
pointeur de pile décroît d’une unité.
DIVI l’opérande entier juste en dessous du sommet de la pile est
divisé par l’opérande entier du sommet de la pile. Ces deux
opérandes sont remplacés par le résultat entier de la division. Le
pointeur de pile décroît d’une unité. Dans le cas où le diviseur vaut 0,
une erreur est détectée et l’exécution est arrêtée.
outn 45 outstr 46 paibp 47
pushc 48 pushi 49 pushn 50
ret 51 rstrbp 52 storec 53
storei 54 storen 55 subi 56
subn 57
1 / 26 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !