FR 2667171 A1 19920327 FR 9011818 A 19900925 SUPPORT PORTABLE A MICRO-CIRCUIT FACILEMENT PROGRAMMABLE ET PROCEDE DE PROGRAMMATION DE CE MICRO-CIRCUIT La présente invention a été faite en collaboration avec le LABORATOIRE D'INFORMATIQUE FONDAMENTALE DE LILLE et avec le CENTRE D'ETUDES ET DE RECHERCHES EN INFORMATIQUE MEDICALE dépendant respectivement de l'Université de Sciences et Techniques de Lille et de l'Université de Droit et de la Santé de Lille. La présente invention a pour objet un support à micro-circuit dont le micro-circuit est facilement programmable ainsi qu'un procédé de programmation de ce micro-circuit. Elle trouve plus particulièrement son application dans le domaine dit des cartes à puces. Dans ce cas le support est une carte au format carte de crédit.L'invention a pour objet de mettre à la disposition des programmeurs, pour des applications diverses devant avoir un caractère portable, la puissance de travail procurée par de tels supports. Par caractère portable on entend le fait que la carte, ou plus généralement un support quelconque de faible taille (quelques centimètres) et de faible poids (quelques centaines de grammes), peut en étant insérée dans un lecteur établir une transaction entre une machine reliée à ce lecteur et la carte. Cette transaction s'effectue alors selon un protocole et selon des instructions qui sont contenues dans la carte. La principale difficulté rencontrée avec les cartes à micro-circuit vient de ce que le microprocesseur dont elles sont sont pourvues est associé à une mémoire de travail (de type RAM, statique ou dynamique) de faible capacité, quelques fois seulement 128 octets, et à des mémoires programmes (ROM: la plupart du temps de type EPROM ou même EEPROM) elles aussi de très faible capacité, généralement limitée à quelques dizaines de kilooctets voire seulement à quelques kilooctets. De plus, les microprocesseurs des cartes sont généralement des microprocesseurs avec chacun un jeu d'instructions réduit. Ces microprocesseur sont même quelquefois assimilables à des micro-contrôleurs dont les bus d'échange ne sont pas en totalité accessibles depuis l'environnement extérieur du micro-circuit.La variété de conception de l'organe essentiel de traitement de ces microprocesseurs pour carte à micro-circuit a conduit à ce qu'il existe sur le marché un nombre important de microprocesseurs différents. On notera que ceci n'est pas le cas pour les gros microprocesseurs, avec jeu d'instructions important, dont la complexité a conduit à un nombre très limité de familles du fait du faible nombre des entreprises capables de les fabriquer. Dans le domaine des cartes à micro-circuit le programme représentatif de l'application à mettre en oeuvre est généralement stocké dans une mémoire morte non volatile contenue dans le micro-circuit. Cette diversité des microprocesseurs pour carte induit, pour le programmeur qui est désireux d'utiliser une carte à micro-circuit, la nécessité de connaître parfaitement le langage machine du microprocesseur utilisé. Ceci n'est pas possible si on veut pouvoir utiliser plusieurs types de microprocesseur différents. En outre, du fait du nombre limité d'instructions exécutables par les microprocesseur des cartes à micro-circuit, les langages de programmation dits évolués peuvent ne pas être complètement utilisables, il convient de les tester. Parmi ces langages évolués on fera référence, à titre d'exemple, aux langages dits C, COBOL, PASCAL, BASIC, ADA, ainsi qu'à de nombreux autres également connus. On rappelle que la programmation par un programmeur, une personne humaine, d'un programme informatique est facilitée par l'utilisation de ces langages évolués. En effet ces langages sont à la fois proches du langage parlé (les instructions sont claires: par exemple WRITE, IF, GO TO...), et puissants parce que chaque instruction en langage évolué est ainsi exprimée en raccourci (instruction donc non exécutable telle quelle par le microprocesseur de la carte), et qu'elle peut être transformée, automatiquement par la suite, en une série d'instructions en un langage machine, lui, compréhensible et exécutable par le microprocesseur. Cette transformation s'effectue en une opération ultérieure à la programmation et appelée COMPILATION. Si le langage n'est pas un langage évolué, mais uniquement un langage mnémonique dit assembleur, proche de celui du microprocesseur, le programme écrit en assembleur est transformé par une opération appelée ASSEMBLAGE en langage machine compréhensible par le microprocesseur. La COMPILATION consiste à transformer une instruction compacte en langage évolué, par exemple WRITE, en une série d'instructions en langage machine, toujours les mêmes pour cette instruction, directement exécutables par le microprocesseur. Par exemple dans le cas de cette instruction WRITE, la transformation par COMPILATION aura pour objet de produire des instructions par lesquelles le microprocesseur devra, successivement, charger, dans un registre d'échange avec la mémoire, la valeur à écrire, sélectionner par son adresse une cellule de la mémoire ou cette valeur doit être écrite, provoquer l'écriture, incrémenter son compteur d'instructions pour admettre une instruction suivante du programme, etc...Eventuellement le microprocesseur aura dû aller lire la valeur écrite et la comparer à la valeur à écrire pour valider ou recommencer cette écriture dans le cas où le microprocesseur doit exécuter un protocole sécurisé d'écriture. On comprend bien qu'il est plus facile pour le programmeur d'écrire "WRITE" que d'écrire, en langage machine, toutes les instructions du microprocesseur. Cependant, quand cela est nécessaire le programmeur écrit son programme dans un langage exécutable et compréhensible par le microprocesseur. Dans ce cas, plutôt que de lui imposer l'écriture fastidieuse des 1 et des 0 qui constituent, en langage machine, les seules expressions des instructions réellement exécutables par les microprocesseurs, on lui facilite la tâche en lui mettant à disposition un langage plus simple: le langage assembleur. Le langage assembleur est différent du langage évolué en ce sens qu'une instruction en langage assembleur est normalement transformée par l'opération d'ASSEMBLAGE en une seule instruction en langage machine, alors que la COMPILATION d'une instruction en langage évolué donne une série d'instructions en langage machine. On pourra retrouver toutes ces notions relatives aux microprocesseurs dans le livre: "COMPRENDRE LES MICROPROCESSEURS" de Daniel QUEYSSAC, éditions RADIO, France 1983. Dans le domaine des cartes à micro-circuit on est amené actuellement à demander aux programmeurs d'écrire leurs programmes en langage assembleur pour les raisons suivantes. Premièrement, pour ne pas occuper trop de place dans la mémoire programme de ces microprocesseurs, les programmes doivent être réduits à leur strict nécessaire. Ceci peut interdire l'emploi d'un langage évolué dont la traduction, au moment de la compilation, peut conduire à un nombre d'instructions plus important que ce qui est réellement nécessaire. Par exemple, ltopération de vérification d'écriture évoquée ci-dessus pourra être systématiquement produite par la COMPILATION, alors que, quand elle n'est pas justifiée, dans certains cas, on peut économiser de la place en mémoire en ne l'écrivant pas.Ceci conduit néanmoins à une difficulté supplémentaire de programmation puisqu'il faut faire attention à cette contrainte de place limitée. Deuxièmement, la variété des microprocesseurs nécessiterait de devoir compiler les programmes avec des compilateurs variés, adaptés pour chaque langage à chaque type de microprocesseur. En pratique de tels compilateurs ne sont pas disponibles. Par ailleurs dans ceux existants on constate une non allocation dynamique des variables des fonctions. Ceci implique, au vue des dimensions de la mémoire de travail une impossibilité d'utiliser la puissance des langages évolués (découpage en fonction par exemple). La conséquence de cette situation est que les programmeurs de cartes à micro-circuit sont très rapidement intellectuellement liés au type de microprocesseur qu'ils connaissent bien. Donc il leur est peu facile de concevoir des nouvelles applications quand le microprocesseur qu'ils connaissent n'est pas apte à les exécuter, par exemple parce que son jeu d'instructions n'a pas été prévu pour cela. Il leur est alors très difficile de changer leurs habitudes et de devenir aussi habiles et expérimentés avec un nouveau microprocesseur qu'ils l'étaient avec un précédent microprocesseur. En outre, même la bonne connaissance du jeu d'instructions de plusieurs microprocesseurs ne peut pas donner à un programmeur une efficacité de travail qu'il aurait s'il écrivait ses programmes dans un langage évolué, plus puissant et aussi connu par beaucoup d'autres programmeurs. Ainsi si une application est écrite pour un microprocesseur donné, et si après cette écriture on décide d'utiliser un autre microprocesseur que celui pour lequel elle a été écrite et mise au point, on doit tout recommencer. Ceci est une perte de temps et d'argent. Pour résoudre ces problèmes, dans l'invention, on a organisé le travail du microprocesseur d'une façon différente. Premièrement on utilise un langage évolué de programmation de type connu. Deuxièmement on utilise un compilateur de ce langage évolué de programmation pour produire, à partir d'un programme d'application écrit dans ce langage évolué, un programme en un langage intermédiaire. Ce langage intermédiaire sera un standard pour tous les microprocesseurs possibles. Cependant les instructions de ce programme intermédiaire ne sont pas exécutables par aucun des microprocesseurs, pas plus que les instructions du programme en langage évolué. On munit alors, dans chaque carte, le micro-circuit d'un programme interpréteur de commande.Un tel programme interpréteur de commande est susceptible de produire une série d'instructions écrites dans le langage du microprocesseur de ce micro-circuit et donc directement exécutables par ce microprocesseur, pour une instruction reçue dans ce langage intermédiaire. Ce programme interpréteur n'est ni un programme de COMPILATION ni un programme d'ASSEMBLAGE. En effet, l'interpréteur produit les instructions exécutables par le microprocesseur au fur et à mesure qu'il reçoit des instructions en langage intermédiaire d'une part, mais surtout il ne produit une autre série d'instructions exécutables par ce microprocesseur que lorsque les précédentes instructions exécutables ont été exécutées. La production des instructions exécutables est donc faite en temps réel, au vol, au cours du déroulement du programme.Ces instructions directement exécutables n'existent donc dans le déroulement du programme que d'un manière éphémère, que lorsqu'elles sont exécutées. Elles ne sont pas stockées comme telles dans une mémoire du micro-circuit. La mise oeuvre de l'invention nécessite donc l'écriture, une fois pour toutes, d'un programme de compilation intermédiaire pour compiler des instructions, écrites en un langage évolué, en des instructions en langage intermédiaire. Il y a cependant autant de programmes de compilation intermédiaires qu'il y a de langages évolués. Actuellement le nombre des langages évolués couramment utilisés est de l'ordre d'une dizaine: c'est faible. Elle nécessite encore, mais là aussi une fois pour toute, l'écriture d'un programme interpréteur de commande pour le microprocesseur. Il y a cependant également autant de programmes interpréteurs qu'il y a de microprocesseurs différents. On peut dénombrer actuellement une dizaine de microprocesseurs de sorte que seuls une dizaine de programmes interpréteurs doivent être écrits. L'intérêt de l'invention est alors que n'importe quelle application, écrite en un langage évolué est alors exécutable sur n'importe quel microprocesseur. Sans l'invention c'est environ une dizaine de programmes exécutables qu'il aurait fallu écrire si on avait voulu être sûr de couvrir toutes les possibilités (pour 10 microprocesseurs). Ceci aurait été très long puisque l'écriture et la mise au point d'un programme directement exécutable est longue. Par ailleurs la place occupée en mémoire est plus faible avec l'invention. A titre d'exemple un programme de 1200 lignes écrit en langage C, compilé avec le compilateur C de BYTE CRAFT donne en langage exécutable par un microprocesseur un volume d'instructions égal à 8 kilooctets, ou 8 KO. Avec la compilation intermédiaire de l'invention, le programme intermédiaire correspondant occupe 4 KO. Sachant que le programme interpréteur occupe 2,1 KO en mémoire du micro-circuit, on a pu faire une économie de place d'environ 2 KO. Cette économie a été faite par ailleurs sans avoir à surveiller la suppression de partie d'instructions qui pouvaient, dans certains cas s'avérer inutiles. De plus, le programme essai qui sert de référence a d'abord été écrit en C-Byte (car plus contraignant d'un point de vue syntaxique, avec au maximum deux octets de déclaration). Ce langage C-Byte n'est pas particulièrement adapté aux systèmes portables. Ceci implique qu'en écrivant directement avec le compilateur de l'invention le gain serait encore supérieur. L'invention a donc pour objet un support portable à micro-circuit dont le micro-circuit est muni d'un microprocesseur, d'une mémoire programme (ROM), d'une mémoire de données (EEPROM), et de moyens de faire exécuter par le microprocesseur un programme contenu dans la mémoire programme, caractérisé en ce que la mémoire programme comporte une zone dans laquelle est stocké un programme interpréteur correspondant au microprocesseur, pour faire exécuter par ce microprocesseur, une à une, les instructions d'un programme intermédiaire d'application chargé dans la mémoire programme ou la mémoire de données, après les avoir individuellement fait interpréter par le programme interpréteur, afin par exemple que ce programme intermédiaire d'application agisse sur des données contenues dans la mémoire de données. L'invention sera mieux comprise à la lecture de la description qui suit et à l'examen des figures qui l'accompagnent. Celles-ci ne sont données qu'à titre indicatif et nullement limitatif de l'invention. Notamment la référence faite à un langage de programmation particulier doit se comprendre comme transposable aux autres langages de programmation disponibles. De même la citation d'un microprocesseur particulier ne peut être considérée comme une application de l'invention à ce seul microprocesseur. A titre d'exemple on joint ici, en un langage compréhensible par le microprocesseur de type ST8 de SGS-THOMSON Microelectronics, un programme interpréteur susceptible d'interpréter des instructions compilées en langage intermédiaire d'un programme d'application écrit dans un langage évolué par exemple C. Le compilateur de ce langage doit produire des instructions dont la liste est donnée à la dernière page de cette annexe. Cette liste renseigne donc sur le niveau d'achèvement qui doit être conduit avec le compilateur. Pour en faciliter la compréhension, le programme +r & est écrit en assembleur. Il doit cependant être assemblé selon le programme d'assemblage du microprocesseur décrit avant d'être exécutable. Les figures montrent: - Planche 1/8, figure 1 : un exemple de réalisation de l'invention; - Planche 2/8, figure 2 : les étapes nécessaires pour mettre en oeuvre le procédé de l'invention; - Planche 3/8, figure 3 : une représentation détaillée d'un mode de fonctionnement de l'invention. - Les planches 4/8 à 8/8 montrent, sous forme de court listage, des micro-instructions de l'interpréteur de l'invention. La figure 1 montre un exemple de réalisation de l'invention. Un support portable 1, ici sous forme de carte à puce est prévu pour être inséré dans un lecteur 2 en relation avec une machine 3. Dans un exemple de type connu la machine 3 est un distributeur automatique de billets de banque. N'importe quelle autre application est cependant envisageable. Dans cet exemple la machine 3 est même munie d'un clavier 4 sur lequel peut intervenir un utilisateur, le titulaire de la carte 1, pour choisir de faire exécuter une option ou une autre d'un programme d'utilisation de la carte. Le programme d'utilisation de la carte a été introduit dans une partie 5 d'une mémoire morte 6.Normalement l'utilisateur de la carte n'a pas les moyens de modifier le programme contenu dans la mémoire- 6. Ce programme y a été introduit par l'émetteur de la carte: la banque qui gère par ailleurs la machine 3. Ce programme a été écrit et mis au point par un programmeur de cette banque. Ce programme est destiné à permettre à l'utilisateur de la carte d'effectuer des opérations diverses: visualisation de compte, retrait d'argent liquide, passation d'ordre de virement, d'ordres d'achat en bourse ou autres. La carte 1 comporte un micro-circuit électronique comportant un microprocesseur 7, la mémoire programme 6, une mémoire de données 8, et une mémoire de travail 9. La mémoire 9 est une mémoire à accès aléatoire de type statique ou dynamique. Elle est ici volatile. Le micro-circuit comporte encore un bus de données 10 et un bus d'adresses 11 pour permettre à ces mémoires et à ce microprocesseur d'échanger des informations, des données, entre eux et aussi avec un organe d'entrée-sortie 12. L'organe d'entree-sortie 12 est capable de communiquer avec une interface correspondante dans le lecteur 2. La mémoire de travail 9 est nécessaire dans l'invention, et le microprocesseur doit être conçu pour pouvoir exécuter des instructions qui lui sont présentées depuis cette mémoire. Certains microprocesseurs néanmoins sont aptes à exécuter des instructions (directement compréhensibles par ces microprocesseurs) et mémorisées telles quelles dans des mémoires mortes associées à ces microprocesseurs. Ceci n'est pas le cas dans l'invention où, comme on le verra plus loin, les instructions concernant le programme d'application ne sont pas mémorisées sous une forme directement exécutable par le microprocesseur (bien que pour des raisons de mémorisation elles soient elles aussi composées en code binaire de 1 et de O). Les instructions du programme d'application, dans l'invention, doivent être interprétées, au moyen d'un programme d'interprétation contenu (sous une forme directement exécutable par le microprocesseur 7) par exemple dans une autre partie 13 de la mémoire morte 6. La mémoire 6 n'est pas nécessairement physiquement partagée en deux parties distinctes. Des adresses de différentes cellules de cette mémoire peuvent à elles seules permettre de distinguer le contenu de la mémoire 6: programme P représentant l'application, ou programme I représentant le programme interpréteur directement exécutable tel quel par le microprocesseur 7. De préférence, disposant du microprocesseur 7, on va faire interpréter par ce microprocesseur 7 les instructions du programme d'application. Il serait néanmoins possible de faire interpréter ces instructions par un autre microprocesseur, moins puissant mais physiquement voisin du microprocesseur 7 dans le micro-circuit de la carte 1. L'utilisation du même microprocesseur conduit à simplifier l'architecture du système comme on le verra plus loin. La figure 2 montre les étapes nécessaires pour mettre en oeuvre le procédé de l'invention. Premièrement, dans une phase 14 on écrit le programme de l'application comme si les problèmes cités relatifs aux cartes à micro-circuit étaient inexistants. On sait écrire de tels programmes: ils ne nécessitent que de connaître le fonctionnement de la machine 3 et les fonctions qu'on veut proposer aux utilisateurs. Dans un exemple de mise en oeuvre de l'invention le langage de programmation est pour l'essentiel le langage C, avec les options de programmation suivantes. En ce qui concerne la déclaration des variables, les types de données suivants sont autorisés: mode caractère "char" sur un octet, mode entier int sur deux octets, tableaux de caractères ou d'entiers à une dimension (avec un indice de 0 à n), et existence de pointeurs sur les caractères ou les entiers. En ce qui concerne les spécifications de classes de mémoires, on respecte celles déjà existantes, et on introduit les classes de stockages permettant d'accéder aux mémoires EPROM et/ou EEPROM. En ce qui concerne les expressions: toutes les expressions du langage C sont autorisées: notamment celles avec des opérateurs unaires et binaires, avec des opérateurs logiques et de décalage, et les expressions conditionnelles. En ce qui concerne les déclarations de fonction, elles sont toutes permises, avec passages de paramètres et allocation dynamique des variables locales Toutes les structures de contrôle sont également acceptées: notamment les IF, WHILE, FOR, SWITCH etc.... Par ailleurs le langage C comporte déjà des fonctions externes facilitant l'interface système-matériel pour gérer les aspects matériels de la carte, notamment la gestion de son organe d'entrée-sortie 12. Puis dans une étape 15 on compile le programme 14. Le programme compilateur qui permet la production du programme d'application sous sa forme intermédiaire est un programme compilateur avec pour principales caractéristiques les caractéristiques suivantes. Un compilateur est un programme qui prend en entrée un fichier source de type texte et qui correspond au programme que l'on veut compiler, et qui produit en sortie un fichier en un langage différent. Dans l'état de la technique le langage différent est le langage machine (directement exécutable par le micro-processeur) ou éventuellement de l'assembleur. Dans l'invention, c'est un langage intermédiaire. Le fichier programme source est constitué de déclarations de variables, de pragmas, et de fonctions.Les variables sont repérées par leur identificateur, les pragmas permettent d'affecter à certaines variables des adresses en mémoire et de spécifier des aspects liés au processeur lui-même. Par exemple, la ROM ou 1'EEPROM sont à telle ou telle adresse. On veut, par exemple, compiler un fichier source où on va trouver une instruction I = 14 Dans un premier temps on trouve dans ce fichier source la déclaration de la variable I. A cette variable I on attache ainsi un type de variable. Ce type est par exemple entier. Après la déclaration de variable on trouvera l'instruction I = 14; dans le programme ou dans une fonction. Après avoir vu la déclaration, cette séquence est correcte puisqu'on trouve un nom de variable I, un signe d'affectation = , une valeur ou une notation d'entier 14 et un point virgule ;. Le point virgule veut dire que l'instruction est terminée. Cela veut dire que derrière le "14" il n'y a pas un "+1" ou un "+2". C'est donc la fin de l'instruction. Après avoir analysé l'instruction et sa syntaxe, on va avec le programme compilateur produire une expression en langage intermédiaire.Pour cette instruction I = 14 , il faut empiler, mettre dans une pile, l'adresse de la variable I. On remarque qu'on connait l'adresse de la variable I parce que quand on a exploré les déclarations, à chaque fois qu'il avait une nouvelle déclaration on allouait une adresse particulière à chaque variable. Après avoir empilé l'adresse de I, on empile au-dessus la valeur 14. Puis on va prendre la valeur qui est en haut de la pile (14) et l'affecter à l'adresse qui est contenue dans la pile juste en-dessous de cette valeur (14) du haut de la pile. Dans le cas présent, cette expression de langage intermédiaire comporte donc les trois instructions empiler l'adresse de I, empiler la valeur (14) et mettre la valeur du sommet de la pile à l'adresse contenue dans le sous-sommet de la pile. Pour le compilateur de l'invention, on s'est attaché à produire environ 70 instructions élémentaires (69 exactement) du type de chacune des trois précédentes. On produit donc 70 instructions qui doivent être interprétées. Ce nombre, de type empirique, et induits par les considérations suivantes. Si le compilateur fait beaucoup de chose, la complexité des instructions différentes à exécuter par l'interpréteur va diminuer pour atteindre le langage machine. La place occupée en mémoire par l'interpréteur va diminuer (un peu). Le bilan global sera moins intéressant. Dans le cas contraire c'est le programme interpréteur lui-même qui occupera une place prohibitive dans la mémoire. La puissance du langage intermédiaire est ainsi déterminée empiriquement. C'est le fait d'expériences réussies et d'échecs.Si on a un langage intermédiaire qui est très puissant, on a automatiquement plus d'instructions dans le langage intermédiaire. Si on a plus d'instructions dans le langage intermédiaire on a automatiquement un interpréteur qui devient important. Puissant veut dire pour le compilateur d'être à même de gérer 3 ou 4 niveau de piles, les additionner, les multiplier. Il pourrait faire beaucoup plus de choses, On aurait alors un compilateur et un langage intermédiaire beaucoup plus puissant, mais il faudrait un interpréteur beaucoup plus long, parce qu'il y aurait beaucoup plus d'instructions qu'il faudrait traduire en langage du processeur réel. Donc le.gain en place mémoire que l'on aurait obtenu en essayant de trouver un langage intermédiaire, on le perdrait parce qu'on aurait un interpréteur trop long. Un langage intermédiaire très puissant traiterait directement les instructions en langage évolué. Si l'interpréteur fait tout, il va être gros et occuper de la place en mémoire Une fois que le programme intermédiaire est créé, on le stocke dans la partie 5 de la mémoire 6. Puis, ou au préalable, on écrit en une étape 17 un programme interpréteur de commande, spécifique du microprocesseur utilisé dans la carte. Ce programme est pour le microprocesseur de l'exemple de l'invention celui montré dans l'annexe A. Il a les caractéristiques suivantes. C'est un programme qui est écrit dans le langage machine du microprocesseur (bien qu'il soit en annexe sous sa forme assembleur). En entrée, l'interpréteur prend les expressions produites par le compilateur et les transforme en des instructions directement compréhensible par le microprocesseur. Son algorithme principal est simple. On prend la première expression trouvée, on l'exécute, et le pointeur de programme pointe sur l'expression suivante.Pour I = 14 on avait généré trois instructions : 1) empiler l'adresse de I ; 2) empiler la valeur 14 ; 3) affecter le sommet de pile à l'adresse contenue dans le sous-sommet de pile. L'interpréteur prend ici la première instruction qui s'appelle "EMPILER l'adresse de I". Empiler l'adresse de I consiste à mettre l'adresse de I sur une pile. L'instruction empilage de I est codée en langage machine sur trois octets. Le premier octet est le code opération, qui correspond à EMPILER. Le programme de l'interpréteur est tel que lorsqu'on trouve un "EMPILER", juste derrière, les deux octets qui suivent représentent l'adresse de l'endroit où on doit aller chercher ce qu'on doit empiler, et on sait donc qu'il faut mettre l'adresse sur la pile. Pour le microprocesseur décrit cela donne une instruction appelée DJSR EMPILER. Son code, qu'on retrouvera dans l'annexe A, est PUSH BASE DS. Il comporte trois instructions en langage machine : les instructions ici écrites en assembleur move b7,b4 jsr empiler et jmp décodage Le programme interpréteur de commande, directement exécutable par le microprocesseur 7, est ensuite chargé en une étape 18 dans la partie 13 de la mémoire 6. Pour le déroulement de l'application, le fonctionnement de l'invention est le suivant. Chaque instruction du programme intermédiaire (du programme stocké dans la partie 5 de la mémoire 6) est considéré comme une macro-instruction qui est décodée en une étape 19 à l'aide du programme interpréteur. Cette macro-instruction est équivalente à une suite de micro-instructions directement exécutables par le microprocesseur. Les micro-instructions de cette suite sont exécutées à la suite les unes des autres jusqu'à la dernière de la suite. Dès que la dernière de la suite est exécutée, par une étape 21, le déroulement du programme retourne au décodage d'une macro-instruction suivante du programme intermédiaire. La figure 3 permet de comprendre le fonctionnement de l'invention. Elle reprend les mêmes éléments que ceux déjà vus jusqu'ici. On a en plus fait figurer un compteur de programme 22 susceptible de permettre de traiter les unes après les autres les instructions IM du programme intermédiaire contenu dans la mémoire 5. Une telle instruction de ce programme intermédiaire est par exemple codée sur trois octets: un octet contenant un code instruction et deux octets contenant une adresse d'un opérande. Dans un premier temps le code instruction chargé en mémoire RAM 9 est envoyé à un décodeur d'instruction 23 du microprocesseur 7. L'interpréteur reconnaît le code instruction IM, en utilisant 1'ALU 24 et le décodeur d'instructions 23, à cause de la présence de signaux de contrôle relatifs à ce stade de l'exécution.Cette instruction est reconnue comme étant une instruction en langage intermédiaire. Dans ces conditions cette instruction décodée provoque le chargement dans la mémoire 9 de la série 27 des micro-instructions IP à IP + 4 dont la séquence a correspondu au décodage de l'instruction IM. Ce chargement est provoqué par l'envoi de l'instruction IM au décodeur 23, à 1'ALU 24 au sortir du décodeur 23, et dans une table d'adressage 241 au sortir de 1'ALU 24. La table 241 peut aussi être remplacée par un petit sous programme qui effectuerait le même travail. Le programme interpréteur comporte ainsi un certain nombre (69) de séries de micro-instructions, par exemple les séries 27 à 30. Au moyen d'un autre compteur d'instructions, on fait exécuter successivement les instructions IP à IP + 4.Ces instructions agissent sur l'opérande 25 contenu dans la mémoire de données 8 et dont l'adresse a été décodée par le registre d'adresse 26. Ces instructions IP à IP + 4 passent chacune à leur tour par le décodeur d'instruction 23 avant d'être envoyées à l'unité 24 où elles agissent sur l'opérande 25. On rappelle que les instructions IP à IP + 4 sont directement exécutables par l'unité 24. La fin d'une série de micro-instructions est marquée par la présence, dans chacune de ces séries d'instructions du programme interpréteur, d'une micro-instruction de fin ayant pour objet de provoquer des signaux de contrôle nécessaires pour passer à l'instruction en langage intermédiaire suivante. Cette pile de micro-instructions peut être facilement prise en compte par un microprocesseur 7 intégrant une gestion de pile. Elle peut aussi être simulée par les microprocesseurs n'ayant pas une telle gestion de pile directe. Cette fonction de pile est de préférence contenue dans le système d'exploitation du microprocesseur 7. Pour la réalisation des algorithmes cryptographiques, en particulier dans le cas des applications bancaires, l'utilisation de l'assembleur pourra être préférable car elle permet d'obtenir des temps d'exécution courts. Ceci n'interdit pas d'utiliser l'invention, il suffit dans le déroulement du programme de faire appel à des sous-programmes écrits alors en langage machine (après ASSEMBLAGE). Ces sous programmes peuvent aussi être chargés dans la partie 13 de la mémoire 6. REVENDICATIONS 1 - Support portable à micro-circuit dont le micro-circuit est muni d'un microprocesseur, d'une mémoire programme (ROM), d'une mémoire de données (EEPROM), et de moyens de faire exécuter par le microprocesseur un programme contenu dans la mémoire programme, caractérisé en ce que la mémoire programme comporte une zone dans laquelle est stocké un programme interpréteur correspondant au microprocesseur, pour faire exécuter par ce microprocesseur, une à une, les instructions d'un programme intermédiaire d'application chargé dans la mémoire programme ou la mémoire de données, après les avoir individuellement fait interpréter par le programme interpréteur, afin par exemple que ce programme intermédiaire d'application agisse sur des données contenues dans la mémoire de données. 2 - Support selon la revendication 1, caractérisé en ce que le programme interpréteur est un programme interpréteur susceptible de transformer un programme intermédiaire d'application compilé à partir d'un programme écrit dans un quelconque des langages de programmation suivant: langage C langage PASCAL langage COBOL langage BASIC langage ADA langage FORTRAN 3 - Support selon la revendication 1 ou la revendication 2, caractérisé en ce que la mémoire programme comporte en outre une zone contenant le système d'exploitation du microprocesseur. 4 - Support selon l'une quelconque des revendications 1 à 3, caractérisé en ce que le micro-circuit comporte des moyens pour élaborer temporairement les instructions mises en oeuvre par le microprocesseur et une mémoire de travail pour les stocker pendant leur existence éphémère. 5 - Procédé d'utilisation d'un support à micro-circuit dont le micro-circuit est muni d'un microprocesseur, d'une mémoire programme (ROM), d'une mémoire de données (EEPROM), et de moyens (RAM) de faire exécuter par le microprocesseur un programme contenu dans la mémoire programme ou la mémoire de données, caractérisé en ce qu'il comporte les étapes suivantes: on os charge un programme interpréteur de commandes dans la mémoire programme, - on charge un programme intermédiaire d'application dans la mémoire de données, - on fait interpréter au moins une instruction du programme intermédiaire par l'interpréteur de commande, - on fait exécuter par le microprocesseur cette instruction intermédiaire interprétée, - et on agit de même pour une instruction suivante du programme intermédiaire.