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