Merci à Marc-André Baillifard de Martigny qui a mis en forme ce texte avec OpenOffice. Le source est à disposition et vous pouvez accéder à Article.pdf sous le lien http://www.didel.com/picg/docfaeh/Article.pdf CALM - un langage d'assemblage commun pour microprocesseurs - 1 1 Introduction Les microprocesseurs existent d‚j… depuis plus de dix ans. Mais chaque microprocesseur possŠde son propre langage d'assemblage qui se diff‚rencie souvent consid‚rablement des autres. Ce fait est curieux car tous les microprocesseurs se ressemblent - au moins du point de vue fonctionel - trŠs fortement. Mais il y a quelques ann‚es encore, on ne pouvait pas d‚finir un langage d'assemblage uniforme, puisque chaque nouveau microprocesseur offrait des possibilit‚s entiŠrement nouvelles (op‚rations, modes d'adressages). Cette ‚volution se ralentissait lors de l'Šre des processeurs 16/32 bits car il ‚tait de plus en plus clair, ce qu'on attendait d'un microprocesseur moderne comme op‚rations et modes d'adressage. Pour cette raison, les micro-processeurs 16/32 bits ne se distinguent que de trŠs peu. On constate une sym‚trie croissante des modes d'adressage, des longueurs et des types de donn‚es … l'int‚rieur d'une instruction. Nous allons pr‚senter ici un des langages d'assemblage universels. Son nom est CALM (Common Assembly Language for Microprocessors, en fran‡ais: voir titre). 1.1 Qu'est-ce qu'est CALM ? CALM n'est pas un nouveau langage de programmation mais une autre notation des instructions. Une longue exp‚rience a montr‚ que les instructions et leurs notations d‚finies par CALM sont suffisantes pour d‚crire 95% des instructions d'un microprocesseur. Le problŠme est en fait assez simple: Il faut trouver (inventer) une notation qui, d'une part, exprime d'une maniŠre pr‚cise ce que fait le mat‚riel, et, d'autre part, ne devient pas trop compliqu‚e. CALM satisfait ces exigences dans presque tous les cas. Les exceptions sont dues … des op‚rations/modes d'adressage particuliers qui ne justifient pas une propre notation et sont not‚s d'une fa‡on simpli- fi‚e. Mais on peut expliquer ces cas par une suite d'instructions en notation CALM. Il ne faut donc pas un m‚ta-langage suppl‚mentaire. 1.2 Avantages d'un langage d'assemblage uniforme Actuellement, la programmation en assembleur est relativement embarassante et exige beaucoup de temps. Sans compter les exigences plus ‚lev‚es de la programmation en assembleur en soi, il y a des difficult‚s artificielles: Chaque fabricant utilise d'autres termes et d‚finit une notation sp‚cifique des instructions. Cette diff‚rente terminologie trouble l'utilisateur, ne permet pas des comparaisons de processeurs et rend inutilement difficile les changements de processeur. CALM d‚finit une syntaxe uniforme pour les instructions et les pseudo-instructions. Ainsi, CALM cr‚e une base commune pour la formation et la communication. Par exemple, un programme ‚crit en assembleur devient aussi pour ceux compr‚hensible qui ne connaissent pas le processeur pour lequel les instructions ont ‚t‚ ‚crit. De plus, une notation uniforme permet une comparaison objective de micro-processeurs. Des tests de comparaison sont ‚tablis d'une maniŠre plus efficace et plus simple puisque il ne faut pas apprendre un langage d'assemblage sp‚cifique au processeur. Ceci est surtout int‚ressant pour les micro-processeurs avec compatibilit‚ ascendante. Finalement, une syntaxe uniforme simplifie l'assembleur. On peut construire un assembleur qui est constitu‚ d'une partie principale ind‚pendante du processeur et d'une partie sp‚cifique au processeur. Dans la partie principale, les fonctions suivantes sont r‚alis‚es: traitement des symboles et des pseudo-instructions, ‚valuation des expressions, gestion des fichiers et des fonctions g‚n‚rales pour l'analyse de textes. Dans la partie sp‚cifique au processeur, la syntaxe et la s‚mantique d'une instruction, ainsi que les rŠgles pour g‚n‚rer le code objet sont d‚finies. CALM - un langage d'assemblage commun pour microprocesseurs - 2 1.3 Int‚rˆt de la programmation en assembleur On peut naturellement se demander si la programmation en assembleur est aujourd'hui encore utile. Mat‚riel et logiciel de plus en plus p‚rformants r‚priment continuellement la programmation en assembleur. Mais la programmation en assembleur reste dans certains cas irrempla‡able. Il faut citer les interfaces de mat‚riel, les optimisations de tout genre, micro-ordinateur (sur une puce), unit‚s microprogramm‚es, etc. Cependant, des sp‚cialistes s'occupent de plus en plus de ces travaux et mettent … disposition un appel de sous-programme au niveau de programmation sup‚rieur. Mais ne serait-il pas dans ces cas un avantage si l'on pouvait ‚crire ces quelques programmes en assembleur dans un langage d'assemblage uniforme? 1.4 D‚veloppement historique de CALM L'existence de CALM est due indirectement au 8080. Quand Intel sortait ce microprocesseur en 1974, le langage d'assemblage associ‚ semblait … beaucoup de gens trop primitif. De nombreuses propositions poussaient comme des champignons. CALM a ‚t‚ d‚fini … l'‚cole polytechnique f‚d‚rale de Lausanne. Il prouvait sa capacit‚, entre autres, par sa consistence et son utilit‚ fonctionelle … l'emploi pratique. Notamment, on pouvait exprimer aussi les autres processeurs 8 bits d'une fa‡on satisfaisante. Avec l'Šre des processeurs 16/32 bits, CALM a ‚t‚ ‚tendu et am‚lior‚. CALM d‚finissait avant tout une notation explicite pour les modes d'adressage et les indicateurs de donn‚es. En 1983, la version pr‚sente a ‚t‚ r‚dig‚ en collaboration avec DIN [1]. Parmi les efforts mondiaux de d‚finir un langage d'assemblage commun, il faut mentionner le groupe de travail IEEE P694. Ce groupe commen‡ait son travail en 1977 et publiait en 1984 la dix-huitiŠme version. Pendant un certain temps, il y a eu un ‚change d'exp‚rience intense avec CALM. Mais P694 restait trop fix‚ sur les architectures des microprocesseurs 4 et 8 bits et a surtout m‚connu les problŠmes d'une notation explicite des modes d'adressage. De plus, on est toujours d'avis qu'un langage d'assemblage doit ˆtre compos‚ de noms les plus courts possibles et qu'avec chaque instruction il ne faut indiquer que le strict minimum. 2 Instructions Une instruction ex‚cute une action r‚volue, d‚finie par le fabricant du microprocesseur. Le texte suivant illustre, comment une instruction est d‚compos‚e et comment ces parties s‚par‚es sont nomm‚es et quelle notation est utilis‚e. 2.1 Composition d'une instruction Une instruction est constitu‚e d'un code op‚ratoire et d'op‚randes. A cela il faut ajouter selon la complexit‚ des codes conditions, des indicateurs d'adresses et des indicateurs de donn‚es. Cette composition modulaire d'une instruction et l'ind‚pendance de la signification des parties s‚par‚es permettent des extensions quelconques. Mais ce concept impose que toutes les indications doivent ˆtre pr‚sentes mˆme pour les instructions avec possibilit‚s limit‚es. CALM d‚finit 49 instructions de base (fig. 1). Avec celles, on peut exprimer environ 95% des instructions d'un microprocesseur. Le reste est d– … des instructions sp‚ciales o— on r‚utilise le code op‚ratoire du fabricant, mais on utilise la notation CALM pour les op‚randes, le code condition, et les indicateurs d'adresses et de donn‚es. L'instruction MOVE d‚termine l'ordre source -> destination (de gauche … droite). Il faut aussi garder cet ordre pour les autres instructions, par exemple pour l'instruction SUB. CALM - un langage d'assemblage commun pour microprocesseurs - 3 Instructions de transfert MOVE source,destination transfŠre de la source vers la destination. PUSH source empiler (‚quivalent … MOVE source,{-SP}). POP destination d‚piler (‚quivalent … MOVE {SP+},dest.). CONV source,destination effectue une conversion de type de donn‚es. CLR destination met … z‚ro l'op. de dest.(= MOVE #0,dest.). SET destination init. l'op. de dest.:1s (= MOVE #-1,dest.). EX op‚rande1,op‚rande2 echange les deux op‚randes. SWAP sourcedestination echange les deux moiti‚s de l'op‚rande. Instructions arithm‚tiques ADD source,sourcedestination additionne deux op‚randes. source1,source2,destination ADDC voir ADD additionne deux op‚randes et l'indicateur C SUB voir ADD soustrait le premier op‚rande du second op. SUBC voir ADD 2nd op. - 1er op. - l'indicateur C. ACOC voir ADD add. le compl. … un du 1er op., 1 et l'ind. de report C au 2nd op. L'op‚ration eff. est ‚q. … SUBC mais les ind. sont modif. autre. NEG sourcedestination calcule le compl‚ment vrai (compl. … 2 ou source,destination soustr. de 0) de l'op‚rande de source. NEGC voir NEG calc. le compl. vrai avec l'ind. de report C, c.….d. soustrait l'op. et C de z‚ro. MUL source,sourcedestination multiplie les deux op. de source. source1,source2,destination Si l'op‚rande de dest. n'est pas explicitement pr‚cis‚ par sa taille de donn‚es il n'est pas clair si la taille de l'op. de destination est simple ou double. DIV diviseur,dividendequotient divise le 2nd op. par le premier. diviseur,dividende,quotient diviseur,dividende,quotient,reste INC sourcedestination incr‚mente l'op‚rande de un. DEC sourcedestination d‚cr‚mente l'op‚rande de un. COMP source1,source2 compare le second op‚rande au premier. C'est la mˆme op‚ration que SUB, mais il n'y a pas de r‚sultat g‚n‚r‚ (uniquement les indicateurs sont mis … jour). CHECK limite_inf,limite_sup,source contr“le une val. contre 2 lim. Instructions logiques AND source,sourcedestination effectue un ET logique bit … bit des source1,source2,destination deux op‚randes de source. OR voir AND effectue un OU inclusif bit … bit des 2 op. XOR voir AND effectue un OU exlusif bit … bit des 2 op. NOT sourcedestination inverse chaque bit de l'op‚rande de source source,destination (compl‚ment … un). Instructions de d‚calage SR sourcedestination eff. un d‚c. de l'op. de source … droite. amplitude,sourcedestination Le MSB est remplac‚ par un 0 et amplitude,source,destination l'ind. de report C par le LSB. ASR voir SR effectue un d‚c. de l'op. de source avec bit de signe … droite. Le MSB est conserv‚ et l'ind. de report C est rempl. par LSB. SL voir SR eff. un d‚c. de l'op. de source … gauche. Le LSB est rempl. par 0 et C par le MSB. ASL voir SR effectue un d‚calage de l'op. de source … gauche. Id. … SL mais V mod. autrement. RR voir SR effectue une rot. de l'op. de source … droite. MSB et C sont rempl. par le LSB. RRC voir SR effectue une rot. de l'op. de source avec C … droite. Le MSB est rempl. par C et celui-ci par le LSB. RL voir SR mˆme effet que RR mais … gauche. RLC voir SR mˆme effet que RRC mais … gauche. Fig. 1. Instructions CALM (1Šre partie) CALM - un langage d'assemblage commun pour microprocesseurs - 4 Instructions de test TEST source teste le signe et la valeur (si z‚ro) de source:adresse_de_bit l'op. de source. Lors d'un adr. de bit, uniquement l'ind. de nullit‚ Z est modifi‚. TCLR sourcedestination teste et met … z‚ro le(s) bit(s) d'op. sourcedestination:adresse_de_bit TSET voir TCLR teste et met … un le(s) bit(s) d'op‚rande. TNOT voir TCLR teste et invertit le(s) bit(s) d'op‚rande. Instructions de commande du flux d'instructions JUMP adresse_de_saut saute … l'adresse indiqu‚e. JUMP,cadresse_de_saut saute … l'adr. si la cond. est satisfaite. DJ,c sourcedestination,adresse_de_saut d‚c. le 1er op. de 1 et saute … l'adr. donn‚e par le 2nd op. si c. SKIP,c saute l'instr. suiv. si la cond. est vraie. CALL adresse_de_saut appel de sous-prog. (sauve l'adr. de retour CALL,cadresse_de_saut sur la pile et saute … l'adresse indiqu‚e). RET retour de sous-programme (saute … l'adresse RET,c r‚cup‚r‚e de la pile). TRAP expression appel de sous-programme sp‚cial. TRAP,c WAIT attend sur une interruption. HALT arrˆte le processeur jusqu'… ce qu'il soit r‚initialis‚ par un signal externe. RESET r‚initialise les p‚riph‚riques. NOP instruction vide. ION permet des interruptions. IOFF interdit des interruptions. Instructions sp‚ciales Toutes les instructions sp‚ciales (p.ex.: DAA, LINK, FFS). Fig. 1. Instructions CALM (2Šme partie) 2.2 Code op‚ratoire Le code op‚ratoire exprime l'op‚ration effectu‚e. Le code op‚ratoire est un nom d‚riv‚ d'un verbe anglais. Dans certains cas, on utilise aussi les abr‚viations et leurs combinaisons. En g‚n‚ral, on retrouve les codes op‚ratoires d‚finis par CALM aussi dans les langages d'assemblage des microprocesseurs individuels. Les seules diff‚rences concernent les codes op‚ratoires dans lesquels le fabricant anticipe un mode d'adressage (p.ex. BRANCH, LEA, XLAT, ADDI). Par contre, on rencontre trŠs souvent des diff‚rences orthographiques mineures: COMP au lieu CMP, MOVE au lieu MOV, etc. 2.3 Op‚randes Un op‚rande indique qui (registre, location m‚moire, etc.) participe … une op‚ration et comment on accŠde … l'information. L'op‚rande adresse cette information par l'interm‚diaire d'une notation d‚finie. Cette notation doit suffir … exprimer tous les modes d'adressage possibles (et utiles). Voir le chapitre 3. Cette notation ind‚pendante du processeur est jusqu'… pr‚sent unique. Il suffit pour s'en convaincre de comparer les notations du fabricant des modes d'adressage de quelques microprocesseurs. Un microprocesseur a g‚n‚ralement un nombre limit‚ de modes d'adressage. Ceci conduit … une courte notation qui simplifie le travail de l'assembleur, mais un concept d'adressage n'est pas pr‚sent‚. Une notation p‚cise est aussi n‚cessaire parce qu'on ne peut plus int‚grer le mode d'adressage dans le code op‚ratoire. En plus, l'accumulateur n'est plus le centre unique d'un microprocesseur comme autrefois. Et des modes d'adressage de plus en plus p‚rformants ont besoin d'une indication pr‚cise. 2.4 Code condition Un code condition exprime l'‚tat d'un indicateur ou la combinaison d'‚tats d'indicateurs. Les indicateurs sont modifi‚s par des CALM - un langage d'assemblage commun pour microprocesseurs - 5 instructions. Si les instructions elles-mˆmes d‚pendent des indicateurs, on ajoute un code condition s‚par‚ par une virgule au code op‚ratoire. Les codes conditions sont des noms compos‚s usuellement de 2 lettres (fig. 2). g‚n‚ral: EQ ‚gal NE non ‚gal BS bit … un BC bit … z‚ro CS report … un CC report … z‚ro VS d‚passement … un VC d‚passement … z‚ro MI moins, n‚gatif PL plus, positif aprŠs comparaison non sign‚e: LO inf‚rieur LS inf‚rieur ou ‚gal HI sup‚rieur HS sup‚rieur ou ‚gal aprŠs comparaison arithm‚tique: LT plus petit que LE plus petit que ou ‚gal GT plus grand que GE plus grand que ou ‚gal divers: PE parit‚ paire PO parit‚ impaire NV jamais AL toujours NMO non ‚gal … -1 Quelques codes conditions ‚quivalents: EQ=BC, NE=BS, CS=LO, CC=HS. Fig. 2. Codes conditions Les indicateurs sont usuellement m‚moris‚s dans le registre d'indicateurs F (fig. 3). D'autres indicateurs (I, S, T) peuvent exister et sont souvent m‚moris‚s dans un registre d'‚tat sp‚cial S. lettre/fonction utilisation C report additionneur binaire et d‚calage H report auxiliaire report 4 bits (unique. pour les proc. 8 bits) L lien unique.si jamais utilis‚ comme ind. de report N signe … un: MSB … un (r‚sultat n‚gatif) V d‚passement … un: d‚p. de capacit‚ pour des nombr. arith. Z z‚ro … un: r‚sultat nul I interruption … un: interruption active (permise) S superviseur … un: mode superviseur actif T tra‡age … un: mode de tra‡age actif Fig. 3. Indicateurs Les noms des codes conditions sont souvent identiques avec ceux des fabricants. Seulement la maniŠre avec laquelle ils sont ajout‚s au code op‚ratoire est diff‚rente. Chez les fabricants, le code condition est directement concat‚n‚ avec le nom du code op‚ratoire (une lettre). La notation de CALM est plus favorable, car un code op‚ratoire quelconque peut ˆtre combin‚ avec un code condition quelconque et on peut distinguer les deux informations clairement (fig. 4). JUMP,NE adresse_de_saut RET,LO CALL,CS adresse_de_saut DJ.16,NE CX,adresse_de_saut SKIP,LO DJ.16,NMO D0,adresse_de_saut Fig. 4. Exemples avec des codes conditions 2.5 Indicateurs de donn‚es Les indicateurs de donn‚es ne sont devenus n‚cessaire qu'avec les microprocesseurs 16/32 bits. Il faut indiquer la taille et le type des donn‚es transf‚r‚es avec ces microprocesseurs (fig. 5). U ou rien non sign‚ ou pas sp‚cifi‚ A arithm‚tique (repr‚sentation compl‚ment … deux) D d‚cimal (non sign‚, 2 chiffres par octet, BCD) F point flottant (format IEEE 754) O d‚placement (2n-1 biais) S avec signe (signe et valeur absolue) CALM - un langage d'assemblage commun pour microprocesseurs - 6 --- ---------- ->( . )------------------------------------------->[ nombre ]-> --- V V V V V V ^ ---------- ( U ) ( A ) ( D ) ( F ) ( O ) ( S ) | `-----------------------------------' Fig. 5. Indicateurs de donn‚es La taille de donn‚es indique le nombre de bits participant … une op‚ration. L'indicateur est sp‚cifi‚ soit avec le code op‚ratoire (taille de donn‚es valable pour tous les op‚randes suivants) soit avec chaque op‚rande individuellement. La taille de donn‚es est directement exprim‚e en bits. Un point est utilis‚ comme s‚parateur. Le type de donn‚es donne des informations sur les donn‚es utilis‚es. Cet indicateur est une lettre plac‚e entre le point et la taille de donn‚es. Si le type de donn‚es n'est pas indiqu‚ explicitement, on suppose qu'il s'agit de donn‚es non sp‚cialement traitables. Sinon, un indicateur de type de donn‚es est n‚cessaire pour d‚signer une unit‚ sp‚cifique (p.ex. additionneur BCD ou FPU): MOVE.32 R6,R1 ADD.D32 R5,R0 CONV R1.A16,R2.F64 Fig. 6. Exemples avec des indicateurs de donn‚es Les indicateurs de donn‚es sont aussi connus dans la notation de fabricant des instructions. Mais seulement la taille de donn‚es est not‚e s‚par‚ment. La taille de donn‚es est indiqu‚e par une lettre ajout‚e directement ou s‚par‚e par un point au code op‚ratoire. Mais l'utilisation de lettres reste limit‚e: d'une part, il n'y a pas que les tailles de donn‚es de 8, 16 et 32 bits, et, d'autre part, tout le monde ne sera jamais d'accord sur leur assignation. Aux types de donn‚es correspondent chez les fabricants diff‚rents codes op‚ratoires, par exemple IMUL pour MUL.A16, ABCD pour ADDX.D8, NEGL pour NEG.F64. 2.6 Indicateurs d'adresses Les indicateurs d'adresses sont devenus de plus en plus indispensables avec les possibilit‚s d'adressage croissantes. Une adresse est compos‚e plus souvent de sous-adresses qui n'ont pas la taille d'adresse entiŠre. Il faut donc indiquer la taille de ces sous-adresses et pr‚ciser comment il faut les ‚tendre … la taille d'adresse entiŠre. Tous ces informations sont fournies par les indicateurs d'adresses. Le programmeur peut bien comprendre sur papier ce qui se passe dans le microprocesseur, c.….d. comment une adresse est construite. Il peut ainsi indiquer … l'assembleur le mode d'adressage … choisir. U ou rien non sign‚, extension de z‚ro A arithm‚tique, extension de signe R rel., valeur cod‚e ajout‚e avec ext. de signe au PC ---------- --- -------->--------->[ nombre ]------->( ^ )---> | ^ ---------- ^ --- | --- | | |->( A )---------------------' | --- | |->( R )-| | --- | `->( U )-' --- Fig. 7. Indicateurs d'adresses Un indicateur d'adresses contient une taille d'adresses et un type d'adresses (fig. 7). La taille d'adresses indique le nombre de bits fourni par une sous-adresse. La taille d'adresses est aussi indiqu‚e en bits. Un accent circonflexe est utilis‚ comme s‚parateur. Un indicateur d'adresses est plac‚ devant une sous-adresse (fig. 8). CALM - un langage d'assemblage commun pour microprocesseurs - 7 JUMP 32^adresse_de_saut CALL A16^adresse_de_saut JUMP,NE R8^adresse_de_saut MOVE.32 32^{A0}+A16^{D0}+A8^d‚placement,D1 MOVE.16 32^{A5}+R8^‚tiquette,D4 Fig. 8. Exemples avec des indicateurs d'adresses Le type d'adresses indique comment l'adresse est interpr‚t‚e. Il distingue l'adressage relatif ou absolu. Si en plus, une adresse ne fournit pas la taille d'adresses entiŠre, il faut indiquer le type d'extension … la taille d'adresses entiŠre. Pour l'adressage absolu, une extension peut se faire avec ou sans signe. Pour l'adressage relatif, le compteur d'adresse est ajout‚ au d‚placement ‚tendu de signe. Les indicateurs d'adresses existent aussi chez les langages d'assemblage des fabricant. Cependant, ils sont difficilement reconnaissables … cause de leur syntaxe non uniforme. Les diff‚rentes tailles d'adresses sont souvent indiqu‚es par des pr‚fixes ou des suffixes (p.ex.: LBRA, BRA.S, d‚pl(A0,D3.L), BNE ETIQUETTE:W). Les types d'adresses sont indiqu‚s par des codes op‚ratoires ou des caractŠres sp‚ciaux (p.ex.: BSR, ETIQUETTE(PC), @ETIQUETTE). On peut d'ailleurs constater avec satisfaction, que seulement les instructions de saut diff‚rencient les modes d'adressage relatif et absolu par deux codes op‚ratoires diff‚rents (BRANCH et JUMP). Mais cette distribution du sens d'une instruction sur diff‚rentes parties d'une instruction complique et empˆche en fin de compte des extensions. 3 Notation des modes d'adressage Selon le texte pr‚c‚dent, il est primordial de formuler des rŠgles claires pour indiquer explicitement un mode d'adressage. Pour cela, le programmeur a … l'esprit un modŠle simplifi‚ du processeur qui contient principalement la structure des registres et l'architecture g‚n‚rale des locations m‚moire. 3.1 Registres et locations m‚moire Les registres et les locations m‚moire sont constitu‚s d'un certain nombre de bits. Les multiples de 8 bits (= 1 octet) sont usuels chez les microprocesseurs. Ainsi, on obtient des tailles de registre de 8, 16 et 32 bits. Les locations m‚moire successives sont num‚rot‚es et on appelle leur num‚ro adresse. Si un mot de 16 bits est plac‚ dans deux locations m‚moire successives, deux ordres d'octets diff‚rents existent selon le microprocesseur (fig. 9). 7 0 7 0 ---------- ---------- [ octet ] 0 [ octet ] 0 ---------- ---------- [ ] [ ] .... .... ordre d'octet:[ ] ordre d'octet: [ ] ---------- ---------- poids faible [ mot ] n poids fort [ mot ] n - 16 - - 16 - poids fort [ bits ] n+1 poids faible [ bits ] n+1 ---------- ---------- [ ] [ ] .... .... Fig. 9. Diff‚rents ordres d'octet Si l'on adresse une suite d'octet par bit, l'ordre d'octet avec l'octet du poids fort en premier s'avŠre d‚favorable car les bits sont num‚rot‚s diff‚remment. En plus, la num‚rotation des bits dans un registre est diff‚rente de celle dans une suite de locations m‚moire. CALM - un langage d'assemblage commun pour microprocesseurs - 8 3.2 Espaces d'adressage On peut voir les registres et les locations m‚moire faisant partie d'un espace d'adressage de registres ou d'espace m‚moire. L'espace d'adressage de registres contient souvent un petit nombre de locations m‚moire, mais est directement int‚gr‚ sur la puce du microprocesseur. Ainsi, le temps d'accŠs est court. Mais on ne parle pas de locations m‚moire mais plut“t de registres, parce que leur nombre est faible et ils b‚n‚ficient d'une situation technique particuliŠre. En plus, chaque registre re‡oit un nom r‚serv‚. Si possible, les noms de registre du fabricant sont repris. Sinon, seulement les symboles cit‚s … la fig. 10 sont r‚serv‚s en CALM. PC compt. d'adr. au moment de l'ex‚c. du prog. (Program Counter) SP pointeur de pile (Stack Pointer) F registre d'indicateurs arithm‚tique (Flags) S registre d'‚tat (System, Status) APC valeur du compteur d'adresse de l'assembleur au d‚but de l'instruction dans laquelle se trouve APC TRUE -1 (tous les bits … 1) FALSE 0 (tous les bits … 0) Fig. 10. Symboles r‚serv‚s et pr‚d‚finis L'espace m‚moire par contre est trŠs grand et est construit … l'ext‚rieur. Les locations m‚moire sont num‚rot‚es et peuvent obtenir des symbols d‚finis par l'utilisateur. Quelques microprocesseurs peuvent adresser d'autres espaces d'adressage: entr‚e/sortie et donn‚es. Afin de pouvoir dinstinguer ces espaces d'adressage de l'espace m‚moire, on place un signe dollar pour l'espace d'adressage d'E/S et un pourcent pour l'espace d'adressage de donn‚es devant l'expression d'adresse (fig. 11). MOVE B,A registre -> registre MOVE ADMEMOIRE,A espace m‚moire -> registre MOVE $ADENTREE,A espace d'adressage d'E/S -> registre MOVE %ADDONNEES,A espace d'adressage de donn‚es -> registre Fig. 11. Exemples: espaces d'adressage 3.3 Adressage direct Comme nous avons vu auparavant, les registres et les locations m‚moire sont constitu‚s d'un certain nombre de bits. Les ‚tats de ces bits repr‚sente un mot binaire qu'on appelle contenu de ce registre ou de cette location m‚moire. Cependant, dans les langages d'assemblage on indique souvent uniquement le nom d'un contenu, alors qu'on se r‚fŠre au contenu de celui-ci. On dit: "incr‚mente D" au lieu: "incr‚mente le contenu du registre D". Cette r‚f‚rence implicite est toujours valable en CALM et pour tous les quatre espaces d'adressage mentionn‚s. On indique directement le nom r‚serv‚ du registre ou de l'adresse. Ceci est appel‚ adressage direct (fig. 12). ADD B,A contenu(B) + contenu(A) -> contenu(A) ADD ADMEMOIRE,A contenu(ADMEMOIRE) + contenu(A) -> contenu(A) ADD 16'1234,A contenu(16'1234) + contenu(A) -> contenu(A) Le second exemple est identique au troisiŠme si ADMEMOIRE = 16'1234. Fig. 12. Exemples: adressage direct 3.4 Adressage imm‚diat Le signe diŠze devant une constante, un symbole, ou une expression complexe, supprime la r‚f‚rence implicite et indique l'adresse construite imm‚diatement (et pas son contenu). Ceci est appel‚ addressage imm‚diat (fig. 13). Le diŠze correspond au signe de pointeur (^, @) dans les langages de haut niveau. ADD #16'1234,A 16'1234 + contenu(A) -> contenu(A) ADD #ADMEMOIRE+1,A ADMEMOIRE + 1 + contenu(A) -> contenu(A) JUMP ADMEMOIRE ADMEMOIRE -> contenu(PC) MOVE #ADMEMOIRE,PC ADMEMOIRE -> contenu(PC) Fig. 13. Exemples: adressage imm‚diat CALM - un langage d'assemblage commun pour microprocesseurs - 9 3.5 Adressage indirect Si l'on veut utiliser le contenu d'une adresse quelconque de nouveau comme adresse, il faut placer des accolades autour de l'expression d'adresse en question. Ceci est appel‚ adressage indirect (fig. 14). ADD {HL},A contenu(contenu(HL)) + contenu(A) -> contenu(A) MOVE #16'1234,{HL} 16'1234 -> contenu(contenu(HL)) MOVE #16'1234,{ADMEMOIRE} 16'1234 -> contenu(contenu(ADMEMOIRE)) Fig. 14. Exemples: adressage indirect En fait, il n'y a pas de diff‚rence fonctionnelle si l'on utilise un registre ou une location m‚moire pour l'adressage indirect. Mais beaucoup de processeurs ne permettent qu'avec de registres un adressage indirect. 3.6 Adressages combin‚s Avec l'adressage direct, imm‚diat et indirect, nous avons d‚j… d‚fini les ‚l‚ments de base pour construire des adressages complexes quelconques. Les op‚rations possibles entre les diff‚rents termes d'adresse sont l'addition, la soustraction et la multiplication (fig. 15). MOVE #16'FE,{A0}+8 254 -> contenu(contenu(A0)+8) MOVE #10'98,{A0}-8 98 -> contenu(contenu(A0)-8) MOVE #8'177,{A0}*8 127 -> contenu(contenu(A0)*8) MOVE #2'1011,{A0}* 11 -> contenu(contenu(A0)*taille_de_donn‚es) MOVE R0,{{SB}+5}+3 cont.(R0) -> cont.(contenu(contenu(SB)+5)+3) MOVE {A0}+{D0}+10,A1 cont.(cont.(A0)+cont.(D0)+10) -> cont.(A1) MOVE #{A0}+{D0}+10,A1 contenu(A0)+contenu(D0)+10 -> contenu(A1) Fig. 15. Exemples: adressages combin‚s Notez que l'adressage indirect est simplement une notation explicite de l'adressage direct, mais peut ˆtre appliquer sans limites. La r‚f‚rence implicite (c.….d. le contenu de l'adresse calcul‚e) est appliqu‚e … l'expression d'adresse entiŠre. Si un signe diŠze se trouve devant l'expression d'adresse entiŠre, cette r‚f‚rence implicite est annul‚e. 3.7 Adressages sp‚ciaux L'adressage relatif est en fait une notation plus courte d'un adressage combin‚ comme c'est illustr‚ … la fig. 16. Quelques modes d'adressage suppl‚mentaires ont pris une certaine importance et ont obtenu pour cela leur propre notation. Dans un adressage de bit, la premiŠre expression sp‚cifie l'adresse d'octet. L'expression aprŠs les deux-points est l'adresse de bit. L'adresse de bit z‚ro correspond au bit 0 dans l'octet adress‚. Si l'adresse d'octet pointe dans l'espace m‚moire, l'adresse de bit peut d‚passer l'octet adress‚ (aprŠs ou avant l'octet). notation description d‚signation MOVE R^ADRESSE,D0 MOVE {PC}+DEPLACEMENT,D0 adressage relatif MOVE {A0+},D0 MOVE {A0},D0 modif. automatique ADD #taille_de_donn‚es,A0 (incr‚mentation) MOVE D0,{-A0} SUB #taille_de_donn‚es,A0 modif. automatique MOVE D0,{A0} (d‚cr‚mentation) CLR D0:#1 met bit 1 … z‚ro dans D0 adressage de bit PUSH R1..R3|R5 PUSH R1 liste de registre PUSH R2 PUSH R3 PUSH R5 MOVE R0,R1:#1..#4 transfŠre bits 0 … 3 de liste de bit R0 … R1 (bits 1 … 4) Fig. 16. Exemples: adressages sp‚ciaux CALM - un langage d'assemblage commun pour microprocesseurs - 10 4 Pseudo-instructions Les pseudo-instructions sont des commandes … l'assembleur. Elles dirigent la g‚n‚ration de code, l'assemblage et le listage conditionnel, les macros, etc.. Chaque pseudo-instruction commence avec un point (fig. 17). Une ‚tiquette peut ˆtre plac‚e uniquement devant les pseudo-instructions .ASCII, .ASCIZ, .BLK, .FILL, .n et .STRING. L'ordre des octets dans les pseudo-instructions .16, .32, etc., d‚pend du processeur charg‚ (.PROC). Listage .TITLE chaŒne de caractŠres commence une nouv. page avec le titre. .CHAP chaŒne de caractŠres ins. le texte ind. dans le sous-titre. .END termine un programme source. .TEXT ignore jusqu'… .ENDTEXT les lignes suivant. qui sont copi‚es dans le fichier listage. .ENDTEXT termine .TEXT. .LIST expression permet le list. des lignes suiv. si l'exp. est vraie. On peut imbriq. les .LIST. .ENDLIST termine une section de listage condition. .LAYOUT d‚finit les param. pour l'asp.g‚n. du list. Assemblage .BASE expression d‚f. la nouv. base par d‚faut pour les nb. .START expression d‚finit l'adresse de d‚but. .EXPORT symbole1, symbole2, ...d‚finit les symboles export‚s. .IMPORT symbole1, symbole2, ...d‚finit les symboles import‚s. Compteur d'adresse .APC expression choisit un des compt. d'adr. de l'ass.(APC) .LOC expression ass. une nouv.val. au compt. de l'ass.(APC) .ALIGN expression aj. la val. de l'APC … la proch. adr. mult. .EVEN ajuste la val. de l'APC … une val. paire. .ODD ajuste la val. de l'APC … une val. impaire. .BLK.8 expression (nombre) additionne … l'APC le produit de la .BLK.8.16.32 expression taille des donn‚es par le nombre. Insertion de fichiers .INS fichier insŠre le fichier de source indiqu‚. .REF fichier insŠre la table des symboles mentionn‚e. .PROC fichier insŠre la description du proc. indiqu‚. G‚n‚ration de code .n expression, expression, ...insŠre la valeur donn‚e dans le .8.32 expression8, expression32, expression8, ... programme objet. .FILL.n expression (nombre), expression g‚n. nb. fois la val.ind. .ASCII "texte ascii" insŠre les codes ASCII des caractŠres imprimables dans l'objet. .ASCIZ "texte ascii" = .ASCII, aj. le code ASCII nul … la fin. .STRING "texte ascii" = .ASCII, insŠre la long.(8 bits) au d‚but. Assemblage conditionnel et macros .IF expression les lignes d'instr. suiv. jusqu'au .ELSE ou .ENDIF corres. sont ass. si l'exp. est vraie (TRUE). Peuvent ˆtre imbriqu‚es. .ELSE les lignes d'instr. suiv. jusqu'au .ENDIF sont ass. si l'exp. du .IF ‚tait faux. .ENDIF termine une section d'un .IF ou .ELSE. .MACRO nom,paramŠtre1,...commence la d‚finition d'une macro avec le nom de la macro et une liste fac. de param. .ENDMACRO termine la d‚finition d'une macro. .LOCALMACRO symbole1,... d‚clare les symb. locaux dans une macro. Fig. 17. Pseudo-instructions CALM 5 Utilisation de CALM - pas si facile Chaque nouveau langage de programmation a besoin de temps pour ˆtre accept‚. Mais contrairement aux langages de programmation de haut niveau, un langage d'assemblage commun d‚pend du processeur. CALM - un langage d'assemblage commun pour microprocesseurs - 11 5.1 Documentation La notation CALM des instructions d'un processeur est actuellement document‚e dans des dites cartes de r‚f‚rence. Dans ces cartes de r‚f‚rence se trouvent toutes les instructions d'un processeur sous une forme condens‚e. Mais des informations suppl‚mentaires comme codes machines, temps d'ex‚cution, particularit‚s, etc., d'un microprocesseur se trouvent uniquement dans la documentation du fabricant. Ainsi, l'utilisateur est oblig‚ de connaŒtre les deux notations. Comme aide, les d‚signations des codes op‚ratoires du fabricant sont aussi indiqu‚es dans les cartes de r‚f‚rence CALM. 5.2 Une notation CALM - plusieurs codes machines Les microprocesseurs modernes 16/32 bits ont plusieurs instructions qui sont 100% identiques. La notation CALM montre ceci d'une maniŠre exemplaire. Alors la question se pose: Quel code machine doit l'assembleur g‚n‚rer? Normalement, on laisse l'assembleur chosir le code le plus compact et ainsi le plus rapide. Sinon, les caract‚ristiques sont d‚termin‚es par les op‚randes. Le code machine r‚sultant d‚pend de la taille et du type de l'op‚rande, ainsi que des indicateurs d'adresses et de donn‚es additionnelles. 5.3 Assembleur Il est ‚vident qu'une programmation en CALM ne sert … rien si les outils correspondants (c.….d. assembleur, ‚diteur de liens) manquent. Actuellement, des assembleur CALM g‚n‚rant un code machine non translatable sont disponible auprŠs de l'auteur pour pratiquement tous les microprocesseurs. 5.4 Format d'objet La g‚n‚ration du code machine reste extrˆmement complexe, car pour chaque processeur n'existe pas seulement un propre format de code machine, mais aussi un format d'objet sp‚cifique. Cette diversit‚ empˆche pratiquement une g‚n‚ralisation de l'assembleur. Toujours est-il qu'un format d'objet uniforme a ‚t‚ d‚fini [2]. 6 Exemples Dans les exemples suivants, quelques instructions en notation CALM sont compar‚es … ceux du fabricant. Ce ne sont pas des programmes complŠts, mais plut“t un choix de vingt instructions des processeurs iAPX86, M68000 et NS32000. La notation d'assemblage d‚pend fortement des subtilit‚s de l'assembleur utilis‚. Nous avons utilis‚s ici les assembleurs des fabricants. 6.1 iAPX86 L'iAPX86 d'Intel est … cause de sa segmentation un des microprocesseurs les plus complexes. L'assembleur ASM-86 n‚cessite de nombreuses indications concernant ces segments (ASSUME, NEAR, d‚claration des variables, etc.). Pour cette raison, les exemples suivants sont incompl‚ts, car ces indications manquent ici. A cause de cette architecture, un langage d'assemblage ne peut pas ˆtre simple pour ce processeur (fig. 18). CALM indique avec chaque instruction le registre de segment utilis‚. De plus, on fixe avec un indicateur de donn‚es la port‚e des instructions de saut (… l'int‚rieur ou … l'ext‚rieur du segment courant). Une notation simplifi‚e est introduite pour le d‚calage automatique des registres de segments ([CS] pour {CS}*16). CALM - un langage d'assemblage commun pour microprocesseurs - 12 CALM Intel MOVE.16 #16'1000,BX MOV BX,1000H MOVE.16 AX,${DX} OUT DX,AX MOVE.16 #[ES]+NEXT,DX LEA DX,ES:NEXT MOVE.8 DL,BH MOV BH,DL MOVE.8 [DS]+DATA,AL MOV AL,DATA MOVE.16 [CS]+{SI},AX MOV AX,CS:[SI] MOVE.8 AH,F SAHF PUSH.16 SF PUSHF MOVE.8 [DS]+{BX}+{AL},AL XLAT CONV_TAB MOVE.32 [DS]+TARGET,DSBX LDS BX,TARGET CONV.A8.16 AX CBW INC.8 AL INC AL DIV.A16 CX,DXAX,AX,DX IDIV CX OR.16 #ERROR,[DS]+STATUS OR STATUS,ERROR RL.8 AL ROL AL,1 TEST.16 #MASK,AX TEST AX,MASK JUMP,LO R^LOW JB LOW CALL.32 20^ROUTINE JSR FAR ROUTINE DJ.16,NE CX,ADDRESS LOOP ADDRESS TRAP.32,VS INTO Fig. 18. Exemples: iAPX86 6.2 M68000 La notation des instructions du M68000 de Motorola ne diffŠre que de trŠs peu de CALM (fig. 19). Mais on voit particuliŠrement bien avec ce processeur que la compatibilit‚ ascendante est bien valable pour le code machine (malheuresement seulement partiellement), mais pas pour le langage d'assemblage: Les possibilit‚s d'adressage suppl‚mentaires du M68020 ont oblig‚s Motorola de changer la notation de quelques modes d'adressage. CALM Motorola MOVE.32 #16'1000,D1 MOVE.L #$1000,D1 MOVE.32 #A8^WERT,D0 MOVEQ #WERT,D0 MOVE.32 #{A6}+100,A3 LEA 100(A6),A3 MOVE.8 D4,D6 MOVE.B D4,D6 MOVE.8 {A4}+4,D2 MOVE.B 4(A4),D2 MOVE.16 {A0}+A16^{D4}+2,{A2}+32^{A3}+4 MOVE 2(A0,D4),4(A2,A3.L) MOVE.16 D0,F MOVE D0,CCR PUSH.16 SF MOVE SR,-(A7) PUSH.32 #TABLE PEA TABLE PUSH.32 D0..D3|D5 MOVEM.L D0-D3/D5,-(A7) CONV.A8.16 D4 EXT.W D4 INC.8 D1 ADDQ.B #1,D1 DIV.A16 #10,D6 DIVS #10,D6 OR.16 #MASK,{A4}+A16^{D4}-4 OR #MASK,-4(A4,D4.W) RL.32 #8,D4 ROL.L #8,D4 TCLR.8 {A0+}:D4 BCLR D4,(A0)+ JUMP,LO R^LOW BLO LOW CALL U^ROUTINE JSR ROUTINE DJ.16,NMO D0,ADDRESS DBRA D0,ADDRESS TRAP,VS TRAPV Fig. 19. Exemples: M68000 6.3 NS32000 En r‚alit‚ il s'agit ici d'une famille complŠte, appel‚e par National Semiconductors "NS32000 series". Elle consiste de trois membres (NS32032, NS32016 et NS32008) 100% compatibles qui se diff‚rencient que par la largeur du bus externe. Il faut surtout mentionner la sym‚trie parfaite des modes d'adressages (fig. 20). L'adressage relatif est permis partout et est cod‚ automatiquement. CALM - un langage d'assemblage commun pour microprocesseurs - 13 CALM NS MOVE.32 #16'1000,R1 MOVD H'1000,R1 MOVE.32 #A4^WERT,R0 MOVQD WERT,R0 MOVE.32 #{R6}+100,{SB}-20 ADDR 100(R6),-20(SB) MOVE.8 R4,R6 MOVB R4,R6 MOVE.8 {SB}+4,R2 MOVB 4(SB),R2 MOVE.16 {{FP}+2}+4,{SB}+{R0}*1+2 MOVW 4(2(FP)),2(SB)[R0:B] MOVE.8 R0,F LPRB R0,UPSR PUSH.16 SF SPRW PSR,TOS PUSH.32 #R^TABLE ADDR TABLE,TOS PUSH.32 R0..R3|R5 SAVE [R0,R1,R2,R3,R5] CONV R4.8,R2.32 MOVZBD R4,R2 INC.8 R1 ADDQB 1,R1 DIV.A32 #10,R6 QUOD 10,R6 OR.16 #MASK,{{SB}-2}+{R5}*8+4 ORW MASK,4(-2(SB))[R5:Q] RL.32 #-10,R4 ROTD -10,R4 TCLR {R0}+20:{{SB}+10}+4.A32 CBITD 4(10(SB)),20(R0) JUMP,LO R^LOW BLO LOW CALL U^ROUTINE JSR @ROUTINE AJ.32,NE #2,{R0}+4,ADDRESS ACBD 2,4(R0),ADDRESS TRAP,VS FLAG Fig. 20. Exemples: NS32000 7 Conclusions CALM est un langage d'assemblage commun qui se prˆte … tous les microprocesseurs, mais aussi pour les miniprocesseurs et les calculateurs. La notation CALM est orient‚e vers le futur puisqu'on peut l'‚tendre d'une fa‡on ponctuelle et fonctionelle. La s‚paration nette des diff‚rentes parties d'une instruction permet une adaptation individuelle … des processeurs les plus diverses. Des extensions sp‚cifiques au processeur sont toujours possibles. En plus, on comprend une instruction dans la notation CALM souvent mieux qu'aprŠs de longues pages d'explications. On a test‚ la notation CALM avec 24 processeurs pour voir si l'on peut exprimer tous les processeurs d'une maniŠre satisfaisante. Comme r‚sultat, des cartes de r‚f‚rence CALM ont ‚t‚ ‚tabli pour les processeurs suivants: Z80, 65x02, 680x, 6805, 6809, 8048, 8051, 808x, iAPXx86, NS32000, 680xx, etc. Nous avons essay‚ de montrer sur quelques pages les ‚l‚ments principaux de CALM. La programmation en assembleur en soi ne deviendra pas plus facile dans la notation CALM, mais elle sera plus compr‚hensible pour l'utilisateur, car elle est construite d'aprŠs de rŠgles logiques. 8 Bibliographie [1] DIN 66283, Allgem. Assemblierer-Sprache fr Mikroproz. CALM Norme nat. all., Beuth Verlag GmbH, CP 1145, D-1000 Berlin 30 [2] "The Microprocessor Universal Format for Object Modules", Prop. Stand.: IEEE P695 Working Group. IEEE Micro, 8.1983, p. 48-66. [3] Nicoud, J.D. and F„h, P. Common Assembly Language for Micro- processors CALM, Document interne. LAMI-EPFL, INF-Ecublens, CH-1015 Lausanne, Dec. 1986. English version of DIN 66283. [4] Nicoud, J.D. and F„h, P. Explanations and Comments, Related to the Common Assembly Language for Microprocessors. LAMI-EPFL. [5] Zeltwanger, H. "Genormte Assemblersprache fr Ps", ELEKTRONIK, 35Šme ann‚e (1986), no. 8, p. 66-71. [6] Nicoud, J.D. Calculatrices, Volume XIV du Trait‚ d'Electricit‚, Lausanne: Presses polytechniques romandes, 1983. [7] Nicoud, J.D. and Wagner, F. Major Microprocessors, A unified approach using CALM. North Holland, 1987. [8] Strohmeier, A. Le mat‚riel informatique, concepts et principes Lausanne: Presses polytechniques romandes, 1986. [9] F„h, P. "Die (Un-)Logik von Assemblersprachen", Elektroniker, 26Šme ann‚e (1987), no. 5, p. 97-100.