FR 2833729 A1 20030620 FR 0203260 A 20020315 PROCEDE ET DISPOSITIF DE TRAITEMENT D'INFORMATION La présente invention concerne un procédé et un dispositif de traitement d'informations. Elle s'applique, en particulier aux ordinateurs personnels, aux ordinateurs de réseau et aux serveurs informatiques. De plus en plus d'outils utilisés quotidiennement fonctionnent grâce à un ou plusieurs microprocesseurs. C'est le cas d'un micro-ordinateur, mais aussi d'un téléphone portable, d'une automobile, d'un appareil électroménager, par exemple. Ces microprocesseurs remplissent un rôle essentiel ou accessoire au sein de ces outils. Ces microprocesseurs peuvent recevoir et/ou envoyer des informations aux périphériques auxquels ils sont connectés. Depuis la naissance des microprocesseurs dans les années 1970, une multitude de modèles aux caractéristiques très différentes sont apparus sur le marché. Chaque fabricant de matériel électronique a amélioré ses produits, et fait des choix technologiques différents. Ce phénomène a été particulièrement prononcé pour les périphériques (cartes graphiques, imprimantes, capteurs, etc. ), qui se déclinent aujourd'hui sous des centaines de versions différentes. Cette hétérogénéité constitue aujourd'hui un frein. En effet, les programmes doivent être adaptés en autant de versions qu'il y a de microprocesseurs et de périphériques. De plus, les programmes doivent pouvoir communiquer entre eux de façon transparente, ce qui requiert une adaptation spécifique à chaque interlocuteur différent. Ces adaptations sont longues et coûteuses à réaliser. Pour résoudre ces problèmes, l'émulation est une solution parfois retenue. Un émulateur est un programme, exécuté sur une machine A (machine support), qui simule l'architecture matérielle d'une machine B. On peut ainsi utiliser les programmes originellement conçus pour la machine B sur la machine A. On factorise donc le travail d'adaptation des programmes de la machine B vers la machine A. Mais un émulateur est un programme complexe et long à réaliser. Il ne permet de simuler qu'une architecture matérielle en particulier. Mais surtout, il dépend de l'architecture de la machine A. Le problème n'est donc que partiellement résolu, puisque cette architecture matérielle A peut devenir obsolète et être remplacée par un modèle différent A', a priori incapable d'exécuter directement les programmes écrits pour la machine A. Les technologies Java (marque déposée) de Sun microsystems (marque déposée) ou VP (marque déposée) de Tao Group (marque déposée) se basent sur une machine virtuelle. Les techniques d'émulation permettent de mettre en oeuvre la machine virtuelle sur des architectures matérielles actuellement disponibles. Ces machines virtuelles ont été conçues comme de nouveaux standards de programmation. Elles sont destinées à uniformiser l'écriture et l'exécution des programmes en vue d'éliminer les incompatibilités. On observe que le même genre de problème se rencontre en linguistique. La Commission Européenne engage des dépenses considérables pour la traduction des documents de travail qu'elle génère et pour ses réunions. Les langues officielles doivent être traduites entre elles ce qui implique une démultiplication des traductions. Si toutes les langues étaient d'abord traduites dans une langue commune C (l'Anglais ou l'Espéranto par exemple), puis retraduites depuis cette langue C vers chaque langue officielle, le nombre de traducteurs nécessaires serait extrêmement réduit. Dans ce cas, l'étape supplémentaire dans le processus de traduction peut entraîner un délai, mais moins de moyens sont nécessaires. Cette solution peut être transposée au problème de l'hétérogénéité des architectures matérielles vu précédemment. Ainsi, la simulation de tous les programmes d'un ensemble de machines B, B', B",..., vers un ensemble de machines A, A', A",..., peut être simplifiée par l'utilisation d'une machine virtuelle C intermédiaire. En effet, il suffit d'écrire les émulateurs des machines B, B', B",..., pour la machine virtuelle C. Il faut ensuite écrire sur un type de machine A, ou tout autre type de machine A', A",..., l'émulateur de machine virtuelle C. On peut ainsi exécuter tout programme écrit pour les machines B, B', B",..., sur toute machine A, A', A",... Il y a factorisation du temps de travail puisque les programmes d'émulation de B, B', B",... vers C sont écrits une fois pour toutes. Cependant, l'émulateur C reste toujours complexe et long à écrire. Chaque aspect de la présente invention vise à répondre à tout ou partie de ces inconvénients. Selon un premier aspect, la présente invention vise un dispositif de traitement d'information, caractérisé par : - des machines virtuelles imbriquées, c'est-à-dire qu'une machine est émulée par une autre, hiérarchiquement de la plus simple à la plus complexe, c'est-à-dire qu'une machine donnée émule totalement une autre machine plus compliquée et élaborée, chaque machine virtuelle ayant une architecture originale, c'est-à-dire se différenciant de l'architecture des autres machines de la hiérarchie de machines virtuelles, chaque machine virtuelle étant adaptée à exécuter un programme d'émulation ou de compilation dynamique simulant l'architecture virtuelle plus complexe de niveau immédiatement supérieur, une machine virtuelle d'un niveau donné dans la hiérarchie possédant donc une architecture plus simple que celles de toutes les machines virtuelles de niveau supérieur ; - les langages machine des deux niveaux de machines virtuelles les plus bas de la hiérarchie sont spécifiquement conçus pour permettre l'exécution de toutes les opérations du niveau supérieur ; - un niveau de la hiérarchie, constituant le sommet de la hiérarchie, n'émule aucun autre niveau de la hiérarchie ; - tout niveau de la hiérarchie peut être lié à une machine réelle généraliste (la machine support) au moyen d'un programme exécutable d'émulation ou de compilation dynamique spécifique à cette machine réelle ; et - au moins une machine virtuelle dite"bimode"étant adaptée à être implémentée par un compilateur dynamique écrit pour une machine virtuelle d'un niveau inférieur ou une machine support réelle, et adaptée à être implémentée par un émulateur écrit pour une machine virtuelle d'un niveau inférieur ou une machine support réelle. On rappelle que le processus de compilation dynamique traduit une fois pour toutes un ensemble d'instructions d'un langage machine donné dans le langage machine de la machine support au lieu de le traduire au fur et à mesure (l'interpréter). L'avantage est que la compilation dynamique donne un résultat beaucoup plus efficace que l'émulation (le ralentissement induit par l'émulation du niveau un par une machine support réelle ou un niveau inférieur est réduit). On note que le processus de compilation dynamique est connu depuis plusieurs années. L'innovation de la machine de niveau un est de proposer une architecture logicielle (ou matérielle) relativement simple mais spécialement conçue pour la compilation dynamique, tout en respectant les caractéristiques de la hiérarchie d'émulateurs. Ainsi, selon son premier aspect, la présente invention vise un ensemble de machines virtuelles imbriquées hiérarchiquement dont la machine de base est une machine virtuelle C simplifiée à l'extrême, afin que le travail pour l'homme soit réduit au strict minimum lorsqu'il faut l'émuler sur des machines quelconques A, A', A",... En contrepartie, plus une machine virtuelle est d'un niveau hiérarchique bas, plus il est difficile de concevoir des programmes pour elle. C'est pourquoi elle exécute un émulateur qui va simuler une architecture plus complexe, d'un niveau supérieur, mais plus pratique à programmer pour l'humain. Il en est ainsi pour chaque machine virtuelle, jusqu'à ce que l'on atteigne le niveau de complexité adapté pour une utilisation donnée. La simplification offerte par la présente invention a pour contrepartie un nombre plus élevé d'opérations à exécuter pour la machine support (plus faible efficacité). Cependant la plus grande partie du travail pour disposer d'une machine virtuelle de complexité satisfaisante est effectuée par la machine support, puisque le programmeur n'a qu'à réaliser le programme d'émulation de la machine à la base de la hiérarchie. La présente invention reporte donc au niveau logiciel un maximum de la complexité d'une machine matérielle généraliste ordinaire, une machine généraliste étant une machine capable d'effectuer tout type d'opération mathématique. Ainsi, conformément au premier aspect de la présente invention, une machine virtuelle C simplifiée à l'extrême est mise en oeuvre, afin que le travail pour l'homme soit réduit lorsqu'il faut l'émuler sur des machines quelconques A, A', A",... Selon des caractéristiques particulières, une machine virtuelle à trente deux instructions est une machine bimode. Ainsi, cette machine satisfait trois objectifs : d'une part elle peut être simulée de façon suffisamment efficace par le niveau immédiatement inférieur (par exemple à quatre instructions) de la hiérarchie d'émulateurs ; d'autre part, elle possède un jeu d'instructions suffisamment riche pour permettre une programmation aisée de la plupart des problèmes algorithmiques courants ; enfin, elle dispose d'un langage machine facile à compiler dynamiquement sur n'importe quel type de machine support. Cette machine virtuelle bimode dispose de la plupart des opérations d'un processeur courant. L'exécution de tous les programmes de niveau supérieur peut reposer sur elle. La machine virtuelle bimode est simulée par un émulateur ou un compilateur dynamique, programme chargé de réaliser la traduction des opérations de la machine virtuelle de niveau un en opérations exécutables par la machine support. Selon des caractéristiques particulières, la machine virtuelle bimode utilise les mêmes protocoles de gestion des périphériques que ceux utilisés par les machines virtuelle de niveau hiérarchique inférieur (par exemple à deux ou quatre instructions). Selon des caractéristiques particulières, une machine virtuelle bimode possède deux espaces de mémoire distincts, l'un pour les données, dit"mémoire donnée", l'autre pour les programmes, dit"mémoire programme", pour être exécuté, un programme étant d'abord chargé en mémoire données, puis copié vers la mémoire programmes grâce à une instruction spécifique dite"de copie"de la machine bimode, la compilation dynamique intervenant exclusivement lors de l'exécution de cette instruction de copie. Selon des caractéristiques particulières, une machine bimode met en oeuvre des opérations de rupture de séquence (instructions Jcc, JP et JAR, ainsi que le mécanisme d'interruption) permettant au compilateur dynamique de prévoir systématiquement la destination du saut induit par la rupture de séquence. Grâce à ces dispositions, le processus de compilation dynamique est significativement simplifié. Selon des caractéristiques particulières, une machine bimode met en oeuvre une instruction répartissant la mémoire totale disponible entre les espaces de mémoire données et de mémoire programme. Ainsi, la quantité de mémoire disponible pour chaque espace mémoire peut être gérée. Selon des caractéristiques particulières, une machine bimode met en oeuvre une mise à jour optionnelle d'indicateurs d'état. Ceci permet d'accélérer l'exécution des programmes de la machine virtuelle bimode lorsqu'ils sont compilés dynamiquement vers un niveau hiérarchique inférieur. Selon des caractéristiques particulières, pour une machine virtuelle bimode, toutes les opérations relatives à la gestion et à l'accès à la mémoire respectent les contraintes d'un niveau hiérarchique inférieur. Selon un deuxième aspect, la présente invention vise un procédé de traitement d'information, caractérisé par : - au moins deux machines virtuelles imbriquées, c'est-à-dire qu'une machine virtuelle est émulée par une autre, hiérarchiquement plus simple et qu'une machine donnée émule totalement une autre machine plus compliquée et élaborée, chaque machine virtuelle ayant une architecture originale, c'est-à-dire se différenciant de l'architecture des autres machines de la hiérarchie de machines virtuelles, - chaque machine virtuelle étant adaptée à exécuter un programme d'émulation ou de compilation dynamique simulant l'architecture virtuelle plus complexe de niveau immédiatement supérieur, une machine virtuelle d'un niveau donné dans la hiérarchie possédant donc une architecture plus simple que toutes les machines virtuelles de niveau supérieur et - au moins une machine virtuelle étant adaptée à être implémentée par un compilateur dynamique écrit pour une machine virtuelle d'un niveau inférieur ou une machine support réelle, et adaptée à être implémentée par un émulateur écrit pour une machine virtuelle d'un niveau inférieur ou une machine support réelle. Les avantages, buts et caractéristiques particulières du deuxième aspect de la présente invention étant identiques à ceux du premier aspect, ils ne sont pas rappelés ici. D'autres avantages, buts et caractéristiques de la présente invention ressortiront de la description qui va suivre. Dans un but de concision, la description de la demande de brevet français (demande de brevet français numéro FR 01 16237, du 14 décembre 2001, titre"MACHINE UNIVERSELLE POUR LA SIMULATION D'UNE ARCHITECTURE INFORMATIQUE A VOCATION GENERALISTE"), dont la présente demande revendique la date de dépôt ("priorité interne"), n'est pas reprise ici. Dans un but de concision, la présente description ne porte que sur une machine virtuelle à trente deux instructions, appelée"machine virtuelle de niveau 1. 32","niveau 1. 32", "niveau 1" ou "machine virtuelle bimode". Cependant, la présente invention ne se limite pas à ce type de machine virtuelle. Conformément à la présente invention, le niveau 1.32 s'insère dans des machines virtuelles imbriquées, c'est-à-dire qu'une machine est émulée par une autre, hiérarchiquement de la plus simple à la plus complexe, c'est-à-dire qu'une machine donnée émule totalement une autre machine plus compliquée et élaborée, chaque machine virtuelle ayant une architecture originale, c'est-à-dire se différenciant de l'architecture des autres machines de la hiérarchie de machines virtuelles, chaque machine virtuelle étant adaptée à exécuter un programme d'émulation ou de compilation dynamique simulant l'architecture virtuelle plus complexe de niveau immédiatement supérieur, une machine virtuelle d'un niveau donné dans la hiérarchie possédant donc une architecture plus simple que celles de toutes les machines virtuelles de niveau supérieur. Les langages machine des deux niveaux de machines virtuelles les plus bas de la hiérarchie sont spécifiquement conçus pour permettre l'exécution de toutes les opérations du niveau supérieur ; un niveau de la hiérarchie, constituant le sommet de la hiérarchie, n'émule aucun autre niveau de la hiérarchie. Tout niveau de la hiérarchie peut être lié à une machine réelle généraliste (la machine support) au moyen d'un programme exécutable d'émulation ou de compilation dynamique spécifique à cette machine réelle. Conformément à la présente invention, le niveau 1.32 est prévu pour être compilé dynamiquement par un niveau inférieur ou une machine support réelle, en plus de pouvoir être émulé. On rappelle que le processus de compilation dynamique traduit un programme une fois pour toutes dans le langage machine de la machine support au lieu de le traduire au fur et à mesure (l'interpréter). La compilation dynamique donne un résultat beaucoup plus efficace que l'émulation (le ralentissement induit par l'émulation du niveau un par une machine support réelle ou un niveau inférieur est réduit). La machine de niveau un propose une architecture logicielle (ou matérielle) relativement simple mais spécialement conçue pour la compilation dynamique, tout en respectant les caractéristiques de la hiérarchie d'émulateurs exposée ci-dessus. Préférentiellement, la machine de niveau 1.32 possède deux espaces de mémoire distincts, l'un pour les données, l'autre pour les programmes. Pour pouvoir être exécuté, un programme doit d'abord être chargé en mémoire données, puis copié vers la mémoire programmes grâce à une instruction spécifique. La compilation dynamique intervient exclusivement lors de l'exécution de cette instruction de copie. D'autre part, la compilation dynamique est un processus d'ordinaire complexe qui pose un certain nombre de problèmes algorithmiques pour les processeurs actuellement disponibles. Le niveau 1.32 ayant été conçu dans l'optique d'être compilé dynamiquement, les inventeurs ont découvert des moyens permettant d'éviter la grande majorité de ces problèmes : - les opérations de rupture de séquence (instructions Jcc, JP et JAR, ainsi que le mécanisme d'interruption) sont aussi performantes que les opération équivalentes d'un processeur classique, mais permettent au compilateur dynamique de prévoir systématiquement la destination du saut induit par la rupture de séquence, ce qui simplifie significativement le processus de compilation dynamique ; - la mise en oeuvre de deux espaces de mémoire dédiés (mémoire données et mémoire programme) ; l'instruction PPC de transfert entre ces deux espaces ; l'instruction SMP répartissant la mémoire totale disponible entre ces deux espaces ; - la mise à jour des indicateurs d'état est optionnelle, mais permet d'accélérer l'exécution des programmes de niveau 1.32 lorsqu'ils sont compilés dynamiquement vers le niveau 0.4. ; toutes les opérations relatives à la gestion et à l'accès à la mémoire sont conçues pour respecter les contraintes du niveau hiérarchique inférieur (niveau 0.4), tout en permettant une programmation plus aisée. On note que la gestion des périphériques pour ce niveau 1.32 est strictement équivalente à celle présentée dans la demande de brevet de priorité, contrairement à ce qui y est mentionné (stipulant que la gestion des périphériques différait légèrement pour le niveau un). En référence au document de priorité, le niveau un représente un niveau intermédiaire de la hiérarchie de machines virtuelle, appelée"machine universelle". C'est le premier niveau de la hiérarchie disposant de la plupart des opérations d'un processeur courant. L'exécution de tous les programmes de niveau supérieur peut reposer sur lui. La machine virtuelle de niveau un est simulée par un émulateur ou un compilateur dynamique, programme chargé de réaliser la traduction des opérations de la machine virtuelle de niveau un en opérations exécutables par la machine support. La machine de niveau un est conçue pour satisfaire trois objectifs. D'une part pouvoir être simulée de façon suffisamment efficace par le niveau immédiatement inférieur (niveau 0.4) de la hiérarchie d'émulateurs composant la machine universelle ; d'autre part, proposer un jeu d'instructions suffisamment riche pour permettre une programmation aisée de la plupart des problèmes algorithmiques courants ; enfin, avoir un langage machine facile à compiler dynamiquement sur n'importe quel type de machine support. La machine de niveau un utilise les mêmes protocoles de gestion des périphériques que ceux utilisés par les machines de niveau inférieur (niveau zéro). FORMAT DES DONNEES L'unité élémentaire manipulable par la machine de niveau un est le mot de 16 bits. Les données ont une taille fixe de 16 bits. On note le bit de poids le plus faible (Least-Significant Bit, LSB) à droite du mot, et le bit de poids le plus fort (MostSignificant Bit, MSB) à gauche. Par convention, on numérote les bits du mot de 0 à 15, de droite à gauche. Les données sont enregistrées dans des fichiers au format binaire big endian (octet de plus fort poids stocké à l'adresse de plus faible numéro). Les données sauvées dans la mémoire de la machine support peuvent être au format little endian ou big endian . En effet, les programmes exécutés sur la machine de niveau un n'ont pas la possibilité de le vérifier, et n'en sont pas affectés. Par contre, en environnement multiprocesseur, il faut s'assurer que tous les processeurs utilisent le même format de données pour le stockage en mémoire. On rappelle que, par convention, un caractère $ précédant un nombre indique qu'il est exprimé en base hexadécimale. ORGANISATION DE L'ESPACE D'ADRESSAGE L'espace d'adressage de la machine de niveau un se partage en deux espaces disjoints aux fonctions différentes. Le premier est l'espace de mémoire programmes, dont la fonction est de stocker les programmes destinés à être exécutés. Ses adresses s'étendent de 0 à 232765-1. Le second est l'espace de mémoire données, dont la fonction est de stocker les données utilisées par les programmes pour leur fonctionnement. Ses adresses s'étendent de 0 à 232768-1. De plus, tout programme destiné à être exécuté doit être stocké en mémoire données avant d'être transféré vers la mémoire programmes. La structure des registres de contrôle de la machine de niveau un entraîne une vision paginée des deux espaces de mémoire. Ainsi, ces espaces sont vus comme étant découpés en pages de 8 Kmots pour l'exécution des programmes, ainsi que pour la lecture ou l'écriture des données. Ces pages sont des plages d'adresses de taille fixe, situées les unes à la suite des autres, et couvrant l'ensemble de chaque espace de mémoire. On définit par adresse valide, une adresse permettant d'accéder directement à une information 16 bits de façon bijective (exemples de supports de l'information : RAM, ROM, EEPROM,...). Une telle information n'est accessible que par le processeur virtuel. Toute autre adresse est dite adresse invalide, et provoque systématiquement l'exception si un programme tente d'y accéder. Dans chaque espace de mémoire, on distingue un espace exploitable, ainsi qu'un espace inexploitable, disjoint du premier, et situé immédiatement après. Ces deux espaces recouvrent la totalité de chaque espace de mémoire. L'espace exploitable correspond à l'ensemble des pages ne contenant que des adresses valides. L'espace inexploitable correspond à toutes les autres pages, uniquement composées d'adresses invalides. Chaque espace exploitable débute à l'adresse 0, se poursuit séquentiellement aux adresses 1, 2,3,..., et son adresse de fin dépend de la quantité de mémoire disponible ainsi que de sa répartition entre les deux espaces de mémoire. Chaque adresse pointe sur un mot de 16 bits. On définit par"espace adressable données" l'espace exploitable de l'espace de mémoire données. On définit par"espace adressable exécutable" l'espace exploitable de l'espace de mémoire programmes. Sa première page n'est pas accessible en écriture et n'est pas interruptible, car réservée au programme de gestion de l'exception, notamment appelé au démarrage de la machine. Un ensemble de pages de mémoire données peut être transformé en une page de mémoire programmes. Inversement, une page de mémoire programmes peut être transformée en un ensemble de pages de mémoire données. La première page de chaque espace adressable est toujours valide et n'est pas transformable. REGISTRES DU PROCESSEUR Mode Nom du registre Taille Rôle d'accès Lecture/Ro à R2047 16 bits 2048 registres internes à usage Écriture général. Lecture/MER 16 bits Registre de communication avec le Écriture (Mapper/Enumerator Cartographe/Enumérateur. Register) Écriture MBR 2048 mots Pointeur de base d'accès aux données (Memory Base Register) en mémoire. Implicite IP 13 bits Pointeur d'instruction dans la page de (Instruction Pointer) mémoire programmes en cours d'exécution. Implicite PP 2047 mots Pointeur sur la page de mémoire (Page Pointer) programmes en cours d'exécution. Implicite 1 1 bit Indicateur d'autorisation (Interrupt flag) d'interruption. L'interruption est autorisée ou inhibée pour la totalité d'une page de mémoire programmes. Implicite Z 1 bit Indicateur de valeur nulle. (Zero flag) Implicite N 1 bit Indicateur de signe négatif. (Negative flag) Implicite 0 1 bit Indicateur de dépassement de (Overflow flag) capacité en calcul signé. Implicite C 1 bit Indicateur de retenue en calcul non (Carry flag) signé. Implicite IV 2047 mots Numéro de la page de mémoire (Interrupt Vector) programmes à appeler en cas d'interruption. Implicite RI 16 bits Sauvegarde du registre R2047 pendant (R2047 Interrupt backup) le déroulement d'une interruption. Implicite IPI 13 bits Sauvegarde du registre IP pendant le (Instruction Pointer déroulement d'une interruption. Interrupt backup) Implicite PPI 2047 mots Sauvegarde du registre PP pendant le (Page Pointer Interrupt déroulement d'une interruption. backup) Implicite ZI 1 bit Sauvegarde du registre Z pendant le (Zero flag Interrupt déroulement d'une interruption. backup) Implicite NI 1 bit Sauvegarde du registre N pendant le (Negative flag Interrupt déroulement d'une interruption. backup) Implicite 01 1 bit Sauvegarde du registre 0 pendant le (Overflow flag Interrupt déroulement d'une interruption. backup) Implicite CI 1 bit Sauvegarde du registre C pendant le (Carry flag Interrupt déroulement d'une interruption. backup) CODAGE DES INSTRUCTIONS DU PROCESSEUR Chaque instruction élémentaire de la machine de niveau un a une taille fixe de 32 bits, à l'exception de l'instruction JAR dont la taille est variable. Dans le tableau ci-dessous, les bits sont notés selon les conventions suivantes : 0 = bit devant être mis à zéro 1 = bit devant être mis à un x = bit réservé dont la valeur doit être nulle f = mise à jour des indicateurs Z et N o = mise à jour de l'indicateur 0 c = mise à jour de l'indicateur C i = autorisation de l'interruption pour la page de mémoire programmes concernée d = numéro du registre destination s = numéro du registre source b = numéro du registre contenant le mot de poids faible du pointeur de base mémoire r = numéro du registre v = valeur immédiate m = masque sur MBR j = code de condition du saut a = adresse absolue t = taille de la table 1 = largeur d'adressage e = mise à jour du registre destination Syntaxe Codage MOVE Rd, Rs, ZNOC OOOOOddddddddddd focxxsssssssssss LDI Rd, &num;immOOOOlddddddddddd vvvvvvvvvvvvvvvv PPC Rb, I OOOlObbbbbbbbbbb xxxxixxxxxxxxxxx SMPRr OOOlIrrrrrrrrrrr xxxxxxxxxxxxxxxx LDR Rd, & masque, ZN 00100ddddddddddd fxxmmminmmmmmmmmm STR Rs, & masque, ZN OOlOlsssssssssss fxxmmmmmmmmmmmmm BLD Rd, & masque OOllOdddxxxxxxxx xxxmmmmmxxxxxxxx BST Rs, & masque 00111sssxxxxxxxx xxxmmmmmxxxxxxxx Jccadresse OlOOOxxxxxxxjjjj xxxaaaaaaaaaaaax JP Rr OlOOlrrrrrrrrrrr xxxxxxxxxxxxxxxx JAR Rr, &num;imm, pl,..., pn OlOlOrrrrrrrrrrr xxxxxxxxxxxxxttt LDB Rb, &num;imm 01011bbbbbbbbbbb xxxxxlllllllllll LDM Rs, ZN OllOOsssssssssss fxxxxxxxxxxxxxxx STM Rd, ZN OllOlddddddddddd fxxxxxxxxxxxxxxx SIP Rr OlllOrrrrrrrrrrr xxxxxxxxxxxxxxxx RTI Ollllxxxxxxxxxxx xxxxxxxxxxxxxxxx ADD Rd, Rs, ZNOCT 10000ddddddddddd focexsssssssssss ADC Rd, Rs, ZNOCTlOOOIddddddddddd focexsssssssssss SUB Rd, Rs, ZNOCT 10010ddddddddddd focexsssssssssss SBB Rd, Rs, ZNOCT 10011ddddddddddd focexsssssssssss MUL Rd, Rs, ZNT lOlOOddddddddddd fxxexsssssssssss DIV Rd, Rs, ZNT 10101ddddddddddd fxxexsssssssssss AND Rd, Rs, ZNT lOllOddddddddddd fxxexsssssssssss OR Rd, Rs, ZNT 10111ddddddddddd fxxexsssssssssss XOR Rd, Rs, ZN 11000ddddddddddd fxxxxsssssssssss ASR Rd, &num;imm, ZNCIlOOIddddddddddd fxcxxxxxxxxxvvvv LSL Rd, &num;imm, ZNOC 11010ddddddddddd focxxxxxxxxxvvvv LSR Rd, &num;imm, ZNOC 11011ddddddddddd focxxxxxxxxxvvvv ROL Rd, &num;imm, ZNC 11100ddddddddddd fxcxxxxxxxxxvvvv ROR Rd, &num;imm, ZNC 11101ddddddddddd fxcxxxxxxxxxvvvv RCL Rd, &num;imm, ZNC 11110ddddddddddd fxcxxxxxxxxxvvvv RCR Rd, &num;imm, ZNC lllllddddddddddd fxcxxxxxxxxxvvvv DESCRIPTION DU JEU D'INSTRUCTIONS DU PROCESSEUR Par convention, le symbole ± désigne la copie du terme situé à droite dans le terme situé à gauche. On parle d'affectation de variable. Les opérations arithmétiques ADD ADD without carry-Addition sans retenue Syntaxe : ADD Rd, Rs, ZNOCT Description : Ajoute le contenu du registre Rd avec le contenu du registre Rs. Le résultat est placé dans le registre destination Rd si T n'est pas mentionné. Opération : Rtmp F Rd + Rs ; Si T n'est pas mentionné, alors Rd ; les indicateurs mentionnés (f pour Z et N, o pour 0, et c pour C) sont mis à jour selon le résultat de l'addition. Codage : lOOOOddddddddddd focexsssssssssss sssssssssss : numéro du registre source Rs entre 0 et 2047 ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour o : si bit mis à 1, l'indicateur 0 est mis à jour c : si bit mis à 1, l'indicateur C est mis à jour e : si bit mis à 1, le registre Rd ne reçoit pas le résultat x : inutilisé, valeur indifférente ADC ADd with Carry-Addition avec retenue Syntaxe : ADC Rd, Rs, ZNOCT Description : Ajoute le contenu du registre Rd, le contenu du registre Rs, ainsi que l'indicateur de retenue C. Le résultat est placé dans le registre destination Rd si T n'est pas mentionné. Opération : Rtmp + Rs + C ; Si T n'est pas mentionné, alors Rd v Rtmp ; les indicateurs mentionnés (f pour Z et N, o pour 0, et c pour C) sont mis à jour selon le résultat de l'addition. Codage : 100 0 1ddddddddddd focexsssssssssss sssssssssss : numéro du registre source Rs entre 0 et 2047 ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour o : si bit mis à 1, l'indicateur 0 est mis à jour c : si bit mis à 1, l'indicateur C est mis à jour e : si bit mis à 1, le registre Rd ne reçoit pas le résultat x : inutilisé, valeur indifférente SUB SUBstract without borrow-Soustraction sans emprunt Syntaxe : SUB Rd, Rs, ZNOCT Description : Soustrait le contenu du registre Rs au contenu du registre Rd. Le résultat est placé dans le registre destination Rd si T n'est pas mentionné. Opération : Rtmp ; Si T n'est pas mentionné, alors Rd ; les indicateurs mentionnés (f pour Z et N, o pour 0, et c pour C) sont mis à jour selon le résultat de la soustraction. Codage : lOOlOddddddddddd focexsssssssssss sssssssssss : numéro du registre source Rs entre 0 et 2047 ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour o : si bit mis à 1, l'indicateur 0 est mis à jour c : si bit mis à 1, l'indicateur C est mis à jour e : si bit mis à 1, le registre Rd ne reçoit pas le résultat x : inutilisé, valeur indifférente SBB SuBstract with Borrow-Soustraction avec emprunt Syntaxe : SBB Rd, Rs, ZNOCT Description : Soustrait le contenu du registre Rs, ainsi que l'indicateur de retenue C (emprunt), du contenu du registre Rd. Le résultat est placé dans le registre destination Rd si T n'est pas mentionné. Opération : Rtmp ; Si T n'est pas mentionné, alors Rd ; les indicateurs mentionnés (f pour Z et N, o pour 0, et c pour C) sont mis à jour selon le résultat de la soustraction. Codage : 1OOllddddddddddd focexsssssssssss sssssssssss : numéro du registre source Rs entre 0 et 2047 ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour o : si bit mis à 1, l'indicateur 0 est mis à jour c : si bit mis à 1, l'indicateur C est mis à jour e : si bit mis à 1, le registre Rd ne reçoit pas le résultat x : inutilisé, valeur indifférente MUL Unsigned MULtiply-Multiplication non signée Syntaxe : MUL Rd, Rs, ZNT Description : Multiplie le contenu du registre Rd par le contenu du registre Rs. Les 16 bits de poids fort du résultat sont placés dans le registre Rad- ; qui précède immédiatement le registre destination Rd. Si T n'est pas mentionné, alors les 16 bits de poids faible du résultat sont placés dans le registre destination Rd. Opération : R1-1 (mod 2048) : Rtmp * Rs ; Si T n'est pas mentionné, alors Rd ; les indicateurs mentionnés (f pour Z et N) sont mis à jour selon les 16 bits de poids faible du résultat de la multiplication, éventuellement placés dans Rd. Codage : 101OOddddddddddd fxxexsssssssssss sssssssssss : numéro du registre source Rs entre 0 et 2047 ddddddddddd : numéro du registre destination RI entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour e : si bit mis à 1, le registre RI ne reçoit pas le poids faible du résultat x : inutilisé, valeur indifférente DIV Unsigned DIVide-Division non signée Syntaxe : DIV Rd, Rs, ZNT Description : Divise le contenu du registre RI par le contenu du registre Rs. Le reste est placé dans le registre RI-l qui précède immédiatement le registre destination Rd. Si T n'est pas mentionné, alors le quotient est placé dans le registre destination Rd. Opération : Rtmp # Rd div Rs ; Rd-1 (mod 2048) # Rd mod Rs ; Si T n'est pas mentionné, alors Rd - Rtmp ; les indicateurs mentionnés (f pour Z et N) sont mis à jour selon la valeur du quotient de la division, éventuellement placé dans Rd. En cas de division par 0 (Rs = 0), aucune opération n'est effectuée. Codage : 101Olddddddddddd fxxexsssssssssss sssssssssss : numéro du registre source Rs entre 0 et 2047 ddddddddddd : numéro du registre destination RI entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour e : si bit mis à 1, le registre Rd ne reçoit pas le quotient x : inutilisé, valeur indifférente Les opérations logiques AND Logical AND-ET logique Syntaxe : AND Rd, Rs, ZNT Description : Effectue le ET logique bit à bit entre le contenu du registre Rd et le contenu du registre Rs. Le résultat est placé dans le registre destination Rd si T n'est pas mentionné. Opération : Rtmp v Rd ET logique Rs ; Si T n'est pas mentionné, alors Rd ; les indicateurs mentionnés (f pour Z et N) sont mis à jour selon le résultat du ET logique. Codage : l0ll0ddddddddddd fxxexsssssssssss sssssssssss : numéro du registre source Rs entre 0 et 2047 ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour e : si bit mis à 1, le registre Rd ne reçoit pas le résultat x : inutilisé, valeur indifférente OR Logical OR-OU logique Syntaxe : OR Rd, Rs, ZNT Description : Effectue le OU logique inclusif bit à bit entre le contenu du registre Rd et le contenu du registre Rs. Le résultat est placé dans le registre destination Rd si T n'est pas mentionné. Opération : Rtmp v Rd OU logique Rs ; Si T n'est pas mentionné, alors Rd ; les indicateurs mentionnés (f pour Z et N) sont mis à jour selon le résultat du OU logique. Codage : l0lllddddddddddd fxxexsssssssssss sssssssssss : numéro du registre source Rs entre 0 et 2047 ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour e : si bit mis à 1, le registre Rd ne reçoit pas le résultat x : inutilisé, valeur indifférente XOR Logical exclusive OR-OU logique exclusif Syntaxe : XOR Rd, Rs, ZN Description : Effectue le OU logique exclusif bit à bit entre le contenu du registre Rd et le contenu du registre Rs. Le résultat est placé dans le registre destination Rd. Opération : Rd OU logique exclusif Rs ; les indicateurs mentionnés (f pour Z et N) sont mis à jour selon le résultat du OU logique exclusif. Codage : 11000ddddddddddd fxxxxsssssssssss sssssssssss : numéro du registre source Rs entre 0 et 2047 ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour x : inutilisé, valeur indifférente ASR Arithmetic Shift Right-Décalage arithmétique vers la droite Syntaxe : ASR Rd, &num;imm, ZNC Description : Décale vers la droite le contenu du registre Rd du nombre de bits indiqué par la valeur immédiate imm, comprise entre 0 et 15. A chaque décalage, le signe de la valeur décalée reste inchangé. Le résultat est placé dans le registre destination Rd. En cas de mise à jour, l'indicateur C correspond au dernier bit sorti. Opération : Rd décalé à droite de imm bits, le bit de poids fort restant inchangé à chaque décalage ; les indicateurs mentionnés (f pour Z et N, c pour C) sont mis à jour selon le résultat du dernier décalage. Codage : 110 0 1ddddddddddd fxcxxxxxxxxxvvvv vow : nombre de décalages imm entre 0 et 15 ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour c : si bit mis à 1, l'indicateur C est mis à jour x : inutilisé, valeur indifférente LSL Logical Shift Left-Décalage logique vers la gauche Syntaxe : LSL Rd, &num;imm, ZNOC Description : Décale vers la gauche le contenu du registre Rd du nombre de bits indiqué par la valeur immédiate imm, comprise entre 0 et 15. Le résultat est placé dans le registre destination Rd. En cas de mise à jour, l'indicateur C correspond au dernier bit sorti. Opération : Rd e Rd décalé à gauche de imm bits ; les bits entrant sont mis à 0 ; les indicateurs mentionnés (f pour Z et N, o pour 0, et c pour C) sont mis à jour selon le résultat du dernier décalage. Codage : 11010ddddddddddd focxxxxxxxxxvvvv vw : nombre de décalages imm entre 0 et 15 ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour o : si bit mis à 1, l'indicateur 0 est mis à jour c : si bit mis à 1, l'indicateur C est mis à jour x : inutilisé, valeur indifférente LSR Logical Shift Right-Décalage logique vers la droite Syntaxe : LSR Rd, &num;imm, ZNOC Description : Décale vers la droite le contenu du registre Rd du nombre de bits indiqué par la valeur immédiate imm, comprise entre 0 et 15. Le résultat est placé dans le registre destination Rd. En cas de mise à jour, l'indicateur C correspond au dernier bit sorti. Opération : Rd décalé à droite de imm bits ; les bits entrant sont mis à 0 ; les indicateurs mentionnés (f pour Z et N, o pour 0, et c pour C) sont mis à jour selon le résultat du dernier décalage. Codage : HOUddddddddddd foexxxxxxxxxvvvv vwv : nombre de décalages imm entre 0 et 15 ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour o : si bit mis à 1, l'indicateur 0 est mis à jour c : si bit mis à 1, l'indicateur C est mis à jour x : inutilisé, valeur indifférente ROL ROtate Left-Rotation logique vers la gauche Syntaxe : ROL Rd, &num;imm, ZNC Description : Rotation vers la gauche du contenu du registre Rd du nombre de bits indiqué par la valeur immédiate imm, comprise entre 0 et 15. Le résultat est placé dans le registre destination Rd. En cas de mise à jour, l'indicateur C correspond au bit de poids faible du résultat. Opération : Rd v Rotation de Rd de imm bits vers la gauche ; les indicateurs mentionnés (f pour Z et N, c pour C) sont mis à jour selon le résultat de la dernière rotation. Codage : 11100ddddddddddd fxcxxxxxxxxxvvvv vow : nombre de rotations imm entre 0 et 15 ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour c : si bit mis à 1, l'indicateur C est mis à jour x : inutilisé, valeur indifférente ROR ROtate Right-Rotation logique vers la droite Syntaxe : ROR Rd, &num;imm, ZNC Description : Rotation vers la droite du contenu du registre Rd du nombre de bits indiqué par la valeur immédiate imm, comprise entre 0 et 15. Le résultat est placé dans le registre destination Rd. En cas de mise à jour, l'indicateur C correspond au bit de poids fort du résultat. Opération : Rd de Rd de imm bits vers la droite ; les indicateurs mentionnés (f pour Z et N, c pour C) sont mis à jour selon le résultat de la dernière rotation. Codage : 111 0 1ddddddddddd fxcxxxxxxxxxvvvv vw : nombre de rotations imm entre 0 et 15 ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour c : si bit mis à 1, l'indicateur C est mis à jour x : inutilisé, valeur indifférente RCL Rotate with Carry Left-Rotation logique avec la retenue vers la gauche Syntaxe : RCL Rd, &num;imm, ZNC Description : Rotation vers la gauche du contenu du registre Rd, ainsi que de la retenue, du nombre de bits indiqué par la valeur immédiate imm, comprise entre 0 et 15. En cas de mise à jour de la retenue, chaque bit sortant par la gauche du registre Rd est placé dans la retenue. Dans tous les cas, le précédent contenu de la retenue entre par la droite du registre Rd. Le résultat est placé dans le registre destination Ri. Opération : Rd : C v Rotation de Ri : C de imm bits vers la gauche (ou bien, si l'indicateur n'est pas mis à jour, RJ décalé de imm bits vers la gauche, les bits entrant ayant même valeur que l'indicateur C) ; les indicateurs mentionnés (f pour Z et N, c pour C) sont mis à jour selon le résultat de la dernière rotation. Codage : llllOddddddddddd fxcxxxxxxxxxvvvv vow : nombre de rotations imm entre 0 et 15 ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour c : si bit mis à 1, l'indicateur C est mis à jour x : inutilisé, valeur indifférente RCR Rotate with Carry Right-Rotation logique avec la retenue vers la droite Syntaxe : RCR Rd, &num;imm, ZNC Description : Rotation vers la droite du contenu du registre Rd, ainsi que de la retenue, du nombre de bits indiqué par la valeur immédiate imm, comprise entre 0 et 15. En cas de rafraîchissement de la retenue, chaque bit sortant par la droite du registre Rd est placé dans la retenue. Dans tous les cas, le précédent contenu de la retenue entre par la gauche du registre Rd. Le résultat est placé dans le registre destination Rd. Opération : C : Rd v Rotation de C : Rd de imm bits vers la droite (ou bien, si l'indicateur n'est pas mis à jour, Ri v Rd décalé de imm bits vers la droite, les bits entrant ayant même valeur que l'indicateur C) ; les indicateurs mentionnés (f pour Z et N, c pour C) sont mis à jour selon le résultat de la dernière rotation. Codage : lllllddddddddddd fxcxxxxxxxxxvvvv vvvv : nombre de rotations imm entre 0 et 15 ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour c : si bit mis à 1, l'indicateur C est mis à jour x : inutilisé, valeur indifférente Les opérations de transfert MOVE MOVE register-Copie d'un registre Syntaxe : MOVE Rd, Rs, ZNOC Description : Copie le contenu du registre Rs dans le registre Rd. Opération : Rd ; les indicateurs mentionnés (f pour Z et N, o pour 0, et c pour C) sont mis à jour selon la valeur de Rs en ce qui concerne Z et N, et sont mis à 0 en ce qui concerne 0 et C. Codage : OOOOOddddddddddd focxxsssssssssss sssssssssss : numéro du registre source Rs entre 0 et 2047 ddddddddddd : numéro du registre destination RI entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour o : si bit mis à 1, l'indicateur 0 est mis à 0 c : si bit mis à 1, l'indicateur C est mis à 0 x : inutilisé, valeur indifférente 1 LDI LoaD Immediate into register-Chargement d'une valeur immédiate dans un registre Syntaxe : LDI Rd, &num;imm Description : Charge dans le registre Rd une valeur immédiate imm 16 bits. Opération : Rd e valeur immédiate imm sur 16 bits ; les indicateurs ne sont jamais affectés. Codage : OOOOlddddddddddd vvvvvvvvvvvvvvv wwvwwwwvvv : valeur immédiate imm entre 0 et 65535 (ou entre-32768 et +32767) ddddddddddd : numéro du registre destination Rd entre 0 et 2047 PPC Program Page Copy-Copie d'une page de programme Syntaxe : PPC Rb, I Description : Copie la page de mémoire données désignée par MBR, dont les 13 bits de poids faible sont considérés comme nuls, vers la page de mémoire programmes dont le numéro relatif à la page couramment exécutée est indiqué dans le registre Rb. Si la page de mémoire programmes désignée est invalide, ou bien si elle est correspond à la page en cours d'exécution (Rb = 0), alors l'exception est déclenchée. Si l'indicateur 1 est mentionné, alors les programmes situés dans la page destination seront interruptibles, sinon aucune interruption ne pourra intervenir lors de l'exécution de ces programmes. Opération : Tous les mots de la page de mémoire données désignée par les bits de poids fort de MBR (à partir du bit numéro 13) sont copiés vers la page de mémoire programmes indiquée. Si cette page est invalide ou en cours d'exécution, alors l'exception est déclenchée. Les données copiées dans la mémoire programmes sont prêtes à être exécutées. Le numéro de la page de mémoire programme cible de la copie est égal à PP + (Rb étendu par son signe). Codage : OOOlObbbbbbbbbbb xxxxixxxxxxxxxxx bbbbbbbbbbb : numéro du registre Rb entre 0 et 2047 i : si bit mis à 1, les interruptions seront autorisée pendant l'exécution du programme contenu dans la page copiée x : inutilisé, valeur indifférente LDR LoaD Register-Chargement d'un registre depuis la mémoire Syntaxe : LDR Rd, & masque d'adresse, ZN Description : Charge dans le registre Rd le mot situé en mémoire données à l'adresse résultant de la combinaison entre MBR et le masque d'adresse. Opération : Rd v contenu de la mémoire pointée par MBR, registre dont les 13 bits de poids faible sont combinés par un ET logique avec le masque d'adresse ; les indicateurs mentionnés (f pour Z et N) sont mis à jour selon la valeur du mot chargé. Codage : 001OOddddddddddd fxxnumimmcnimmnmmmm mmmmmmmmmmmmm : masque d'adresse sur 13 bits ddddddddddd : numéro du registre destination Rd entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour x : inutilisé, valeur indifférente STR STore Register-Sauvegarde d'un registre vers la mémoire Syntaxe : STR Rs, & masque d'adresse, ZN Description : Sauvegarde le registre Rs vers l'adresse de mémoire données résultant de la combinaison entre MBR et le masque d'adresse. Opération : emplacement de la mémoire pointé par MBR, registre dont les 13 bits de poids faible sont combinés par un ET logique avec le masque d'adresse ; les indicateurs mentionnés (f pour Z et N) sont mis à jour selon la valeur du mot sauvegardé. Codage : 001Olsssssssssss fxxmmmmmmmmmmmmm innmmmummninminmm : masque d'adresse sur 13 bits sssssssssss : numéro du registre source Rs entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour x : inutilisé, valeur indifférente BLD Burst LoaD-Chargement en rafale depuis la mémoire Syntaxe : BLD Rd, & masque d'adresse Description : Charge dans les 256 registres à partir de Rd les mots en mémoire données situés à partir de l'adresse pointée par MBR, dont les 8 bits de poids faible sont considérés comme nuls, et dont les bits 8 à 12 sont combinés par un ET logique avec les bits correspondant du masque d'adresse. Le registre de départ Rd peut être au choix l'un des registres Ro, R256, R512, R768, R1024, R1280, R1536, ou R1792. Opération : L'opération suivante est répétée pour i allant de 0 à 255 : Rd+1 v contenu de la mémoire pointée par (MBR ET logique (0 sur les bits 0 à 7 d'une part, et masque d'adresse sur les bits 8 à 12 d'autre part)) + i. Codage : OOll0dddxxxxxxxx xxxmmmmmxxxxxxxx ddd : 000=Ro, 001 = R256, 010=R5) 2,..., 110 = R1536, 111 = Rl792 mmmmm : masque d'adresse sur 5 bits, appliqué aux bits 8 à 12 de MBR x : inutilisé, valeur indifférente BST Burst Store-Sauvegarde en rafale vers la mémoire Syntaxe : BST Rs, & masque d'adresse Description : Sauvegarde les 256 registres à partir de Rs vers les adresses de mémoire données situées à partir de l'adresse pointée par MBR, dont les 8 bits de poids faible sont considérés comme nuls, et dont les bits 8 à 12 sont combinés par un ET logique avec les bits correspondant du masque d'adresse. Le registre de départ Rs peut être au choix l'un des registres Ro, R256, R512, R768, R1024, R128o, R1S36, ou R1792. Opération : L'opération suivante est répétée pour i allant de 0 à 255 : emplacement de la mémoire pointé par (MBR ET logique (0 sur les bits 0 à 7 d'une part, et masque d'adresse sur les bits 8 à 12 d'autre part)) + i -Rs+i. Codage : 00111sssxxxxxxxx xxxmmmmmxxxxxxxx sss : 000 = Ro, 001 = R256, 010 = R512,..., 110 = R1536, 111 = R1792 mmmmm : masque d'adresse sur 5 bits, appliqué aux bits 8 à 12 de MBR x : inutilisé, valeur indifférente Les opérations de rupture de séquence Jcc Conditional Jump-Saut conditionnel Syntaxe : Jcc adresse Description : Saut conditionnel dans la page courante de mémoire programmes à une adresse absolue paire. Opération : Si condition cc remplie (voir tableau d'encodage de j j j j), alors IP absolue paire ; les indicateurs ne sont jamais affectés. Codage : 01000xxxxxxxjjjj xxxaaaaaaaaaaaax aaaaaaaaaaaa : bits 1 à 12 de l'adresse absolue destination du saut j j j j : codage de la condition de saut (voir tableau ci-dessous) x : inutilisé, valeur indifférente Condition (cc) Codage Description de la condition de saut (iiii) ZC 0000 Z=0 ZS 0001 Z=1 CC 0010 C=0 CS 0011 C=1 NC 0100 N=O NS 0101 N=l OC 0110 0=0 OS 0111 0=1 UG 1000 > (non signé) : C=0 et Z=0 ULE 1001 # (non signé) : C=1 ou Z=1 SG 1010 > (signé) : Z=0 et N=O SGElOH > (signé) : N=O SL 1100 (signé) : N#O SLE 1101 # (signé) : Z=1 ou Neo NCS NCS N=1 et C=1 1111 Toujours JP Relative Jump to other Page-Saut vers une autre page, relativement à la page courante Syntaxe : JP Rr Description : Saut long vers une autre page de mémoire programmes, relativement à la page courante, d'une amplitude de-32768 à +32767 pages indiquée par le contenu du registre Rr. Si la page destination est invalide, alors l'exception est générée. Opération : PPtmp + (Rr étendu par son signe) ; Si PPtmp pointe sur une page invalide, alors l'exception est générée ; Sinon PP ; IP ; les indicateurs ne sont jamais affectés. Codage : 01001rrrrrrrrrrr xxxxxxxxxxxxxxxx rrrrrrrrrrr : numéro du registre Rr entre 0 et 2047 x : inutilisé, valeur indifférente JAR Indirect Jump by pointer ARray-Saut indirect par table de pointeurs. Syntaxe : JAR Rr, &num;imm, pointeurl, pointeur2, pointeur3,..., pointeur (2imm) Description : Saut absolu dans la page courante de mémoire programmes à une adresse paire par choix d'un pointeur dans une table. La taille de la table est une puissance de 2 dont l'exposant imm est compris entre 1 et 8. Lorsqu'une des entrées de la table est la cible d'un saut absolu, alors le saut pointe systématiquement sur l'instruction suivante (après la table). Opération : IP v pointeur situé à l'adresse de l'instruction + 2 + (Rr modulo tam) ; les indicateurs ne sont jamais affectés. Codage : OlOlOrrrrrrrrrrr xxxxxxxxxxxxxttt xxxaaaaaaaaaaaax... xxxaaaaaaaaaaaax 2'+'motus rrrrrrrrrrr : numéro du registre Rr entre 0 et 2047 ttt : exposant imm-1 entre 0 et 7 aaaaaaaaaaaa : bits 1 à 12 d'une adresse absolue dans la table x : inutilisé, valeur indifférente Les opérations sur les registres spéciaux LDB LoaD Memory Base Register-Chargement du registre de base mémoire Syntaxe : LDB Rb, &num;imm Description : Charge les imm mots de poids faible du registre de base mémoire MBR à partir du registre Rb et éventuellement des registres précédents, Rb étant chargé dans le mot de plus faible poids de MBR. L'éventuelle portion de poids fort restante du registre MBR n'est pas affectée. Si l'adresse de mémoire données désignée est invalide, alors l'exception est déclenchée. Opération : MBRp mm+ ! (mod2048) :.-. : Rb ; Si MBRtmp pointe sur une adresse invalide, alors l'exception est déclenchée ; Sinon, les imm mots de poids faible de MBR ; les indicateurs ne sont jamais affectés. Codage : 01011bbbbbbbbbbb xxxxxlllllllllll 11111111111 : valeur immédiate imm-l entre 0 et 2047 bbbbbbbbbbb : numéro du registre Rb entre 0 et 2047 x : inutilisé, valeur indifférente LDM LoaD Mapper/Enumerator Register-Chargement du registre du Cartographe/Enumérateur Syntaxe : LDM Rs, ZN Description : Charge le contenu du registre Rs dans le registre MER. En cas de manipulation incorrecte du registre MER, l'exception est déclenchée. Opération : MER Les indicateurs mentionnés (f pour Z et N) sont mis à jour selon la valeur chargée dans le registre MER. L'exception peut être déclenchée au cours du chargement, après la mise à jour éventuelle des indicateurs. Codage : Oll00sssssssssss fxxxxxxxxxxxxxxx sssssssssss : numéro du registre source Rs entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour x : inutilisé, valeur indifférente STM STore Mapper/Enumerator Register-Sauvegarde du registre du Cartographe/Enumérateur Syntaxe : STM Rd, ZN Description : Sauvegarde le contenu du registre MER dans le registre RI. Si l'instruction est située dans une page non interruptible, alors cette instruction ne pourra en aucun cas déclencher une interruption. Si l'instruction est située dans une page interruptible, et qu'aucune commande du Cartographe/Enumérateur n'est en cours, alors l'instruction STM garantit une prise en compte immédiate d'une éventuelle interruption en attente. En cas de manipulation incorrecte du registre MER, l'exception est déclenchée. Opération : Rd Les indicateurs mentionnés (f pour Z et N) sont mis à jour selon la valeur sauvegardée depuis le registre MER. L'exception peut être déclenchée au cours de la sauvegarde, avant la mise à jour éventuelle des indicateurs. Codage : OllOlddddddddddd fxxxxxxxxxxxxxxx ddddddddddd : numéro du registre destination Rj entre 0 et 2047 f : si bit mis à 1, les indicateurs Z et N sont mis à jour x : inutilisé, valeur indifférente L'opération de réglage de la partition de la mémoire SMP Set Memory Partition-Réglage de la partition de la mémoire Syntaxe : SMP Rr Description : Répartit la mémoire centrale disponible entre la mémoire programmes et la mémoire données, relativement à la répartition courante, et met à 0 le registre MBR. Le contenu du registre Rr indique le nombre de pages à ajouter ou à retirer à la mémoire programmes. Toute page ajoutée à la mémoire programmes retire un nombre déterminé de pages de la mémoire données. Inversement, toute page retirée de la mémoire programmes ajoute un nombre déterminé de pages à la mémoire données. Lorsque le nombre de pages de mémoire données, non comprise la première page, n'est pas suffisant pour ajouter le nombre de pages de mémoire programmes indiqué, alors l'exception est déclenchée. De même, elle est déclenchée lorsqu'il n'y a pas assez de mémoire programmes pour retirer le nombre de pages indiqué, la première page ne pouvant jamais être retirée. Enfin, si la page de mémoire programmes courante, dans laquelle se situe l'instruction SMP exécutée, doit être invalidée par cette instruction, alors l'exception est également déclenchée. En cas d'exception, la partition mémoire n'est pas modifiée, mais MBR est mis à 0. Opération : MBR ; Si la nouvelle partition est invalide, au regard des quantités de mémoires programmes et données disponibles, alors l'exception est déclenchée ; Sinon, / ajoute ou retire le nombre de pages de mémoire programmes indiqué par le contenu du registre Rr (considéré comme signé). Si le contenu du registre Rr est nul, alors la partition mémoire reste inchangée. L'ajout d'une page de mémoire programmes se traduit toujours par l'invalidation de n pages de mémoire données à partir de la dernière page valide, et la validation de la page de mémoire programmes située après la dernière page valide. Une page nouvellement ajoutée à la mémoire programmes déclenche l'exception si l'on tente de l'exécuter avant de l'avoir initialisée par une instruction PPC. Inversement, la suppression d'une page de mémoire programmes se traduit toujours par la validation de n pages de mémoire données situées immédiatement à la suite de la dernière page valide, et l'invalidation de la dernière page valide de mémoire programmes. Tous les mots de ces nouvelles pages de mémoire données prennent la valeur 0. Le nombre n de pages de mémoire données ajoutées ou retirées dépend de l'implémentation du processeur. II est compris entre 1 et 8 (inclus). Codage : OOOllrrrrrrrrrrr xxxxxxxxxxxxxxxx rrrrrrrrrrr : numéro du registre Rr entre 0 et 2047 x : inutilisé, valeur indifférente Les opérations relatives à l'interruption SIP Set Interrupt Page-Défini la page du programme d'interruption Syntaxe : SIP Rr Description : Défini la page de mémoire programmes à appeler en cas d'interruption, dont le numéro est indiqué relativement à la page couramment exécutée dans le registre Rr. Opération : IV + (Rr étendu par son signe) Codage : Olll0rrrrrrrrrrr xxxxxxxxxxxxxxxx rrrrrrrrrrr : numéro du registre Rr entre 0 et 2047 x : inutilisé, valeur indifférente RTI ReTum from Interrupt-Retour d'interruption Syntaxe : RTI Description : Reprend le déroulement normal du programme interrompu par l'interruption en restaurant certains registres du processeur. Si la page de retour est invalide, l'exception est déclenchée. Opération : Si PPI pointe sur une page invalide, alors l'exception est déclenchée ; Sinon Z ; N ; 0 ± 01 ; C ; R2047 ; PP ; IP Codage : Ollllxxxxxxxxxxx xxxxxxxxxxxxxxxx x : inutilisé, valeur indifférente L'EXCEPTION ET L'INTERRUPTION L'exception et l'interruption sont des mécanismes qui déroutent l'exécution séquentielle des programmes sous certaines conditions. L'exception Le mécanisme d'exception déroute l'exécution séquentielle des instructions lorsqu'une instruction tente d'effectuer une opération invalide. Elle sauvegarde alors le registre PP dans la première page de mémoire données. Ci-dessous, [adresse] représente une adresse dans la première page de mémoire données. L'exception se déroule comme suit : - Appel au sous-programme de réinitialisation du Cartographe/Enumérateur. [0] - [1] à [n] ± registre PP, du mot de plus fort poids au mot de plus faible poids - PP ± 0 - IP Lors du premier démarrage de la machine, tous les registres de la machine présentés précédemment (sauf le registre MER) sont mis à 0, puis l'exception est déclenchée. Outre le démarrage, la cause de déclenchement d'une exception est le chargement de MBR avec une adresse invalide, le chargement de PP avec un numéro de page invalide, la copie d'une page de mémoire données vers une page de mémoire programmes invalide, une répartition invalide entre les mémoires données et programmes, ou bien une opération illégale sur le registre MER. L'interruption Le mécanisme d'interruption en niveau un interrompt l'exécution séquentielle des instructions. L'interruption ne peut survenir que pendant l'exécution d'un programme situé dans une page interruptible. Elle ne peut en aucun cas intervenir au cours de l'exécution d'une instruction, mais seulement entre deux instructions. D'autre part, dans le cas d'une page interruptible, à partir du moment où l'interruption est demandée par le Cartographe/Enumérateur, un maximum de 16 instructions peuvent être exécutées avant le déroutement vers la page du programme d'interruption. En cas d'interruption, le mécanisme est le suivant : - Sauvegarde les registres PP et IP dans les registres internes PPI et IPI - Sauvegarde le registre R2047 dans le registre interne RI - Sauvegarde les indicateurs Z, N, 0 et C dans les indicateurs internes ZI, NI, 01 et CI - R2047 numéro du périphérique ayant déclenché l'interruption (fourni par le Cartographe/Enumérateur) Si IV désigne une page de mémoire programmes invalide o Déclenche l'exception Sinon o Sinon 0 IP Pour revenir au programme qui a été interrompu, le programme de gestion de l'interruption doit exécuter une instruction RTI. Le retour d'interruption est alors déclenché. Les registres PP et IP sont restaurés à partir de PPI et IPI ; R2047 est restauré à partir de RI ; Z, N, 0, et C sont restaurés à partir de ZI, NI, 01, et CI respectivement. Le programme de démarrage Ce programme est appelé immédiatement après le déclenchement d'une exception et prend en charge la machine de niveau un. Il débute obligatoirement à l'adresse 0 de la première page de mémoire programmes. C'est une succession de codes d'instructions de niveau un qui peuvent contenir n'importe quel programme dans la limite de la première page de mémoire programmes. REVENDICATIONS 1-Dispositif de traitement d'information, caractérisé par : - des machines virtuelles imbriquées, c'est-à-dire qu'une machine est émulée par une autre, hiérarchiquement de la plus simple à la plus complexe, c'est-à-dire qu'une machine donnée émule totalement une autre machine plus compliquée et élaborée, chaque machine virtuelle ayant une architecture originale, c'est-à-dire se différenciant de l'architecture des autres machines de la hiérarchie de machines virtuelles, chaque machine virtuelle étant adaptée à exécuter un programme d'émulation ou de compilation dynamique simulant l'architecture virtuelle plus complexe de niveau immédiatement supérieur, une machine virtuelle d'un niveau donné dans la hiérarchie possédant donc une architecture plus simple que celles de toutes les machines virtuelles de niveau supérieur ; - les langages machines des deux niveaux de machines virtuelles les plus bas de la hiérarchie sont spécifiquement conçus pour permettre l'exécution de toutes les opérations du niveau supérieur ; - un niveau de la hiérarchie, constituant le sommet de la hiérarchie, n'émule aucun autre niveau de la hiérarchie ; - tout niveau de la hiérarchie peut être lié à une machine réelle généraliste (la machine support) au moyen d'un programme exécutable d'émulation ou de compilation dynamique spécifique à cette machine réelle ; et - au moins une machine virtuelle dite"bimode"étant adaptée à être implémentée par un compilateur dynamique écrit pour une machine virtuelle d'un niveau inférieur ou une machine support réelle, et adaptée à être implémentée par un émulateur écrit pour une machine virtuelle d'un niveau inférieur ou une machine support réelle. 2-Dispositif selon la revendication 1, caractérisé en ce que une machine virtuelle à trente deux instructions est une machine bimode. 3-Dispositif selon l'une quelconque des revendications 1 ou 2, caractérisé en ce que la machine virtuelle bimode utilise les mêmes protocoles de gestion des périphériques que ceux utilisés par les machines virtuelle de niveau hiérarchique inférieur. 4-Dispositif selon l'une quelconque des revendications 1 à 3, caractérisé en ce que une machine virtuelle bimode possède deux espaces de mémoire distincts, l'un pour les données, dit"mémoire donnée", l'autre pour les programmes, dit"mémoire programme", pour être exécuté, un programme étant d'abord chargé en mémoire données, puis copié vers la mémoire programmes grâce à une instruction spécifique dite"de copie"de la machine bimode, la compilation dynamique intervenant exclusivement lors de l'exécution de cette instruction de copie. 5-Dispositif selon l'une quelconque des revendications 1 à 4, caractérisé en ce que une machine bimode met en oeuvre des opérations de rupture de séquence (instructions Jcc, JP et JAR, ainsi que le mécanisme d'interruption) permettant au compilateur dynamique de prévoir systématiquement la destination du saut induit par la rupture de séquence. 6-Dispositif selon l'une quelconque des revendications 1 à 5, caractérisé en ce que une machine bimode met en oeuvre une instruction répartissant la mémoire totale disponible entre les espaces de mémoire données et de mémoire programme. 7-Dispositif selon l'une quelconque des revendications 1 à 6, caractérisé en ce que une machine bimode met en oeuvre une mise à jour optionnelle d'indicateurs d'état. 8-Dispositif selon l'une quelconque des revendications 1 à 7, caractérisé en ce que, pour une machine virtuelle bimode, toutes les opérations relatives à la gestion et à l'accès à la mémoire respectent les contraintes d'un niveau hiérarchique inférieur. 9-Procédé de traitement d'information, caractérisé par : - au moins deux machines virtuelles imbriquées, c'est-à-dire qu'une machine virtuelle est émulée par une autre, hiérarchiquement plus simple et qu'une machine donnée émule totalement une autre machine plus compliquée et élaborée, chaque machine virtuelle ayant une architecture originale, c'est-à-dire se différenciant de l'architecture des autres machines de la hiérarchie de machines virtuelles, - chaque machine virtuelle étant adaptée à exécuter un programme d'émulation ou de compilation dynamique simulant l'architecture virtuelle plus complexe de niveau immédiatement supérieur, une machine virtuelle d'un niveau donné dans la hiérarchie possédant donc une architecture plus simple que toutes les machines virtuelles de niveau supérieur et - au moins une machine virtuelle étant adaptée à être implémentée par un compilateur dynamique écrit pour une machine virtuelle d'un niveau inférieur ou une machine support réelle, et adaptée à être implémentée par un émulateur écrit pour une machine virtuelle d'un niveau inférieur ou une machine support réelle.