Le niveau ISA

publicité
Le niveau ISA ou la
macroarchitecture
• Les programmes ISA sont interprétés sur la
microarchitecture par le microprogramme.
• Pile
• Modèle mémoire
• Jeux d'instructions
La pile
• Les programmes possèdent des procédures et des
variables locales
• Où sont stockées les variables?
– à un emplacement déterminé: impossible (double
invocation)
– dans une zone mémoire nommée pile
• pas d'adresse absolue
• LV contient l'adresse de l'emplacement des variables
locales pour la procédure active
• SP l'adresse de la plus haute variable locale
• L'espace entre LV et SP stock les variables
Appel de plusieurs procédures et pile
•
•
•
•
La procédure A a 3 variables locales
La procédure B a 4 variables locales
La procédure C a 2 variables locales
La procédure D a 5 variables locales
La mémoire
est réutilisée
a)A est active b)Après appel de B par A c) Après appel de C par
B d) Après C et B et appel de D par A
Autre utilisation de la pile
• Stocker des opérandes:
A1=A2+A3;
Push A2 sur
la pile
Push A3 sur
la pile
Pop A2 et A3 de la
pile, addition et
Push le résultat
Pop du résultat
et stockage
dans A1
Le modèle mémoire IJVM
• Un tableau de 4 GByte ou 1 Gword
• Les instructions IJVM accèdent la mémoire
en indexant depuis des pointeurs
Opérandes
Constantes
Variables
locales
Programme
Adressage par mots
Adressage par octets
Instructions IJVM (Integer JAVA Virtual Machine)
byte, const,
varnum: 1octet
disp, index,
offset: 2 octets
Code Hexa
Mnémonique du langage d'assemblage
Instructions IJVM (Integer JAVA Virtual Machine)
• Push un mot: LDC_W, ILOAD, BIPUSH
• Pop un mot: POP, ISTORE
• Opérations arithmétiques: IADD, ISUB
• Opération booléennes: IOR, IAND
• Branchements:
– inconditionnel: GOTO
– conditionnels: IFEQ, IFLT, IF_ICMPEQ
– utilisation d'un offset de 16 bits: opcode+Offset dans
PC
• Appel de procédure: INVOKEVIRTUAL
• Retour de procédure: IRETURN
Traduction de l'assembleur vers le binaire
i, j et k sont les variables locales 1,2 et 3 respectivement
Code JAVA
Code assembleur JAVA
Code IJVM
Un exemple d'exécution
Numéros des instructions
Microinstructions et notations
• Idée: éviter de manipuler des champs de 36 bits
• Rester proche de la microarchitecture
– Un cycle par ligne
– Notation pour des opérations multiples concurrentes
• Solution:
ReadRegister=SP, ALU=INC, WSP, Read, NEXT_ADDRESS=122
Plus intuitivement:
SP=SP+1;rd
Exemples valides:
MDR=H+SP
MDR=SP+H
SP=MDR=SP+1
Exemples interdits:
Un seul registre peut être lu sur le bus B
MDR=SP+MDR
H=H-MDR
Opération interdite sur l'ALU
MAR=SP;rd
MDR=H
Confit sur la valeur de MDR
Opérations licites
Où SOURCE peut être:
MDR, PC, MBR, MBRU, SP, LV,
CPP, TOS ou OPC
Où DEST peut être:
MAR, PC, MDR, SP, LV, CPP,
TOS, OPC ou H
On peut ajouter à la notation:
H=MBR<<8
et
goto adresse
Utilisation des registres
• CPP, LV, SP : Adresses des constantes,
variables locales, dessus de pile
• PC: adresse du prochain octet à lire
• MBR: instruction de IJVM à exécuter
• TOS : valeur du sommet de pile (diminution
des références mémoire)
• OPC: registre sans fonction prédéfinie
Interpréteur d'instructions IJVM
• Une boucle qui fetch, décode puis exécute
les instructions IJVM
• Début de la boucle à l'adresse Main1:
PC contiendra l'octet
suivant le code opérateur
Recherche du
prochain octet
Branchement sur la partie du microprogramme
correspondant spécifiquement à l'instruction interprétée
Deux exemples
• MBR = 0
0 est l'adresse labelisée NOP1:
On ne fait rien et on retourne à Main1 pour exécuter le
code opérateur suivant
• MBR=0x60
0x60 est l'adresse correspondant à l'instruction IADD.
Le branchement est effectué au label iadd1:
L'opération IADD?
• Que fait l'opération IADD du point de vue
macroarchitecture?
– Pop deux mots
– Les additionne
– Push leur somme
• Point de vue microarchitecture:
– Le dessus de la pile est dans TOS mais le mot suivant
doit être lu en mémoire
– TOS doit être additionné avec le mot lu en mémoire
– Le résultat doit être écrit en mémoire en sommet de
pile et écrit dans TOS
Interprétation de IADD
Début de iadd
Préparation de la lecture du
deuxième mot de la pile
Deuxième
instruction de iadd
(second cycle)
Troisième
instruction de iadd
(troisième cycle)
Initialisation de la
lecture en mémoire
Préparation de l'addition
MPC reçoit Main1
Addition, sauvegarde dans Initialisation de
TOS et préparation de
l'écriture en
l'écriture en mémoire
mémoire
Autres instructions
• ISUB, IAND, IOR: quasi identiques à IADD
• DUP, SWAP, POP: faciles grâce à TOS
– POP : temps d'attente de lecture
• BIPUSH: Plus complexe car il y a une opérande:
BIPUSH
(0x10)
BYTE
Le contenu de MBR est valide car fetché lors de Main1
ILOAD
ILOAD
(0x15)
INDEX
L'octet suivant l'opcode représente un index
qui est la position d'une variable locale dans
l'espace dédié à ces dernières. On doit lire
cette variable puis l'écrire.
Instructions de branchement
GOTO offset
L'offset fait 2 octets. Il correspond à un saut de
(valeur de offset) par rapport à l'adresse du GOTO
0xA7
Situation au début de:
a) Main1
b) goto1
c) goto2
d) goto3
e) goto5
Instructions de branchement
IFLT offset
Passage de OPC dans l'ALU
pour récupérer le bit N
Les adresses T et F ne diffèrent que par le bit le plus à gauche
Instructions de branchement
IFEQ offset
IF_ICMPEQ offset
Equivalent à IFLT sauf l'utilisation du bit Z
Equivalent à IFEQ sauf l'utilisation des 2 premiers mots de la pile
Téléchargement